• 开发者技术支持-鸿蒙应用提取音视频元数据信息
    开发者技术支持-鸿蒙应用提取音视频元数据信息1.1 问题说明在鸿蒙应用开发中,开发者常需要从音视频资源中提取标题、时长、分辨率、专辑封面等元数据,以支撑媒体文件展示、播放等业务场景。本方案基于 AVMetadataExtractor 组件,提供了从本地沙箱、RawFile 资源或在线链接中提取音视频元数据的完整实现流程。1.2 原因分析· 媒体资源多样化音视频资源可能来自应用内置 RawFile、应用沙箱存储或在线链接,不同来源的资源需要适配不同的加载方式。 · 元数据类型差异音频资源包含专辑封面、歌手等信息,视频资源包含分辨率、时长等信息,需要针对性的提取逻辑。· 资源管理风险若未正确释放 AVMetadataExtractor 实例,会导致文件描述符泄漏,引发应用性能问题或崩溃。 · 异步操作复杂度元数据提取与封面获取均为异步操作,需要合理处理回调与 Promise 模式,避免出现空指针或时序错误。1.3 解决思路· 创建实例通过 createAVMetadataExtractor() 初始化元数据提取器实例。· 设置资源来源根据资源类型,选择 fdSrc(文件描述符)、dataSrc(自定义数据源)或 setUrlSource(在线链接)设置资源。· 提取元数据调用 fetchMetadata() 获取音视频基础元数据,如时长、分辨率等。· 获取附加资源对音频资源调用 fetchAlbumCover() 获取专辑封面,对视频资源调用 fetchFrameByTime() 获取缩略图。· 释放资源操作完成后调用 release() 销毁实例,避免资源泄漏。1.4 解决方案核心实现代码· 1. 创建 AVMetadataExtractor 实例import { media } from '@kit.MediaKit'; // 创建AVMetadataExtractor对象let avMetadataExtractor: media.AVMetadataExtractor = await media.createAVMetadataExtractor(); · 2. 设置资源来源方式 1:加载 RawFile 资源(fdSrc)import { common } from '@kit.AbilityKit';import { media } from '@kit.MediaKit'; let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;// 设置fdSrc,加载rawfile目录下的test.mp3avMetadataExtractor.fdSrc = await context.resourceManager.getRawFd('test.mp3'); 方式 2:加载沙箱资源(dataSrc)import { fileIo as fs, ReadOptions } from '@kit.CoreFileKit';import { common } from '@kit.AbilityKit';import { media } from '@kit.MediaKit'; const TAG = 'MetadataDemo';let context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;let rootPath: string = context.filesDir;let testFilename: string = '/test.mp3';let fd: number = fs.openSync(rootPath + testFilename).fd;let fileSize: number = fs.statSync(rootPath + testFilename).size; // 配置dataSrc数据源let dataSrc: media.AVDataSrcDescriptor = {  fileSize: fileSize,  callback: (buffer, len, pos) => {    if (!buffer || !len || !pos) {      console.error(TAG, 'dataSrc callback param invalid');      return -1;    }    let options: ReadOptions = { offset: pos, length: len };    let num = fs.readSync(fd, buffer, options);    return num > 0 && fileSize >= pos ? num : -1;  }};avMetadataExtractor.dataSrc = dataSrc; 方式 3:加载在线资源(setUrlSource)import { media } from '@kit.MediaKit'; let url: string = 'http://example.com/test.mp4';let headers: Record<string, string> = { "User-Agent": "HarmonyOS-App" };avMetadataExtractor.setUrlSource(url, headers); · 3. 提取元数据// Promise模式获取元数据let metadata = await avMetadataExtractor.fetchMetadata();// 获取视频宽高let videoWidth = metadata.videoWidth;let videoHeight = metadata.videoHeight;// 获取音频时长let audioDuration = metadata.duration; · 4. 获取专辑封面 / 视频缩略图import { image } from '@kit.ImageKit';@State pixelMap: image.PixelMap | undefined = undefined; // 获取音频专辑封面this.pixelMap = await avMetadataExtractor.fetchAlbumCover(); // 获取视频缩略图let timeUs: number = 0;let queryOption: media.AVImageQueryOptions = media.AVImageQueryOptions.AV_IMAGE_QUERY_PREVIOUS_SYNC;let param: media.PixelMapParams = { width: 300, height: 300 };this.pixelMap = await avMetadataExtractor.fetchFrameByTime(timeUs, queryOption, param); · 5. 释放资源// Promise模式释放资源await avMetadataExtractor.release();1.5 总结· 问题说明:音视频元数据提取是鸿蒙媒体类应用的基础能力,直接影响媒体文件的展示效率与用户体验。· 痛点总结:资源来源多样导致适配复杂,异步操作易引发时序问题,实例未释放会造成资源泄漏,且不同媒体类型的元数据提取逻辑存在差异。· 技术总结:通过 AVMetadataExtractor 统一处理本地与在线资源,结合 fdSrc/dataSrc/setUrlSource 适配不同场景,异步操作支持回调与 Promise 两种模式,最终通过 release() 保障资源安全。 · 避坑建议:禁止多个实例共用文件描述符,开发阶段需验证资源有效性,优先使用 Promise 模式简化异步逻辑,并确保在异常流程中也能释放实例。
  • 开发者技术支持-基于ArkTs实现同应用跨设备数据同步的功能
    开发者技术支持-基于ArkTs实现同应用跨设备数据同步的功能1.1 问题说明在鸿蒙跨设备应用开发中,用户期望在不同设备(如手机、平板、智慧屏等)上使用同一应用时,数据能够自动同步、状态保持一致。目前开发者在实现跨设备数据同步时,常面临设备发现、数据传输、冲突处理、状态同步等技术难点,缺乏统一、高效、可靠的同步方案,导致开发复杂度高、用户体验不一致。1.2 原因分析·  缺乏统一的跨设备数据同步框架,开发者需自行实现设备发现、通信与数据同步逻辑· 数据同步机制不标准化,不同设备间数据传输格式、同步策略不一致· 数据冲突处理机制缺失,多设备同时操作时易出现数据不一致问题1.3 解决思路· 设计一个统一的数据同步管理器,封装设备发现、数据传输、冲突解决等基础能力· 建立标准化的数据模型与同步协议,支持多种数据类型与同步策略· 实现基于操作日志的冲突解决机制,支持自动合并与用户决策1.4 解决方案步骤1: 创建统一数据同步管理器// DistributedSyncManager.tsimport { distributedData, deviceManager } from '@kit.ArkData'; export enum SyncMode {  REAL_TIME = 'real_time',  LAZY = 'lazy',  MANUAL = 'manual'} export enum DataType {  USER_PREF = 'user_preference',  APP_STATE = 'application_state',  BUSINESS_DATA = 'business_data'} export interface SyncItem {  key: string;  value: any;  type: DataType;  timestamp: number;  deviceId: string;  version: number;} export class DistributedSyncManager {  private kvManager: distributedData.KVManager;  private kvStore: distributedData.SingleKVStore | null = null;  private deviceList: deviceManager.DeviceInfo[] = [];  private readonly STORE_ID = 'cross_device_sync_store';   constructor(context: Context) {    this.initKVStore(context);    this.watchDeviceChange();  }   private async initKVStore(context: Context): Promise<void> {    const options: distributedData.KVManagerOptions = {      bundleName: context.applicationInfo.bundleName,      context: context    };    this.kvManager = distributedData.createKVManager(options);        const kvOptions: distributedData.Options = {      createIfMissing: true,      encrypt: false,      backup: false,      autoSync: true,      kvStoreType: distributedData.KVStoreType.SINGLE_VERSION,      schema: ''    };        this.kvStore = await this.kvManager.getKVStore(this.STORE_ID, kvOptions);        // 订阅数据变更    this.kvStore.on('dataChange', (data: distributedData.ChangeNotification) => {      this.handleDataChange(data);    });  }   // 设备状态监听  private watchDeviceChange(): void {    deviceManager.createDeviceManager().then((manager) => {      manager.on('deviceOnline', (device) => {        this.deviceList.push(device);        this.syncAllData(SyncMode.REAL_TIME);      });            manager.on('deviceOffline', (device) => {        this.deviceList = this.deviceList.filter(d => d.deviceId !== device.deviceId);      });    });  }   // 设置数据(自动同步)  async setData(key: string, value: any, type: DataType, syncMode: SyncMode = SyncMode.REAL_TIME): Promise<void> {    const syncItem: SyncItem = {      key,      value,      type,      timestamp: Date.now(),      deviceId: await this.getLocalDeviceId(),      version: await this.getNextVersion(key)    };     await this.kvStore?.put(key, JSON.stringify(syncItem));        if (syncMode === SyncMode.REAL_TIME) {      await this.syncToAllDevices(key, syncItem);    }  }   // 获取数据(自动合并最新版本)  async getData<T>(key: string): Promise<T | null> {    const entries = await this.kvStore?.getEntries(key);    if (!entries || entries.length === 0) return null;        // 选择版本号最高的数据    const latest = entries.reduce((prev, curr) => {      const prevItem: SyncItem = JSON.parse(prev.value as string);      const currItem: SyncItem = JSON.parse(curr.value as string);      return currItem.version > prevItem.version ? curr : prev;    });        return JSON.parse(latest.value as string).value;  }   private async syncToAllDevices(key: string, item: SyncItem): Promise<void> {    // 通过分布式数据框架自动同步    // 框架底层自动处理设备间传输  }   private handleDataChange(change: distributedData.ChangeNotification): void {    // 处理数据变更事件,通知UI更新    EventHub.emit('dataSyncChanged', {      key: change.key,      changeType: change.changeType    });  }}步骤2:实现数据同步UI组件// SyncStateComponent.ets@Componentexport struct SyncStateIndicator {  @LocalStorageProp('syncState') syncState: string = 'idle';  @LocalStorageProp('lastSyncTime') lastSyncTime: string = '';   build() {    Row() {      Image(this.getSyncIcon())        .width(16)        .height(16)        .margin({ right: 6 })            Text(this.getSyncText())        .fontSize(12)        .fontColor(this.getSyncColor())            if (this.lastSyncTime) {        Text(`最近同步: ${this.lastSyncTime}`)          .fontSize(10)          .fontColor(Color.Gray)          .margin({ left: 8 })      }    }    .padding(8)    .backgroundColor(Color.White)    .borderRadius(4)    .shadow({ radius: 2, color: '#10000000' })  }   private getSyncIcon(): Resource {    switch (this.syncState) {      case 'syncing': return $r('app.media.ic_sync');      case 'success': return $r('app.media.ic_sync_success');      case 'error': return $r('app.media.ic_sync_error');      default: return $r('app.media.ic_sync_idle');    }  }   private getSyncText(): string {    switch (this.syncState) {      case 'syncing': return '同步中...';      case 'success': return '已同步';      case 'error': return '同步失败';      default: return '未同步';    }  }   private getSyncColor(): ResourceColor {    switch (this.syncState) {      case 'syncing': return Color.Blue;      case 'success': return Color.Green;      case 'error': return Color.Red;      default: return Color.Gray;    }  }} // 数据绑定组件@Componentexport struct SyncDataText {  @LocalStorageProp('dataKey') dataKey: string = '';  @LocalStorageProp('defaultValue') defaultValue: string = '';  @State currentValue: string = '';   private syncManager: DistributedSyncManager = new DistributedSyncManager(getContext(this));   aboutToAppear() {    this.loadData();    // 监听数据变更    EventHub.on('dataSyncChanged', (data: any) => {      if (data.key === this.dataKey) {        this.loadData();      }    });  }   async loadData() {    const value = await this.syncManager.getData<string>(this.dataKey);    this.currentValue = value || this.defaultValue;  }   build() {    Text(this.currentValue)      .fontSize(16)      .onClick(async () => {        // 点击后可在所有设备同步更新        const newValue = await this.showEditDialog();        await this.syncManager.setData(          this.dataKey,          newValue,          DataType.USER_PREF        );      })  }}步骤3:在Ability中初始化同步服务// EntryAbility.etsexport default class EntryAbility extends Ability {  private syncManager: DistributedSyncManager | null = null;   onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {    this.syncManager = new DistributedSyncManager(this.context);    this.initDataSync();  }   private initDataSync(): void {    // 注册全局数据同步事件    EventHub.on('requestSync', (data: { key: string, value: any }) => {      this.syncManager?.setData(data.key, data.value, DataType.BUSINESS_DATA);    });     // 定时同步机制    setInterval(() => {      this.syncManager?.syncAllData(SyncMode.LAZY);    }, 30000); // 每30秒懒同步一次  }   onWindowStageCreate(windowStage: window.WindowStage): void {    // 窗口创建时恢复上次同步状态    this.restoreSyncState();  }   private async restoreSyncState(): Promise<void> {    const lastState = await this.syncManager?.getData('app_last_state');    if (lastState) {      // 恢复应用状态      AppStorage.setOrCreate('appState', lastState);    }  }}步骤4:业务页面中使用数据同步// TodoListPage.ets@Entry@Componentstruct TodoListPage {  @State todoList: TodoItem[] = [];  private syncManager: DistributedSyncManager = new DistributedSyncManager(getContext(this));   aboutToAppear() {    this.loadTodos();    // 监听其他设备的数据变更    EventHub.on('todoDataChanged', this.handleTodoUpdate.bind(this));  }   async loadTodos() {    const todos = await this.syncManager.getData<TodoItem[]>('user_todos');    this.todoList = todos || [];  }   async addTodo(content: string) {    const newTodo: TodoItem = {      id: Date.now().toString(),      content,      completed: false,      createTime: new Date().toISOString(),      deviceId: await this.syncManager.getLocalDeviceId()    };        this.todoList = [...this.todoList, newTodo];        // 同步到所有设备    await this.syncManager.setData(      'user_todos',      this.todoList,      DataType.BUSINESS_DATA,      SyncMode.REAL_TIME    );  }   // 处理来自其他设备的更新  handleTodoUpdate(update: { action: 'add' | 'update' | 'delete', data: TodoItem }) {    switch (update.action) {      case 'add':        this.todoList = [...this.todoList, update.data];        break;      case 'update':        this.todoList = this.todoList.map(todo =>          todo.id === update.data.id ? update.data : todo        );        break;    }  }   build() {    Column() {      // 同步状态指示器      SyncStateIndicator()        .margin({ top: 12 })            List() {        ForEach(this.todoList, (item: TodoItem) => {          ListItem() {            TodoItemComponent({ item: item })          }        })      }            // 添加待办输入框      TodoInput({ onAdd: this.addTodo.bind(this) })    }  }}   1.5 总结问题与痛点:跨设备数据同步实现复杂,缺乏统一框架,设备发现、数据传输、冲突处理等需开发者重复实现技术总结:通过构建统一数据同步管理器、标准化同步协议、声明式同步组件,实现了开箱即用的跨设备数据同步解决方案 效果总结:开发者只需关注业务数据模型,无需关心底层同步细节,大幅降低跨设备应用开发复杂度,提升数据一致性体验
  • 发者技术支持-基于鸿蒙ArkUI实现多模态文本智能换行适配效果
    开发者技术支持-基于鸿蒙ArkUI实现多模态文本智能换行适配效果 1.1 问题说明在鸿蒙跨设备应用场景中(如手机、平板、折叠屏切换,或分屏多任务模式),文本展示常面临适配难题:固定换行规则在屏幕尺寸 / 比例突变时,易出现单词截断、标点孤行、公式拆分等排版混乱;传统自适应换行仅依赖宽度计算,忽略文本类型(英文单词、中文语句、数学公式)差异,导致专业内容可读性下降;用户手动调整布局时,文本换行无法实时响应尺寸变化,影响跨设备使用体验。本案例基于 ArkUI 的多维度适配引擎与文本语义分析技术,实现智能换行效果,可根据设备尺寸、文本类型动态调整换行策略,自动规避排版缺陷,确保跨设备 / 分屏场景下文本展示的规范性与可读性。1.2 原因分析· 多场景尺寸适配复杂跨设备 / 分屏时屏幕宽高比、可用区域动态变化,需实时计算文本容器尺寸,传统固定换行阈值易导致适配失效。· 文本类型识别与处理难度高英文单词、中文语句、公式符号的换行规则差异大,单纯基于字符长度的换行逻辑会破坏语义完整性。· 实时响应性能压力屏幕尺寸变化时需重新计算换行布局,频繁重排易导致界面卡顿,尤其在长文本或复杂排版场景中更为明显。1.3 解决思路· 多维度尺寸监听机制通过 ArkUI 的布局变化监听接口,实时捕获屏幕尺寸、容器宽高、分屏比例等变化,动态更新换行计算阈值。· 文本语义分类与规则适配预设中文、英文、公式等文本类型识别模型,针对不同类型制定专属换行规则(如英文不截断单词、公式整体换行)。· 增量重排优化策略仅对尺寸变化影响的文本段落进行局部重排,而非全量刷新,结合缓存机制减少重复计算,提升响应速度。1.4 解决方案尺寸监听与阈值更新// 监听布局容器尺寸变化Column() {  Text(this.targetText)    .id("adaptText")    .onLayoutSizeChange((width: number, height: number) => {      this.containerWidth = width;      this.calcWrapThreshold(); // 重新计算换行阈值    })}// 计算不同文本类型的换行阈值calcWrapThreshold() {  switch (this.textType) {    case TextType.CHINESE:      this.wrapThreshold = this.containerWidth * 0.9; // 中文占容器90%宽度换行      break;    case TextType.ENGLISH:      this.wrapThreshold = this.containerWidth * 0.85; // 英文预留更多空间避免单词截断      break;    case TextType.FORMULA:      this.wrapThreshold = this.containerWidth; // 公式整体适配容器宽度,超宽时单独换行      break;  }} 智能换行逻辑实现// 文本分段与换行处理processTextWrap() {  const textSegments = [];  if (this.textType === TextType.ENGLISH) {    // 英文按单词拆分,避免截断    const words = this.targetText.split(" ");    let currentLine = "";    words.forEach(word => {      if (this.getTextWidth(currentLine + word + " ") <= this.wrapThreshold) {        currentLine += word + " ";      } else {        textSegments.push(currentLine.trim());        currentLine = word + " ";      }    });    textSegments.push(currentLine.trim());  } else if (this.textType === TextType.FORMULA) {    // 公式整体换行处理    const formulaWidth = this.getTextWidth(this.targetText);    if (formulaWidth > this.containerWidth) {      textSegments.push("\n" + this.targetText + "\n"); // 超宽公式单独占行    } else {      textSegments.push(this.targetText);    }  } else {    // 中文按字符长度换行,规避标点孤行    const chars = this.targetText.split("");    let currentLine = "";    chars.forEach(char => {      const punctuation = /[,。;:!?、""''()【】]/;      if (this.getTextWidth(currentLine + char) <= this.wrapThreshold) {        currentLine += char;      } else {        // 避免行尾为标点        if (punctuation.test(char)) {          textSegments.push(currentLine + char);          currentLine = "";        } else {          textSegments.push(currentLine);          currentLine = char;        }      }    });    textSegments.push(currentLine);  }  this.wrappedText = textSegments.join("\n");} 1.5 总结· 问题与痛点:跨设备 / 分屏时文本排版混乱;不同类型文本换行规则冲突;尺寸变化时换行响应滞后;专业内容(英文、公式)可读性差。· 技术要点:通过布局尺寸监听实现动态适配、文本语义分类制定专属规则、增量重排优化提升性能、文本宽度计算确保排版精准。· 实现效果:文本可根据设备尺寸、分屏比例实时调整换行方式,英文不截断单词、中文规避标点孤行、公式整体适配,跨设备切换时排版流畅过渡,无卡顿或错乱,大幅提升多场景文本阅读体验。· 适用场景:跨设备应用、分屏多任务工具、办公文档 APP、外语学习软件、包含公式的学术 / 技术类应用。
  • 开发者技术支持-基于鸿蒙ArkUI实现多模态文本智能换行适配效果
    开发者技术支持-基于鸿蒙ArkUI实现多模态文本智能换行适配效果 1.1 问题说明在鸿蒙跨设备应用场景中(如手机、平板、折叠屏切换,或分屏多任务模式),文本展示常面临适配难题:固定换行规则在屏幕尺寸 / 比例突变时,易出现单词截断、标点孤行、公式拆分等排版混乱;传统自适应换行仅依赖宽度计算,忽略文本类型(英文单词、中文语句、数学公式)差异,导致专业内容可读性下降;用户手动调整布局时,文本换行无法实时响应尺寸变化,影响跨设备使用体验。本案例基于 ArkUI 的多维度适配引擎与文本语义分析技术,实现智能换行效果,可根据设备尺寸、文本类型动态调整换行策略,自动规避排版缺陷,确保跨设备 / 分屏场景下文本展示的规范性与可读性。1.2 原因分析· 多场景尺寸适配复杂跨设备 / 分屏时屏幕宽高比、可用区域动态变化,需实时计算文本容器尺寸,传统固定换行阈值易导致适配失效。· 文本类型识别与处理难度高英文单词、中文语句、公式符号的换行规则差异大,单纯基于字符长度的换行逻辑会破坏语义完整性。· 实时响应性能压力屏幕尺寸变化时需重新计算换行布局,频繁重排易导致界面卡顿,尤其在长文本或复杂排版场景中更为明显。1.3 解决思路· 多维度尺寸监听机制通过 ArkUI 的布局变化监听接口,实时捕获屏幕尺寸、容器宽高、分屏比例等变化,动态更新换行计算阈值。· 文本语义分类与规则适配预设中文、英文、公式等文本类型识别模型,针对不同类型制定专属换行规则(如英文不截断单词、公式整体换行)。· 增量重排优化策略仅对尺寸变化影响的文本段落进行局部重排,而非全量刷新,结合缓存机制减少重复计算,提升响应速度。1.4 解决方案尺寸监听与阈值更新// 监听布局容器尺寸变化Column() {  Text(this.targetText)    .id("adaptText")    .onLayoutSizeChange((width: number, height: number) => {      this.containerWidth = width;      this.calcWrapThreshold(); // 重新计算换行阈值    })}// 计算不同文本类型的换行阈值calcWrapThreshold() {  switch (this.textType) {    case TextType.CHINESE:      this.wrapThreshold = this.containerWidth * 0.9; // 中文占容器90%宽度换行      break;    case TextType.ENGLISH:      this.wrapThreshold = this.containerWidth * 0.85; // 英文预留更多空间避免单词截断      break;    case TextType.FORMULA:      this.wrapThreshold = this.containerWidth; // 公式整体适配容器宽度,超宽时单独换行      break;  }} 智能换行逻辑实现// 文本分段与换行处理processTextWrap() {  const textSegments = [];  if (this.textType === TextType.ENGLISH) {    // 英文按单词拆分,避免截断    const words = this.targetText.split(" ");    let currentLine = "";    words.forEach(word => {      if (this.getTextWidth(currentLine + word + " ") <= this.wrapThreshold) {        currentLine += word + " ";      } else {        textSegments.push(currentLine.trim());        currentLine = word + " ";      }    });    textSegments.push(currentLine.trim());  } else if (this.textType === TextType.FORMULA) {    // 公式整体换行处理    const formulaWidth = this.getTextWidth(this.targetText);    if (formulaWidth > this.containerWidth) {      textSegments.push("\n" + this.targetText + "\n"); // 超宽公式单独占行    } else {      textSegments.push(this.targetText);    }  } else {    // 中文按字符长度换行,规避标点孤行    const chars = this.targetText.split("");    let currentLine = "";    chars.forEach(char => {      const punctuation = /[,。;:!?、""''()【】]/;      if (this.getTextWidth(currentLine + char) <= this.wrapThreshold) {        currentLine += char;      } else {        // 避免行尾为标点        if (punctuation.test(char)) {          textSegments.push(currentLine + char);          currentLine = "";        } else {          textSegments.push(currentLine);          currentLine = char;        }      }    });    textSegments.push(currentLine);  }  this.wrappedText = textSegments.join("\n");} 1.5 总结· 问题与痛点:跨设备 / 分屏时文本排版混乱;不同类型文本换行规则冲突;尺寸变化时换行响应滞后;专业内容(英文、公式)可读性差。· 技术要点:通过布局尺寸监听实现动态适配、文本语义分类制定专属规则、增量重排优化提升性能、文本宽度计算确保排版精准。· 实现效果:文本可根据设备尺寸、分屏比例实时调整换行方式,英文不截断单词、中文规避标点孤行、公式整体适配,跨设备切换时排版流畅过渡,无卡顿或错乱,大幅提升多场景文本阅读体验。· 适用场景:跨设备应用、分屏多任务工具、办公文档 APP、外语学习软件、包含公式的学术 / 技术类应用。
  • 开发者技术支持-基于ArkTs实现小艺建议的功能
     1.1 问题说明在鸿蒙应用开发中,集成类似“小艺建议”的智能推荐功能时,开发者需要处理用户上下文感知、动态内容推荐、卡片化展示以及与应用间的双向交互。当前在ArkTs中实现此类功能缺乏统一组件与数据流方案,导致开发效率低、交互体验不一致。1.2 原因分析·  缺乏统一的智能建议组件框架,每次开发需重复实现推荐逻辑与UI· 上下文获取与建议生成逻辑分散,难以维护和扩展1.3 解决思路· 设计一个通用建议卡片组件,支持多种推荐类型(如天气、日程、新闻、提醒等)· 实现基于用户行为与系统状态的建议生成与更新机制· 建立卡片与应用间的标准化双向通信通道,支持点击跳转、状态同步等功能1.4 解决方案步骤1: 创建通用建议卡片组件/** * 智能建议卡片组件 */// 建议类型枚举export enum SuggestionType {  WEATHER = 'weather',  CALENDAR = 'calendar',  NEWS = 'news',  REMINDER = 'reminder',  DEFAULT = 'default'} @Entry@Componentexport struct SmartSuggestionCard {  @LocalStorageProp('suggestionType') suggestionType: SuggestionType = SuggestionType.DEFAULT;  @LocalStorageProp('title') title: string = '';  @LocalStorageProp('content') content: string = '';  @LocalStorageProp('actionUrl') actionUrl: string = '';  @LocalStorageProp('icon') icon: string = '';  @LocalStorageProp('time') time: string = '';   aboutToAppear() {    // 可根据类型初始化数据  }   build() {    Column() {      Row() {        Image(this.icon)          .width(24)          .height(24)          .margin({ right: 12 })         Text(this.title)          .fontSize(16)          .fontWeight(FontWeight.Bold)          .layoutWeight(1)         Text(this.time)          .fontSize(12)          .fontColor(Color.Gray)      }      .width('100%')      .padding(12)       Divider()       Text(this.content)        .fontSize(14)        .padding({ left: 12, right: 12, bottom: 12 })        .width('100%')       // 可点击区域      Blank()        .height(40)        .onClick(() => {          this.handleCardClick();        })    }    .borderRadius(12)    .backgroundColor(Color.White)    .shadow({ radius: 6, color: '#20000000' })    .margin(8)  }   private handleCardClick() {    // 触发应用内跳转或执行建议动作    if (this.actionUrl) {      // 可通过路由器或事件机制通知应用    }  }}步骤2:实现建议生成与管理服务// SuggestionService.tsexport class SuggestionService {  private context: common.Context;   constructor(context: common.Context) {    this.context = context;  }   // 基于上下文获取建议  async fetchSuggestions(): Promise<SuggestionItem[]> {    const suggestions: SuggestionItem[] = [];        // 模拟获取天气建议    const weatherSuggestion = await this.getWeatherSuggestion();    if (weatherSuggestion) suggestions.push(weatherSuggestion);     // 获取日程建议    const calendarSuggestion = await this.getCalendarSuggestion();    if (calendarSuggestion) suggestions.push(calendarSuggestion);     return suggestions;  }   private async getWeatherSuggestion(): Promise<SuggestionItem | null> {    // 调用天气API或本地传感器    return {      type: SuggestionType.WEATHER,      title: '今日天气',      content: '晴,20°C,适宜出行',      icon: 'common/weather_sunny.png',      actionUrl: 'weather://detail',      time: new Date().toLocaleTimeString()    };  }   private async getCalendarSuggestion(): Promise<SuggestionItem | null> {    // 访问日历数据    return {      type: SuggestionType.CALENDAR,      title: '下一个会议',      content: '项目评审会 10:00-11:00',      icon: 'common/calendar.png',      actionUrl: 'calendar://meeting',      time: '今天 10:00'    };  }} export interface SuggestionItem {  type: SuggestionType;  title: string;  content: string;  icon: string;  actionUrl: string;  time: string;}步骤3:在EntryAbility中注册建议卡片与事件export default class EntryAbility extends Ability {  private suggestionService: SuggestionService;   onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {    this.suggestionService = new SuggestionService(this.context);    this.initSuggestionCard();  }   private initSuggestionCard(): void {    // 注册建议卡片更新监听    // 可通过EventHub或Preferences实现数据同步    const preferences = globalThis.getPreferences('suggestion_prefs');    preferences.on('change', (key: string) => {      if (key === 'suggestion_update') {        this.updateAllSuggestions();      }    });  }   private async updateAllSuggestions(): Promise<void> {    const suggestions = await this.suggestionService.fetchSuggestions();    // 更新UI或通知卡片刷新    AppStorage.setOrCreate('suggestionList', suggestions);  }}步骤4:应用内调用与数据同步// 在应用页面中调用建议服务import { SuggestionService } from '../services/SuggestionService'; @Entry@Componentstruct HomePage {  private suggestionService: SuggestionService = new SuggestionService(getContext(this));   onPageShow(): void {    this.loadSuggestions();  }   private async loadSuggestions(): Promise<void> {    const suggestions = await this.suggestionService.fetchSuggestions();    AppStorage.setOrCreate('suggestionList', suggestions);  }   build() {    Column() {      // 展示建议列表      ForEach(AppStorage.get('suggestionList') || [],        (item: SuggestionItem) => {          SmartSuggestionCard({            suggestionType: item.type,            title: item.title,            content: item.content,            icon: item.icon,            actionUrl: item.actionUrl,            time: item.time          })        }      )    }  }}    1.5 总结问题与痛点:在ArkTs中实现智能建议功能缺乏统一组件与数据流支持,开发重复度高、交互体验不连贯技术总结:通过封装通用建议卡片组件、构建建议生成服务、建立标准化通信机制,实现了一套可复用的智能建议框架。 效果总结:开发者只需关注具体建议内容与业务逻辑,无需重复实现UI与通信层,显著提升开发效率与用户体验一致性。支持动态更新、多场景适配,易于扩展新的建议类型。 
  • [技术干货] FAQ—CodeArts&AstroZero社区(问题求助)总结-2025.6
    首次使用华为云CodeArts时,开发者们总会遇到一些问题,小编针对大家遇到的问题做了分类总结,比如标准页面的表格数据问题、标准页面的表格数据问题、如何在标准页面的事件里面通过JS代码,获得下拉框选择的值?、标准页面的表格数据问题。憋着急!下面小编就来为大家一一解答遇到这几类问题时该如何快速解决,一步解决大家的困扰。华为云CodeArts系列产品参考手册:1、CodeArts:软件开发平台(CodeArts)官方手册:https://support.huaweicloud.com/devcloud/index.html软件开发平台(CodeArts)相关文章:https://bbs.huaweicloud.com/forum/thread-59032-1-1.html产品官方页面:https://devcloud.cn-north-4.huaweicloud.com/home2、CodeArts项目管理:项目管理(ProjectMan)官方手册:https://support.huaweicloud.com/projectman/index.html项目管理(ProjectMan)更新预览:https://support.huaweicloud.com/wtsnew-projectman/index.html产品官方页面:https://www.huaweicloud.com/product/projectman.html3、低代码平台Astro:应用魔方官方手册:https://support.huaweicloud.com/qs-appcube/appcube_02_0110.html操作指导:https://support.huaweicloud.com/appcube_video/index.html产品官方页面:https://appcube.cn-north-4.huaweicloud.com/studio/index.html#/projects/零代码官方手册:https://support.huaweicloud.com/usermanual-appcube/appcube_05_1404.html问题汇总:(以↓问题都是由官方人员解答后的文章链接)这里部署失败可以在哪里看到全量的日志吗?cid:link_0CodeArts IDE for java 运行报错cid:link_8codearts Ide 同一目录下多模块,Java智能助手无法识别cid:link_9CodeArts Ide SmartAssist启动失败cid:link_1Astro怎么动态设置工作流标题cid:link_10当前读和快照读有什么区别?cid:link_2MySQL的行级锁锁的到底是什么?cid:link_11InnoDB支持哪几种行格式?cid:link_12InnoDB的一次更新事务是怎么实现的?cid:link_13GaussDB轻量化部署,安装TPOPS平台失败cid:link_14mysql在InnoDB引擎下加索引,这个时候会锁表吗?cid:link_15InnoDB的聚簇索引是按照表的主键创建一个B+树,但是如果我们在表结构中没有定义主键怎么办?cid:link_16mysql中如何减少回表,增加查询的性能?cid:link_17走了索引,但是还是很慢是什么原因?cid:link_3mysql中操作同一条记录会发生死锁吗?cid:link_18数据库如果发生了死锁,该如何解决?cid:link_40.58.3版本仓颉后端无法启动 cid:link_19请问怎么购买codearts 盘古助手呢cid:link_20深圳P公司项目 项目发到生产首次加载可以触发事件, 刷新后就失效了 cid:link_21请问怎么购买Codearts盘古助手呢?cid:link_20  CodeArts IDE for C/C++ 运行Hallo World为什么无法直接在终端输出cid:link_223月: CodeArts 能上传 exe,获得一个url,作为程序的更新地址吗?有这个功能吗 cid:link_23 DevEco studioDev studio 有没有类似于Cline辅助开发插件?cid:link_24开始《Java智能助手设置》报错,不知道在哪设置 cid:link_25CodeArtsCheck idea 导入规则不生效 cid:link_26CodeArts IDE For Java什么时候更新cid:link_27 4月:CodeArts IDE for Cangjijr Even Better TOML v0.21.2? 扩展不兼容cid:link_28CodeArts IDE for Cangjie 无法安装扩展cid:link_29配置了ssh密钥,可以克隆项目代码,但是update和push代码提示没有权限cid:link_30如何支持连接WSL进行开发?cid:link_31smproxy-1.0.1.jar 华为maven依赖镜像在哪里能下载到?求助cid:link_32如何支持连接WSL进行开发?cid:link_315月: 推送镜像到SWR失败cid:link_33构建任务的日志链接可以对外提供吗?cid:link_34我想问下华为云的这个CodeArts支持CICD吗?cid:link_35 CodeArts Snap插件支持哪些客户端和语言?cid:link_36 CodeArts看板项目如何按照自定义字段进行检索? cid:link_37CodeArts IDE会有linux系统下的安装版本吗?cid:link_38 函数工作流下载函数失败 cid:link_39大佬,请问CodeArts IDE for C\C++ 工程创建完成后,出现这个报错咋解决?cid:link_40【麒麟V10】麒麟V10X86架构安装ambari-2.7.5后,利用ambari构建大数据平台报错RuntimeError: Failed to execute command '/usr/bin/yum -y install hadoocid:link_41代码托管中组的访问级别如何修改?cid:link_42【紧急问题求助】麒麟V10安装ambari-server-2.7.5执行ambari-server setup报错Unexpected error Ambari repo file path not set for current OS. cid:link_43 CodeArts IDE for Java 安装后,第一次打开显示 Initialization failed, due to no login extension found in this IDE. The CodeArts IDE cid:link_44CodeArts的Java版本和C/C++和ShellRemote是一个安装包吗?cid:link_45 【交流吐槽】 Elasticsearch 8.x版本求更新cid:link_46 6月:鸿蒙PC版CodeArts下载不了了?cid:link_5CodeArts构建maven的springcloud项目失败,jdk17 jansi-2.4.1 权限被阻止 cid:link_47关于CodeArts的CiCD的问题 cid:link_48bug提交不上报错,已经退出重新登录过了还是这样cid:link_6点击某个多选框后,如何自动生成文本输入框cid:link_70基础低代码平台,有没有入门案例教程cid:link_49
  • [技术干货] FAQ—CodeArts&AstroZero社区(问题求助)总结-2025.5
    首次使用华为云CodeArts时,开发者们总会遇到一些问题,小编针对大家遇到的问题做了分类总结,比如标准页面的表格数据问题、标准页面的表格数据问题、如何在标准页面的事件里面通过JS代码,获得下拉框选择的值?、标准页面的表格数据问题。憋着急!下面小编就来为大家一一解答遇到这几类问题时该如何快速解决,一步解决大家的困扰。华为云CodeArts系列产品参考手册:1、CodeArts:软件开发平台(CodeArts)官方手册:https://support.huaweicloud.com/devcloud/index.html软件开发平台(CodeArts)相关文章:https://bbs.huaweicloud.com/forum/thread-59032-1-1.html产品官方页面:https://devcloud.cn-north-4.huaweicloud.com/home2、CodeArts项目管理:项目管理(ProjectMan)官方手册:https://support.huaweicloud.com/projectman/index.html项目管理(ProjectMan)更新预览:https://support.huaweicloud.com/wtsnew-projectman/index.html产品官方页面:https://www.huaweicloud.com/product/projectman.html3、低代码平台Astro:应用魔方官方手册:https://support.huaweicloud.com/qs-appcube/appcube_02_0110.html操作指导:https://support.huaweicloud.com/appcube_video/index.html产品官方页面:https://appcube.cn-north-4.huaweicloud.com/studio/index.html#/projects/零代码官方手册:https://support.huaweicloud.com/usermanual-appcube/appcube_05_1404.html问题汇总:(以↓问题都是由官方人员解答后的文章链接)这里部署失败可以在哪里看到全量的日志吗?cid:link_0CodeArts IDE for java 运行报错cid:link_5codearts Ide 同一目录下多模块,Java智能助手无法识别cid:link_6CodeArts Ide SmartAssist启动失败cid:link_1Astro怎么动态设置工作流标题cid:link_7当前读和快照读有什么区别?cid:link_2MySQL的行级锁锁的到底是什么?cid:link_8InnoDB支持哪几种行格式?cid:link_9InnoDB的一次更新事务是怎么实现的?cid:link_10GaussDB轻量化部署,安装TPOPS平台失败cid:link_11mysql在InnoDB引擎下加索引,这个时候会锁表吗?cid:link_12InnoDB的聚簇索引是按照表的主键创建一个B+树,但是如果我们在表结构中没有定义主键怎么办?cid:link_13mysql中如何减少回表,增加查询的性能?cid:link_14走了索引,但是还是很慢是什么原因?cid:link_3mysql中操作同一条记录会发生死锁吗?cid:link_15数据库如果发生了死锁,该如何解决?cid:link_40.58.3版本仓颉后端无法启动 cid:link_16请问怎么购买codearts 盘古助手呢cid:link_17深圳P公司项目 项目发到生产首次加载可以触发事件, 刷新后就失效了 cid:link_18请问怎么购买Codearts盘古助手呢?cid:link_17  CodeArts IDE for C/C++ 运行Hallo World为什么无法直接在终端输出cid:link_193月: CodeArts 能上传 exe,获得一个url,作为程序的更新地址吗?有这个功能吗 cid:link_20 DevEco studioDev studio 有没有类似于Cline辅助开发插件?cid:link_21开始《Java智能助手设置》报错,不知道在哪设置 cid:link_22CodeArtsCheck idea 导入规则不生效 cid:link_23CodeArts IDE For Java什么时候更新cid:link_24 4月:CodeArts IDE for Cangjijr Even Better TOML v0.21.2? 扩展不兼容cid:link_25CodeArts IDE for Cangjie 无法安装扩展cid:link_26配置了ssh密钥,可以克隆项目代码,但是update和push代码提示没有权限cid:link_27如何支持连接WSL进行开发?cid:link_28smproxy-1.0.1.jar 华为maven依赖镜像在哪里能下载到?求助cid:link_29如何支持连接WSL进行开发?cid:link_285月: 推送镜像到SWR失败cid:link_30构建任务的日志链接可以对外提供吗?cid:link_31我想问下华为云的这个CodeArts支持CICD吗?cid:link_32 CodeArts Snap插件支持哪些客户端和语言?cid:link_33 CodeArts看板项目如何按照自定义字段进行检索? cid:link_34CodeArts IDE会有linux系统下的安装版本吗?cid:link_35 函数工作流下载函数失败 cid:link_36大佬,请问CodeArts IDE for C\C++ 工程创建完成后,出现这个报错咋解决?cid:link_37【麒麟V10】麒麟V10X86架构安装ambari-2.7.5后,利用ambari构建大数据平台报错RuntimeError: Failed to execute command '/usr/bin/yum -y install hadoocid:link_38代码托管中组的访问级别如何修改?cid:link_39【紧急问题求助】麒麟V10安装ambari-server-2.7.5执行ambari-server setup报错Unexpected error Ambari repo file path not set for current OS. cid:link_40 CodeArts IDE for Java 安装后,第一次打开显示 Initialization failed, due to no login extension found in this IDE. The CodeArts IDE cid:link_41CodeArts的Java版本和C/C++和ShellRemote是一个安装包吗?cid:link_42 【交流吐槽】 Elasticsearch 8.x版本求更新cid:link_43   
  • [技术干货] FAQ—CodeArts&AstroZero社区(问题求助)总结-2025.4
    首次使用华为云CodeArts时,开发者们总会遇到一些问题,小编针对大家遇到的问题做了分类总结,比如标准页面的表格数据问题、标准页面的表格数据问题、如何在标准页面的事件里面通过JS代码,获得下拉框选择的值?、标准页面的表格数据问题。憋着急!下面小编就来为大家一一解答遇到这几类问题时该如何快速解决,一步解决大家的困扰。华为云CodeArts系列产品参考手册:1、CodeArts:软件开发平台(CodeArts)官方手册:https://support.huaweicloud.com/devcloud/index.html软件开发平台(CodeArts)相关文章:https://bbs.huaweicloud.com/forum/thread-59032-1-1.html产品官方页面:https://devcloud.cn-north-4.huaweicloud.com/home2、CodeArts项目管理:项目管理(ProjectMan)官方手册:https://support.huaweicloud.com/projectman/index.html项目管理(ProjectMan)更新预览:https://support.huaweicloud.com/wtsnew-projectman/index.html产品官方页面:https://www.huaweicloud.com/product/projectman.html3、低代码平台Astro:应用魔方官方手册:https://support.huaweicloud.com/qs-appcube/appcube_02_0110.html操作指导:https://support.huaweicloud.com/appcube_video/index.html产品官方页面:https://appcube.cn-north-4.huaweicloud.com/studio/index.html#/projects/零代码官方手册:https://support.huaweicloud.com/usermanual-appcube/appcube_05_1404.html问题汇总:(以↓问题都是由官方人员解答后的文章链接)这里部署失败可以在哪里看到全量的日志吗?cid:link_0CodeArts IDE for java 运行报错cid:link_5codearts Ide 同一目录下多模块,Java智能助手无法识别cid:link_6CodeArts Ide SmartAssist启动失败cid:link_1Astro怎么动态设置工作流标题cid:link_7当前读和快照读有什么区别?cid:link_2MySQL的行级锁锁的到底是什么?cid:link_8InnoDB支持哪几种行格式?cid:link_9InnoDB的一次更新事务是怎么实现的?cid:link_10GaussDB轻量化部署,安装TPOPS平台失败cid:link_11mysql在InnoDB引擎下加索引,这个时候会锁表吗?cid:link_12InnoDB的聚簇索引是按照表的主键创建一个B+树,但是如果我们在表结构中没有定义主键怎么办?cid:link_13mysql中如何减少回表,增加查询的性能?cid:link_14走了索引,但是还是很慢是什么原因?cid:link_3mysql中操作同一条记录会发生死锁吗?cid:link_15数据库如果发生了死锁,该如何解决?cid:link_40.58.3版本仓颉后端无法启动 cid:link_16请问怎么购买codearts 盘古助手呢cid:link_17深圳P公司项目 项目发到生产首次加载可以触发事件, 刷新后就失效了 cid:link_18请问怎么购买Codearts盘古助手呢?cid:link_17  CodeArts IDE for C/C++ 运行Hallo World为什么无法直接在终端输出cid:link_193月: CodeArts 能上传 exe,获得一个url,作为程序的更新地址吗?有这个功能吗 cid:link_20 DevEco studioDev studio 有没有类似于Cline辅助开发插件?cid:link_21开始《Java智能助手设置》报错,不知道在哪设置 cid:link_22CodeArtsCheck idea 导入规则不生效 cid:link_23CodeArts IDE For Java什么时候更新cid:link_24 4月:CodeArts IDE for Cangjijr Even Better TOML v0.21.2? 扩展不兼容cid:link_25CodeArts IDE for Cangjie 无法安装扩展cid:link_26配置了ssh密钥,可以克隆项目代码,但是update和push代码提示没有权限cid:link_27如何支持连接WSL进行开发?cid:link_28smproxy-1.0.1.jar 华为maven依赖镜像在哪里能下载到?求助cid:link_29如何支持连接WSL进行开发?cid:link_28更新 4.28日 
  • [热门活动] 【有奖活动】华为云CodeArts解锁全新技能,诚邀您体验鸿蒙应用一站式开发功能,精美礼品等你来拿!
    HarmonyOS作为我国自主研发的操作系统,其原生应用生态正在迅猛发展。截至目前,搭载HarmonyOS的设备数量已突破10亿台,预计到2025年,鸿蒙原生应用及元服务的数量将超过10万款。为加速鸿蒙生态的完善,助力开发者高效完成应用鸿蒙化改造,华为云CodeArts提供了一站式鸿蒙应用开发平台。该平台集成了全流程开发工具链,支持云端协同开发,显著提升开发效率,同时解放本地算力,为开发者打造更便捷、高效的开发体验。为了给大家提供更好的使用体验以及开发更符合大家需求的应用场景,现诚邀广大开发者朋友们参与CodeArts鸿蒙应用一站式开发示例项目体验优化活动,参与活动即有机会获得开发者礼包!一、 活动时间即日起-2025.5.20二、 活动流程01 添加小助手微信 → 02 体验CodeArts鸿蒙应用一站式开发项目 → 03 去云声平台提建议 → 04 获奖公示1.    添加小助手微信,私聊发送关键词“鸿蒙”进群,后期获奖信息将在群里进行通知。2.    进入CodeArts首页创建“鸿蒙应用一站式开发项目”示例项目进行体验:cid:link_0(体验步骤请查看:https://bbs.huaweicloud.com/blogs/451321 )3.    建议提交地址:cid:link_1,建议提交时需要在标题中以“【CodeArts鸿蒙体验】”为建议标题开头,比如【CodeArts鸿蒙体验】建议增加XX/优化XX/刷新导入XX等。4.    活动结束后,我们将于7个工作日内将获奖名单发到互动群以及本活动帖的评论区进行公示,请大家到时候关注。三、 奖品设置奖项设置获奖要求获奖名额激励礼品建议排名奖被采纳功能/缺陷类建议数≥3条5积分榜第1名:价值300元开发者礼包1份积分榜第2名:价值200元开发者礼包1份积分榜第3-5名,价值100元开发者礼包1份积极参与奖被采纳建议数≥1条10每人50元开发者礼包1份开发者礼包奖品示例:礼包名称奖品介绍300元开发者礼包开发者定制双肩包、华为FreeBuds SE 2无线耳机200元开发者礼包HDC定制渔夫帽、HDC定制挂脖风扇、HDC定制短袖T恤、HDC定制双肩包100元开发者礼包开发者定制U盘、HDC盲盒冰箱贴50元开发者礼包开发者定制短袖T恤或《ModelArts人工智能应用开发指南》书籍 四、活动说明1、被采纳的建议中,如果是功能/缺陷类的建议积1分,如果是体验类的建议积0.5分;建议排名奖和积极参与奖不可重复获得。2、建议内容仅针对CodeArts鸿蒙应用一站式开发示例项目,非该项目的建议内容不参与此活动。3、提交的建议对产品功能及优化改进有积极作用,内容表述准确,有明确建议方案,建议附带操作截图或链接等进一步详细说明。4、若出现积分相同且排名一致的情况,结合已实现和已采纳建议情况,由内部技术专家选出价值更高的建议用户给予奖励。5、同一用户在同一页面(文档)提出的同一类用户体验问题(包括但不限于错别字、语句不通顺、视觉体验等),在通过审核后仅算作一条有效建议数。6、如遇库存不足,将替换成等价值的礼品。
  • [技术干货] FAQ—CodeArts&AstroZero社区(问题求助)总结-2025.3
    首次使用华为云CodeArts时,开发者们总会遇到一些问题,小编针对大家遇到的问题做了分类总结,比如标准页面的表格数据问题、标准页面的表格数据问题、如何在标准页面的事件里面通过JS代码,获得下拉框选择的值?、标准页面的表格数据问题。憋着急!下面小编就来为大家一一解答遇到这几类问题时该如何快速解决,一步解决大家的困扰。华为云CodeArts系列产品参考手册:1、CodeArts:软件开发平台(CodeArts)官方手册:https://support.huaweicloud.com/devcloud/index.html软件开发平台(CodeArts)相关文章:https://bbs.huaweicloud.com/forum/thread-59032-1-1.html产品官方页面:https://devcloud.cn-north-4.huaweicloud.com/home2、CodeArts项目管理:项目管理(ProjectMan)官方手册:https://support.huaweicloud.com/projectman/index.html项目管理(ProjectMan)更新预览:https://support.huaweicloud.com/wtsnew-projectman/index.html产品官方页面:https://www.huaweicloud.com/product/projectman.html3、低代码平台Astro:应用魔方官方手册:https://support.huaweicloud.com/qs-appcube/appcube_02_0110.html操作指导:https://support.huaweicloud.com/appcube_video/index.html产品官方页面:https://appcube.cn-north-4.huaweicloud.com/studio/index.html#/projects/零代码官方手册:https://support.huaweicloud.com/usermanual-appcube/appcube_05_1404.html问题汇总:(以↓问题都是由官方人员解答后的文章链接)这里部署失败可以在哪里看到全量的日志吗?cid:link_0CodeArts IDE for java 运行报错cid:link_5codearts Ide 同一目录下多模块,Java智能助手无法识别cid:link_6CodeArts Ide SmartAssist启动失败cid:link_1Astro怎么动态设置工作流标题cid:link_7当前读和快照读有什么区别?cid:link_2MySQL的行级锁锁的到底是什么?cid:link_8InnoDB支持哪几种行格式?cid:link_9InnoDB的一次更新事务是怎么实现的?cid:link_10GaussDB轻量化部署,安装TPOPS平台失败cid:link_11mysql在InnoDB引擎下加索引,这个时候会锁表吗?cid:link_12InnoDB的聚簇索引是按照表的主键创建一个B+树,但是如果我们在表结构中没有定义主键怎么办?cid:link_13mysql中如何减少回表,增加查询的性能?cid:link_14走了索引,但是还是很慢是什么原因?cid:link_3mysql中操作同一条记录会发生死锁吗?cid:link_15数据库如果发生了死锁,该如何解决?cid:link_40.58.3版本仓颉后端无法启动 cid:link_16请问怎么购买codearts 盘古助手呢cid:link_17深圳P公司项目 项目发到生产首次加载可以触发事件, 刷新后就失效了 cid:link_18请问怎么购买Codearts盘古助手呢?cid:link_17  CodeArts IDE for C/C++ 运行Hallo World为什么无法直接在终端输出cid:link_193月: CodeArts 能上传 exe,获得一个url,作为程序的更新地址吗?有这个功能吗 cid:link_20 DevEco studioDev studio 有没有类似于Cline辅助开发插件?cid:link_21开始《Java智能助手设置》报错,不知道在哪设置 cid:link_22CodeArtsCheck idea 导入规则不生效 cid:link_23CodeArts IDE For Java什么时候更新cid:link_24  更新 3.26日
  • [技术干货] 与PaaS产品一起成长的故事:Z市台风模型地质一体化应用技术咨询实战“术”分享——模型的安全设计
    在台风模型开发流程和平台设计好之后,面临一系列开发动作。在模型开发的过程中,仍有不少安全漏洞被黑客攻击,导致安全事故。自从2023年安全事件以来,大模型开发的种种漏洞接连被攻击,它就像一个新生儿,提抗力弱,经常遭受这个环境的侵扰。于是,安全设计就像病后膏药一样,一贴接一贴被大家提起。病有轻重缓急,对症下药是不变原则。首先碰到的是Prompt安全漏洞,通过改写Prompt语句,获取服务器甚至内部网络主机信息。在模型开发过程就伴随着这个风险。当时设计了台风模型是可以通过数据集自动获取内网辅助信息,如果改写了Prompt就会导致大模型的算法开始搜索主机信息。这是当时发现的第一个安全漏洞。其次,利用大模型可以根据知识图谱关联台风路径参数的能力,提供了一些训练的知识图谱,大模型关联出内部知识图谱,而这些内部训练数据是秘密级别,大模型对信息安全等级并没有识别把关能力,会全盘托出搜索结果,导致数据泄露。这是当时发现的第二个安全漏洞。发现了这两个漏洞,就像在目前网络上开了两个口子,数据信息可以随意进出。当初大模型架构设计时,曾设计了操作范围,分为部门内部、公司内部、特定范围公开和全球公开,四种公开范围,通过人员身份来识别数据是否可以通过口子进出。仅仅在结果上把关是不够的。有些数据信息是某个环节进行特定范围限制,而在开发过程的其他环节,对数据信息却做了其他范围限制。因此,必须在开发流程上进行安全设计,逐个节点进行设计,才可以满足开发的需求。
  • [技术干货] 与PaaS产品一起成长的故事:Z市台风模型地质一体化应用技术咨询实战“术”分享-模型开发的流水线的一点基础配置
    上回谈到引入数字孪生技术可以增强AI模型设计的用户推演效果,为了配合这个模块设计,需要进行开发一体化开发流水线的配置,完成模型的基础配置。一体化开发流水线主要是为了向上兼容各种模型,向下兼容各种框架而产生的配备的平台能力。这个平台能力,可以支持科学计算模型、CV模型和大语言模型的基础参数配置。在开发大模型的流程中,首先开发流程要明确,其次是把流程落入支持的IT工具。开发流程是需求导入,数据集制作及导入,算法选择,计算平台选择,数据训练及微调,数据推理,数据导出数字孪生平台。开发IT工具,主要采用集成开发平台。台风模型是科学计算模型,模拟一次台风在未来7小时变化轨迹,导入开发平台后,平台自动匹配相关的L0基础模型,分别是原科学计算模型和初步训练的科学计算模型。众所周知,大模型需要数据集进行训练,数据集由各种输入数据汇合而成,经过数据清洗,变成大模型可以识别的数据。台风模型的数据集主要是历年来的台风轨迹图、台风预报的结构化参数表和其他非结构化文档。算法选择也分为很多种,例如图形识别算法、实物批量标记算法、图形分割算法......对于台风模型,选择了实物批量标记算法和图形分割算法。由于不涉及具体物品识别,没有选择图形识别算法,但台风图上会有很多相似的图案,需要在台风图上把相似图案和台风图案区分出来。人工智能的妙处,在于它确实有技能做事,也能学习自己不懂的知识。
  • [体验官] 与PaaS产品一起成长的故事:Z市台风模型地质一体化应用技术咨询实战“术”分享-模型开发的流水线的一点基础配置
    上回谈到引入数字孪生技术可以增强AI模型设计的用户推演效果,为了配合这个模块设计,需要进行开发一体化开发流水线的配置,完成模型的基础配置。一体化开发流水线主要是为了向上兼容各种模型,向下兼容各种框架而产生的配备的平台能力。这个平台能力,可以支持科学计算模型、CV模型和大语言模型的基础参数配置。在开发大模型的流程中,首先开发流程要明确,其次是把流程落入支持的IT工具。开发流程是需求导入,数据集制作及导入,算法选择,计算平台选择,数据训练及微调,数据推理,数据导出数字孪生平台。开发IT工具,主要采用集成开发平台。台风模型是科学计算模型,模拟一次台风在未来7小时变化轨迹,导入开发平台后,平台自动匹配相关的L0基础模型,分别是原科学计算模型和初步训练的科学计算模型。众所周知,大模型需要数据集进行训练,数据集由各种输入数据汇合而成,经过数据清洗,变成大模型可以识别的数据。台风模型的数据集主要是历年来的台风轨迹图、台风预报的结构化参数表和其他非结构化文档。算法选择也分为很多种,例如图形识别算法、实物批量标记算法、图形分割算法......对于台风模型,选择了实物批量标记算法和图形分割算法。由于不涉及具体物品识别,没有选择图形识别算法,但台风图上会有很多相似的图案,需要在台风图上把相似图案和台风图案区分出来。人工智能的妙处,在于它确实有技能做事,也能学习自己不懂的知识。
  • [互动交流] 这里部署失败可以在哪里看到全量的日志吗?
    这里部署失败可以在哪里看到全量的日志吗?具体启动服务失败是哪里失败了 可以看到失败或者报错原因吗?
  • [互动交流] 流水线中部署源别名在哪里配置的呀
    流水线中部署源别名在哪里配置的呀
总条数:58 到第
上滑加载中