-
我开通了华为云OBS服务 为什么自动创建的用户组admin组显示高风险呀,有跟鸿蒙应用开发对接的详细官方文档吗
-
案例介绍CodeArts Doer是基于智能生成、智能问答两大核心能力构建起一套全方位、多层次的智能开发体系。在智能生成方面,它能够依据开发者输入的需求描述,准确且高效地生成高质量代码;智能问答功能则如同开发者身边的专属技术顾问。案例内容一、概述1. 案例介绍华为开发者空间,是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云主机、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。CodeArts Doer是基于智能生成、智能问答两大核心能力构建起一套全方位、多层次的智能开发体系。在智能生成方面,它能够依据开发者输入的需求描述,准确且高效地生成高质量代码;智能问答功能则如同开发者身边的专属技术顾问。本案例基于华为开发者空间+CodeArts Doer,实现SeedTab标签页,实用,强大的新建起始页,定制属于你的浏览器。2. 适用对象企业个人开发者高校学生3. 案例时间本案例总时长预计60分钟。4. 案例流程说明:用户使用VS Code远程连接云开发环境并安装CodeArts Doer代码智能体;使用CodeArts Doer代码智能体,自动生成商品管理Web应用;浏览器体验Seedtab。5. 资源总览本案例预计花费0元。资源名称规格单价(元)时长CodeArts代码智能体通用体验版免费60分钟华为开发者空间 - 云开发环境(容器)鲲鹏通用计算增强型 kc1 | 2vCPUs | 4G | HCE免费60分钟对象存储服务 (可选)40G1每月二、基础环境与资源准备1. VS Code远程连接云开发环境参考案例《华为开发者空间 - 云开发环境(容器)IDE插件远程连接操作指导》,使用VS Code的Huawei Developer Space 插件,远程连接华为开发者空间云开发环境。2. VS Code安装CodeArts Doer代码智能体点击Extensions图标,搜索CodeArts Doer for Coding,点击Install安装插件:安装完成后,点击CodeArts Doer插件图标,点击HUAWEI ID login:点击Open,打开外部网站:输入华为账号和密码,登录CodeArts Doer代码智能体:CodeArts Doer代码智能体登录成功:首次使用CodeArts Doer代码智能体,会进入开通页面。需要勾选“我已阅读并同意”后,单击“立即开通”,等待套餐开通完成。返回VS Code测试CodeArts Doer代码智能体,输入问题:你好,请介绍自己!3.设置Agent模式点击Agent,再点击设置:点击Auto Approve后面的Not enabled,授权所有操作:点击返回后,即可使用CodeArts Doer代码智能体。三、SeedTab应用实践1. CodeArts Doer生成代码输入以下指令:使用nodejs+h3+vue,构建一个新标签页,要求如下: 1、UI布局合理,界面美观; 2、实现链接挂件的添加; 3、实现搜索框挂件的添加; 4、实现时间挂件的添加; 5、设置中可以修改背景以及使用华为obs进行数据备份; 6、代码可直接运行。点击发送按钮后,CodeArts Doer代码智能体会创建项目文件并生成代码:大约几分钟之后,CodeArts Doer代码智能体帮助我们创建了项目文件,生成了完整的代码并安装了项目依赖代码目录结构:2.项目目录结构和关键代码释义经过不断测试和调试最终会生成你需要的代码,我已经上传到Gitcode,可以通过git下载源码到本地,代码仓库地址:https://gitcode.com/zhepama/seedtabseedtab/ ├── public/ # 静态资源目录 ├── server/ # 后端服务器 │ ├── middlewares/ # 中间件 │ │ ├── auth.js # API 认证中间件 │ │ └── cors.js # CORS 跨域中间件 │ ├── routes/ # 路由 │ │ └── sync.js # 数据同步路由 │ ├── config.js # 配置文件 │ └── index.js # 服务器入口 ├── src/ # 前端源码 │ ├── assets/ # 资源文件 │ ├── components/ # 公共组件 │ ├── composables/ # 组合式函数 │ ├── config/ # 配置文件 │ ├── store/ # 状态管理 │ │ ├── index.ts # Store 管理器 │ │ ├── grid.ts # 网格布局状态 │ │ ├── setting.ts # 设置状态 │ │ ├── storage.ts # 存储工具 │ │ └── backup.ts # 备份工具 │ ├── types/ # TypeScript 类型定义 │ │ ├── grid.ts # 网格相关类型 │ │ └── widget.ts # 组件相关类型 │ ├── utils/ # 工具函数 │ │ ├── widgetRegister.ts # 组件注册器 │ │ ├── backgroundUtils.ts # 背景工具 │ │ └── proxy.ts # 代理工具 │ ├── widgets/ # 小组件目录 │ │ ├── calendar/ # 日历组件 │ │ ├── clock/ # 时钟组件 │ │ ├── link/ # 链接组件 │ │ ├── note/ # 笔记组件 │ │ ├── search/ # 搜索组件 │ │ └── todo/ # 待办事项组件 │ ├── main.ts # 应用入口 │ └── App.vue # 根组件 ├── dist/ # 构建输出目录 ├── package.json # 项目依赖配置 ├── vite.config.ts # Vite 配置 ├── tsconfig.json # TypeScript 配置 └── index.html # HTML 入口文件1. 应用入口 (src/main.ts)async function startApp() { await registerServiceWorker(); // 注册 Service Worker const storeManager = useStoreManager(); await storeManager.initializeStores(); // 初始化所有 Store const app = createApp(App); app.use(ContextMenu); // 注册右键菜单 app.mount('#app'); } 关键步骤:注册 Service Worker 实现离线缓存初始化 Store 管理器,加载所有状态数据创建 Vue 应用实例并挂载2. Store 管理器 (src/store/index.ts)class StoreManager { private static instance: StoreManager | null = null; private stores: StoreModule[] = []; static getInstance(): StoreManager { if (!StoreManager.instance) { StoreManager.instance = new StoreManager(); } return StoreManager.instance; } async initializeStores(): Promise<void> { for (const store of this.stores) { if (store.loadInitialData) { await store.loadInitialData(); // 加载初始数据 } } } } 关键步骤:使用单例模式管理所有 Store统一初始化所有 Store 的初始数据确保数据加载完成后再渲染应用3. 网格布局 Store (src/store/grid.ts)class GridStore implements StoreModule { public items: GridItem[] = []; public reload = ref(false); async getGridItems(): Promise<GridItem[]> { this.items = await storage.getItem('gridItems') || [/* 默认数据 */]; return this.items; } async save(): Promise<void> { await storage.setItem('gridItems', this.items); } async refreshItems(items: GridItem[]) { this.items = items; await this.save(); this.reload.value = true; // 触发重新加载 } } 关键步骤:使用 unstorage 实现数据持久化提供默认的小组件配置(时钟、搜索、链接)通过 reload ref 触发界面更新4. 组件注册器 (src/utils/widgetRegister.ts)class WidgetRegister { private components: Map<string, WidgetConfig> = new Map() register(config: WidgetConfig) { this.components.set(config.type, config) } registerWidgets(widgetModules: Record<string, { widgetConfig: WidgetConfig; }>): WidgetConfig[] { // 按 order 属性排序 const sortedEntries = Object.entries(widgetModules) .filter(([_, module]) => module.widgetConfig && module.widgetConfig.disabled !== true) .sort(([, a], [, b]) => { const orderA = a.widgetConfig.order ?? Infinity const orderB = b.widgetConfig.order ?? Infinity return orderA - orderB }) // 注册排序后的组件 sortedEntries.forEach(([_, module]) => { widgetRegister.register(module.widgetConfig) }) return Array.from(this.components.values()) } createGridItem(type: string, data: any): GridItem { const config = this.getConfig(type) if (!config) throw new Error(`Component type ${type} not found`) return { id: uuidv4(), component: type as any, data: data || {} } } } 关键步骤:使用 Map 存储所有组件配置支持组件排序(order 属性)自动生成 UUID 创建新的 GridItem支持组件禁用控制5. 组件配置类型 (src/types/widget.ts)export interface WidgetConfig { type: string; // 组件类型标识 styles?: Record<string, any>; name: string; // 组件显示名称 w: number; // 宽度(网格单位) h: number; // 高度(网格单位) order?: number; // 排序优先级 view: Component; // 组件视图 disabled?: boolean; // 是否在菜单中隐藏 keepDefaultSize?: boolean; createWidget?: () => Promise<any>; // 创建组件时的回调 settings?: Component[]; // 设置面板组件 widgetContextMenu?: WidgetContextMenuItem[]; // 组件右键菜单 canvasContextMenu?: CanvasContextMenuItem[]; // 画布右键菜单 } 6. 后端服务器 (server/index.js)const app = new H3(); // 全局 CORS 中间件 app.use(corsMiddleware); // API 路由 app.use("/api/sync/upload", uploadHandler); app.use("/api/sync/download", downloadHandler); // 静态文件服务 app.use("/**", (event) => { return serveStatic(event, { indexNames: ["/index.html"], getContents: (id) => readFile(join(distPath, id)), getMeta: async (id) => { const stats = await stat(join(distPath, id)).catch(() => { }); if (stats?.isFile()) { return { size: stats.size, mtime: stats.mtimeMs, }; } }, }); }); serve(app, { port }); 关键步骤:使用 H3 框架构建服务器配置 CORS 跨域支持提供 API 路由和静态文件服务7. 数据同步 (server/routes/sync.js)export const uploadHandler = eventHandler(async (event) => { try { apiTokenAuth(event); // 1. 认证 const body = await readBody(event); const { key, data } = body; await obsOperation('putObject', { Bucket: bucketName, Key: key, Body: JSON.stringify(data), ContentType: 'application/json' }); return { success: true, message: "Upload successful" }; } catch (error) { return { success: false, error: error.message }; } }); export const downloadHandler = eventHandler(async (event) => { try { apiTokenAuth(event); // 1. 认证 const query = getQuery(event); const key = query.key; const result = await obsOperation('getObject', { Bucket: bucketName, Key: key, }); const content = result.InterfaceResult.Content.toString(); const data = JSON.parse(content); return { success: true, message: "Download successful", data }; } catch (error) { return { success: false, error: error.message }; } }); 关键步骤:使用华为云 OBS 进行数据存储API Token 认证机制上传:将数据序列化为 JSON 上传到 OBS下载:从 OBS 下载并反序列化数据3. 运行生成的代码运行代码:打开TERMINAL窗口,进入项目目录下,执行命令:cd seedtab npm install npm run dev:server点击Open in Browser:4. 测试体验SeedTab添加链接:右键点击页面,添加组件->链接组件待办事项:我的便签:日历组件:随机壁纸:更多设置:点击右上角的设置按钮,或者右键->系统设置,可以打开设置页面,在设置页面你可以设置网格和背景5. 备份到华为云的对象存储在项目根目录下创建一个 .env 文件,参考 .env.example 进行配置:cp .env.example .env打开配置文件.env,修改配置参数。配置项说明:变量名必填描述示例APP_ACCESS_TOKEN✅备份密钥,避免他人访问网页后可以备份``OBS_SERVER✅连接OBS的服务地址``OBS_ACCESS_KEY_ID✅OBS访问密钥中的AK。``OBS_SECRET_ACCESS_KEY✅OBS访问密钥中的SK。``OBS_BUCKET✅OBS的bucker``OBS_ACCESS_KEY_ID= OBS_SECRET_ACCESS_KEY= OBS_SERVER= OBS_BUCKET= APP_ACCESS_TOKEN=1234567809 在网页的设置中备份令牌的值配置相同的APP_ACCESS_TOKEN然后点击,备份和恢复就可以保存你的数据了…如果备份成功会在你的对象存储控制台中看到备份的数据注意:因为SeedTab应用是Agent自动生成的,每次提问设计生成的代码及最后的运行结果均存在出入,开发者可根据自己的需求,调教模型生成自己想要的结果。若想体验与案例一样的结果,请下载源码https://gitcode.com/zhepama/seedtab至本地运行。至此,基于华为开发者空间+CodeArts Doer,实现SeedTab标签页的案例已全部完成。我正在参加【案例共创】【第9期】基于开发者空间-云开发环境(容器)+ CodeArts Doer代码智能体完成应用开发/调试实践cid:link_3
-
新人小白 请问大佬OBS的C SDK里的demo如何运行,我设置了AK SK 还有终端节点 运行demo的时候一直报错create bucket esdk-c-test failed(NameLookupError).create bucket bucket-src failed(NameLookupError).create bucket bucket-target failed(NameLookupError).create bucket bucket-version with option failed(NameLookupError).
-
现在obs已经回调我的接口,但是authorization验签始终都无法通过POST\n\napplication/x-www-form-urlencoded\n\nx-signature-time:1767146573\n/api/test/callback这一段是生成验签的字符串,始终都无法生成跟obs返回的authorization一致。{ "x-signature-time": ["1767146573"], "authorization": ["OBS HPUAEGPBHL82LBFLIGR:bpoga4KzkvTl6GcGnWl9BaegLZgJb0SfjTVFSy050qVzqa="], "content-type": ["application/x-www-form-urlencoded"], "user-agent": ["gentleman/2.0.5"], "content-length": ["0"], "x-scheme": ["https"], "x-forwarded-scheme": ["https"], "x-forwarded-proto": ["https"], "x-forwarded-port": ["443"], "x-forwarded-host": ["text.123.com"], "x-forwarded-for": ["121.45.11.135"], "x-real-ip": ["121.45.11.135"], "x-request-id": ["eed0349b34efa62a6b257754bfa55c3b"], "host": ["text.123.com"]},"request": { "filename": "products/202512/test.jpg", "size": "553838", "mimeType": "null", "user_id": "null", "title": "null", "type": "null", "image_height": "null", "image_width": "null"}
-
一、核心的原理:xlog 追平速度的关键是 “日志生成量”xlog(WAL)追平的本质是 “操作产生的 WAL 日志落盘、备库同步追平主库日志” 的过程,速度完全取决于操作生成的 WAL 日志量,而非表的物理大小(200G):1. Truncate 操作的 xlog 逻辑(更快)操作本质:DDL 操作,直接清空表的所有数据块,标记对应存储空间为 “可复用 / 释放”,不触发行级数据处理;WAL 日志量:仅记录 “截断表” 的元数据(如表 OID、数据块范围),与表大小无关,生成的 WAL 量仅 KB 级别(通常 < 1MB);追平速度:日志刷盘、备库同步几乎瞬间完成(毫秒级),200G 表和 2G 表的 Truncate xlog 追平速度无差别。2. Drop 操作的 xlog 逻辑(稍慢)操作本质:DDL 操作,标记表的元数据(系统表中)为失效,同时删除关联的索引、约束、分区等元数据;物理数据不会立即删除(openGauss 默认延迟清理,由后台 autovacuum 异步处理);WAL 日志量:记录 “表元数据删除 + 关联对象清理” 的日志,比 Truncate 略多(几十 KB 到几 MB),但依然与表大小无关;追平速度:同样是毫秒级完成,仅比 Truncate 慢一点点(比如从 0.1 秒变成 0.5 秒),几乎感知不到。3. 关键误区澄清很多人误以为 “表越大,Drop/Truncate 的 xlog 越多”—— 这是错误的!因为这两个操作是元数据操作,WAL 只记录 “操作本身”,不记录 “数据内容”;而Delete from 表是 DML 操作,每删一行都要记 WAL,200G 表 Delete 会生成数百 GB 的 WAL,追平耗时数小时(和 Drop/Truncate 完全不是一个量级)。二、特殊场景下的差异(影响极小)只有当表满足以下条件时,Drop 的 xlog 追平速度会比 Truncate 稍慢一点(但仍属毫秒级):表有大量关联对象(如 10 + 索引、多个约束、数百个分区):Drop 需要额外记录 “删除索引 / 约束 / 分区元数据” 的 WAL,日志量略增;openGauss 开启 “表回收站”(默认开启):Drop 会把表放入回收站,这一步会多一点 WAL 记录,而 Truncate 不会触发回收站;备库同步策略为 “实时同步”:Drop 的少量额外 WAL 会让备库追平多花几十毫秒,但无实际影响。三、实操对比(200G 大表举例)操作WAL 生成量xlog 追平耗时备注Truncate~500KB<1 秒仅记录元数据,最快Drop~2MB<2 秒需清理关联元数据,稍慢Delete~200-400GB数小时行级记录,极慢(对比用)总结一下下核心结论:Drop 和 Truncate 的 xlog 追平速度差异极小(均为毫秒级),Truncate 略快于 Drop;关键认知:两者的 xlog 生成量都与 200G 表大小无关,仅取决于元数据复杂度,无需担心 “表大导致追平慢”;选型建议:若需保留表结构,选 Truncate;若无需表结构,选 Drop—— 两者的 xlog 追平速度都足够快,无需纠结。
-
问题1问题:使用obs上传图片报错:com.obs.services.exception.ObsException: Error message:Request Error.OBS service Error Message. – ResponseCode: 404, ResponseStatus: Not Foundheaders{date:Thu, 04 Dec 2025 00:52:34 GMT,x-reserved:amazon, aws and amazon web services are trademarks or registered trademarks of Amazon Technologies, Inc,content-length:317,connection:keep-alive,content-type:application/xml,}链接:https://bbs.huaweicloud.com/forum/thread-0293200200471808083-1-1.html解答:您遇到的华为云OBS上传图片报错(404 Not Found)且响应头中包含x-reserved:amazon,表明请求可能被错误路由到了AWS S3而非华为云OBS。根本原因是配置了错误的Endpoint(如误用AWS S3地址),或SDK/客户端工具未正确指定华为云OBS的服务地址。解决方案:(1)检查并修正Endpoint:确保使用华为云OBS的Endpoint格式(如https://{bucket-name}.{region}.myhuaweicloud.com),并确认Bucket名称、Region与控制台一致。(2)验证Bucket和权限:确认Bucket存在且AK/SK有上传权限,检查IAM策略或Bucket ACL。(3)排查网络环境:避免代理或本地配置(如误设AWS环境变量)干扰请求,通过抓包或curl测试直接访问OBS地址。(4)检查SDK配置:确保华为云OBS SDK版本兼容,且未误用AWS SDK参数。问题2问题:obs上传文件采用java sdk方式调用,第一次创建桶并上传文件可以成功,后续判断如果桶存在就不去创建了直接上传文档,发现一直提示connection reset 还有什么peer,代码每次都去new obsClient再去调用的链接:https://bbs.huaweicloud.com/forum/thread-0282201507976707119-1-1.html解答:第一次能上传成功,说明你的代码没问题!报connection reset 错误,很可能是你上一次上传成功后,未关闭连接,然后又一次用同一个client重新打开连接,导致报错问题3问题:obs下载链接能生成domain+文件路径吗链接:https://bbs.huaweicloud.com/forum/thread-0282201178265162107-1-1.html解答:华为云OBS可以生成包含域名(domain)和文件路径的下载链接,其生成方式如下:1.通过OBS管理控制台操作路径:登录华为云控制台 → 进入OBS服务 → 选择目标桶 → 在“对象”页面找到文件 → 点击“下载”或“更多→下载为”。链接形式:生成的链接通常包含OBS的默认域名(如https://your-bucket.obs.region.myhuaweicloud.com)和文件在桶内的完整路径(如/path/to/file.txt)。示例:https://your-bucket.obs.region.myhuaweicloud.com/path/to/file.txt?AWSAccessKeyId=xxx&Expires=xxx&Signature=xxx2.通过obsutil命令行工具命令结构:Windows/macOS/Linux生成单个对象链接obsutil sign obs://bucket/key [-e=过期时间] [-config=配置文件]示例:生成文件test.txt的链接obsutil sign obs://your-bucket/path/to/test.txt -e=300输出结果:返回的链接包含域名和文件路径,格式与管理控制台一致。通过API或SDK华为云OBS的API(如GeneratePresignedUrl)和SDK(如Java、Python等)支持生成带域名和路径的临时下载链接,适用于程序化操作。
-
,采用java sdk方式调用,第一次创建桶并上传文件可以成功,后续判断如果桶存在就不去创建了直接上传文档,发现一直提示connection reset 还有什么peer,代码每次都去new obsClient再去调用的
-
obs下载链接能生成domain+文件路径吗?
-
中青报·中青网记者 武欣中 通讯员 张苗 刘晓琳来源:中国青年报(2025-12-10 07版)转载自中国青年报 :https://zqb.cyol.com/pc/content/202512/10/content_419799.html “推理大模型的训练调优与性能加速,助力全栈自主AI”——2025年度中国青年科技创新“揭榜挂帅”擂台赛上,华为抛出一道紧扣技术前沿的赛题。面对这一极具挑战性的课题,高校学子踊跃参赛,经过层层严格筛选,华为最终收到了36份充满创新思维的解决方案。正如华为创始人任正非先生在2025年民营企业座谈会上强调的:“人工智能是未来发展的重要方向,企业应积极布局,加强基础研究与人才培养,以增强中国在全球人工智能领域的竞争力。”参与“揭榜挂帅”擂台赛,是华为践行这一战略的生动写照。大赛也为华为搭建了一个绝佳平台,使其能将产业前沿的迫切需求,转化为青年人才的实战课题。据介绍,华为已连续3年在“揭榜挂帅”擂台赛上发布战略级赛题,华为云开发者支持与运营部部长林华鼎表示,赛场是根技术从“能用”到“好用”的试炼场,此次赛题聚焦推理大模型调优,正是看准了其在推动AI技术普惠化进程中的核心作用。2025年,大语言模型的推理能力和运行效率成为影响AI技术广泛应用的关键要素。华为此次设计的赛题直击产业痛点:如何在确保模型精度不受影响的前提下,大幅提升模型推理性能。这一赛题设计也体现了华为对构建自主AI生态的长远考量:参赛团队需使用华为昇腾AI处理器架构、CANN软件栈与ModelArts开发环境,这不仅考验学生的算法能力,更考验他们对昇腾AI全栈技术的掌握与运用能力。本届“揭榜挂帅”擂台赛,上海交通大学团队提出的“基于昇腾NPU的训推一体加速优化方案”脱颖而出,荣获本次华为赛道擂主。该方案从训练端减负、推理端提效、算子端深挖三个层面同时发力,在NPU上发挥出模型的极致性能。林华鼎对参赛作品给予高度评价:“每秒707tokens的惊人速度,不仅是算法的胜利,更是驱动我们产品性能持续飞跃、引领行业技术推广的强劲新标杆。我们期待将这一突破性成果快速转化为用户体验与技术领先优势。”林华鼎透露,华为还将持续在产品的开发者体验提升上投入,在高校人才培养方面持续耕耘,支持更多青年在自主创新的舞台上绽放光彩。
-
报错信息:com.obs.services.exception.ObsException: Error message:Request Error.OBS service Error Message. -- ResponseCode: 404, ResponseStatus: Not Foundheaders{date:Thu, 04 Dec 2025 00:52:34 GMT,x-reserved:amazon, aws and amazon web services are trademarks or registered trademarks of Amazon Technologies, Inc,content-length:317,connection:keep-alive,content-type:application/xml,}
-
我的训练数据大约是16TB的图像数据和光流真值(.pfm文件)。我目前想要尝试使用该数据训练模型,但是在创建训练作业的时候,并没有选项支持从OBS桶中读取这些数据。我查阅了相关使用指南,在 cid:link_0 中提到,在训练代码中通过OBS SDK实现操作OBS中的数据,并且说明了有400GB的磁盘空间可以直接挂载。但是这一空间还是太少了,不满足我当前的需求。而直接访问obs桶的话,数据读取速度又太慢了,npu长时间处于等待状态。有没有方法可以进一步提高obs中的数据访问速度?或者,能否提供更大的 ssd 存储空间,以支持大规模数据训练?
-
以下是华为云各项存储服务的汇总表:存储服务类型服务名称服务描述适用场景更多详情参考块存储服务云硬盘(Elastic Volume Service,EVS)为云服务器提供高可靠、高性能、规格丰富并且可弹性扩展的块存储服务,满足不同场景的业务需求。分布式文件系统、开发测试、数据仓库、高性能计算等云硬盘产品介绍块存储备份服务云硬盘备份(Volume Backup Service,VBS)为云硬盘创建备份,利用备份数据回滚云硬盘,保证用户数据正确性和安全性。确保云硬盘数据安全云硬盘备份产品介绍文件存储服务弹性文件服务(Scalable File Service,SFS)提供按需扩展的高性能文件存储,可供云上多个云服务器共享访问,具备高可靠和高可用特点,性能随容量增加而提升。多个云服务器共享文件存储需求弹性文件服务产品介绍对象存储服务对象存储服务(Object Storage Service ,OBS)基于对象的海量存储服务,提供海量、安全、高可靠、低成本的数据存储能力。海量数据存储需求对象存储服务产品介绍服务器备份服务云服务器备份(Cloud Server Backup Service,CSBS)提供对弹性云服务器和裸金属服务器的备份保护服务,支持基于多云硬盘一致性快照技术的备份,并支持利用备份数据恢复服务器数据。保障服务器数据的安全性和正确性,确保业务安全云服务器备份服务产品介绍存储服务的官方文档地址为:https://support.huaweicloud.com/dg-sap/sap_05_0012.html
-
案例介绍本项目是基于华为开发者空间云上开发环境部署的<AI试卷生成与在线测试平台>技术实践案例。该应用深度集成华为云MaaS(ModelArts as a Service)平台提供的DeepSeek-V3大语言模型,充分利用平台提供的百万级商用token处理能力,构建了一个能够一键生成任意学科、任意难度的试卷,提供模拟考试环境、自动评分以及智能解析功能的智能试卷生成与在线测试平台。案例内容一、概述1. 案例介绍华为开发者空间,是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云主机、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。本项目是华为开发者空间开发平台 - 云开发环境(容器)部署的<AI试卷生成与在线测试平台>技术实践案例。该应用深度集成华为云MaaS(ModelArts as a Service)平台提供的DeepSeek-V3大语言模型,充分利用平台提供的百万级商用token处理能力,构建了一个能够一键生成任意学科、任意难度的试卷,提供模拟考试环境、自动评分以及智能解析功能的智能试卷生成与在线测试平台。<AI试卷生成与在线测试平台>技术架构上,项目采用react+typescript技术栈,基于华为MaaS平台的强大算力支持,实现了智能解析功能的智能试卷生成与在线测试平台。华为MaaS平台不仅提供高质量的DeepSeek-V3模型,更具备百万token的超长上下文处理能力,使得本应用能够生成准确的试题。前端采用React框架构建响应式界面,后端通过封装MaaS平台API,为用户提供刷题、模拟考试、自动评分、智能解析等功能。2. 功能特性AI 智能出题: 输入任意主题(如“Python基础”、“中国近代史”、“驾考科目一”),即刻生成包含单选、多选、判断题的完整试卷。模拟考试: 沉浸式答题界面,配备倒计时功能。自动评分: 考试结束后立即出分,通过可视化图表展示得分详情。错题回顾: 提供复习模式,高亮显示错题,并附带 AI 生成的详细解析。题集功能: 建立错题难题题集,不断复习巩固知识。题集试卷: 根据题集生成试卷,检验你的学习成果。历史记录: 自动保存考试记录与成绩,随时回溯过往练习。云端同步: 支持配置 Huawei Cloud OBS 将考试记录同步至云端。3. 适用对象企业个人开发者高校学生4. 案例时间本案例总时长预计60分钟。5. 案例流程说明:登录华为开发者空间,VS Code安装Huawei Developer Space插件,远程连接操作云开发环境;远程创建、开机、连接云开发环境(虚拟机);领取百万token代金券福利,开通商用模型服务,获取模型API 地址、API Key等参数;GitCode拉取代码 https://gitcode.com/zhepama/ai-exam-platform.git,安装依赖,修改参数;启动程序,在浏览器端测试验证<AI试卷生成与在线测试平台>。5. 资源总览本案例预计花费0元。资源名称规格单价(元)时长(分钟)华为开发者空间开发平台 - 云开发环境(容器)鲲鹏通用计算增强型 kc1 | 2vCPUs | 4G | HCE免费60二、基础环境与资源准备1. VS Code远程连接云开发环境(容器)参考案例《华为开发者空间 - 云开发环境(容器)IDE插件远程连接操作指导》中的“二、云开发环境IDE插件远程连接操作指导”的内容,完成“1. 安装插件” ~ “4. 连接”章节步骤。完成连接之后的状态:2. 领取百万免费token福利参考案例《Versatile Agent中自定义接入大模型配置华为云Maas指导》中的“一、 领取”章节内容,领取华为开发者空间百万token代金券福利,购买ModelArts Studio DeepSeek-V3 轻量体验包(¥3.50)。开通商用模型服务,最后获取API地址、API Key的参数值。三、来刷题吧 - AI试卷生成与在线测试平台1.来刷题吧 - AI试卷生成与在线测试平台功能介绍AI试卷生成与在线测试平台是一个基于DeepSeek大模型的智能聊天应用,提供美观的Web界面和流畅的对话体验。项目采用React + Typescript,结合华为云MaaS平台百万免费商用token,配置DeepSeek-V3大模型。🛠️ 技术栈核心框架: React 19构建工具: ViteUI 样式: Tailwind CSS图标库: Lucide React环境管理: dotenv📂 目录结构server/index.js - 后端服务主入口与路由逻辑src/App.tsx - 前端应用主入口与路由逻辑src/services/geminiService.ts - AI 接口调用与试卷生成逻辑src/services/storageService.ts - 本地存储与云同步逻辑src/components/ - UI 组件库types.ts - TypeScript 类型定义2. 获取来刷题吧 - AI试卷生成与在线测试平台代码新建项目文件在/workspace/node目录下创建ai-exam-platform文件夹。cd /workspace/node mkdir ai-exam-platform cd ai-exam-platform下载代码点击Source Control图标,然后点Initialize Repository。点CHANGES右侧的 ··· 图标,在下拉菜单中选择Clone。输入代码仓地址,Clone from URL: https://gitcode.com/zhepama/ai-exam-platform.git选择代码仓目录:/workspace/ai-exam-platform/,点Select as Repository Destination。然后点Open,将此目录设置为本地代码仓。加载结束后的状态如下:3. 安装项目依赖安装项目依赖npm install2. 修改配置文件,配置API Key在项目根目录下创建一个 .env 文件,参考 .env.example 进行配置:cp .env.example .env打开配置文件.env,修改配置参数。将配置文件中的your_API_Key替换为“二、基础环境与资源准备”章中的“4. 领取百万免费福利”节最后获取到的API Key。配置项说明:变量名必填描述示例API_KEY✅AI 模型的 API 密钥 (Gemini 或 OpenAI)AIzaSy...AI_PROVIDER❌指定 AI 提供商 (gemini 或 openai)openaiAI_MODEL❌指定模型版本deepseek-v3.1AI_BASE_URL❌OpenAI 接口地址 (用于代理)https://api.modelarts-maas.com/v2OBS_SERVER❌连接OBS的服务地址``OBS_ACCESS_KEY_ID❌OBS访问密钥中的AK。``OBS_SECRET_ACCESS_KEY❌OBS访问密钥中的SK。``OBS_BUCKET❌OBS的bucker``JUDGE_COUNT❌判断题数量。5SINGLE_CHOICE_COUNT❌单选题数量。5MULTI_CHOICE_COUNT❌多选题数量5# API配置 # AI Provider Configuration # Options: 'gemini' | 'openai' # Default: 'gemini' AI_PROVIDER=openai # API Key for the selected provider # For Gemini: Get from Google AI Studio # For OpenAI: Get from OpenAI Platform API_KEY=your_API_Key # 替换为你的实际API密钥 # AI Model to use # Default for Gemini: 'gemini-2.5-flash' # Default for OpenAI: 'gpt-3.5-turbo' # You can override this with other models like 'gpt-4', 'gemini-1.5-pro', etc. AI_MODEL=deepseek-v3.1 # AI Base URL # Only used if AI_PROVIDER is 'openai' (or compatible services like DeepSeek, Moonshot, etc.) # Default: 'https://api.openai.com/v1' AI_BASE_URL=https://api.modelarts-maas.com/v2 5. 测试体验来刷题吧 - AI试卷生成与在线测试平台在VS Code终端窗口中运行如下命令,启动来刷题吧 - AI试卷生成与在线测试平台。npm run dev:server在VS Code弹出的对话框中点Open in Browser,或者直接在浏览器中打开:http://localhost:3000/输入测试问题:“驾考科目一”,来刷题吧 - AI试卷生成与在线测试平台正确回答。开始答题提交试卷查看错题每一题都会有答案解析数据同步题集功能 (新增)查看题集题集中会随机出题,供你测试点击题目卡片,卡片反转可以查看答案题集试卷根据题目生成试卷生成新的试卷进行测试吧至此,基于华为开发者空间-云开发环境(容器)+MaaS实现来刷题吧 - AI试卷生成与在线测试平台案例结束,各位开发者快来华为开发者空间体验吧。我正在参加【案例共创】【第8期】基于华为开发者空间云开发环境(容器),集成华为云AI服务(Agent或MaaS API),完成AI应用构建开发最佳实践cid:link_6
-
背景类似预签名的方式,后端生成了签名和policy, 前端使用表单提交。提示如果可以,尽量使用简单的方式,比如前端用accessKeyId+accessKeySecret 的方式直接putObject.但这种方法会暴露secret。也可以通过自己服务后台上传到aliyun oss. 但这种方式会占用自己服务的带宽。如果使用post Object 的方式,很麻烦,官方文档也的也不好(写的跟si一样)。调试了1天,帮doubao的帮助下才搞定。后端代码 public AliyunOssSignatureView genSignature() throws Exception { // 步骤1:创建policy。 ObjectMapper mapper = new ObjectMapper(); Map<String, Object> policy = new HashMap<>(); policy.put("expiration", formatISODateTime()); List<Object> conditions = new ArrayList<>(); Map<String, String> bucketCondition = new HashMap<>(); bucketCondition.put("bucket", bucketName); conditions.add(bucketCondition); Map<String, String> signatureVersionCondition = new HashMap<>(); signatureVersionCondition.put("x-oss-signature-version", "OSS4-HMAC-SHA256"); conditions.add(signatureVersionCondition); Map<String, String> credentialCondition = new HashMap<>(); credentialCondition.put("x-oss-credential", accessKeyId + "/" + formatISODate() + "/" + region + "/oss/aliyun_v4_request"); // 替换为实际的 access key id conditions.add(credentialCondition); Map<String, String> dateCondition = new HashMap<>(); dateCondition.put("x-oss-date", formateDateTimeZ()); conditions.add(dateCondition); conditions.add(Arrays.asList("content-length-range", 1L, 1024L*1024*1024*5)); conditions.add(Arrays.asList("eq", "$success_action_status", "201"));// conditions.add(Arrays.asList("starts-with", "$key", "user/eric/"));// conditions.add(Arrays.asList("in", "$content-type", Arrays.asList("image/jpg", "image/png")));// conditions.add(Arrays.asList("not-in", "$cache-control", Arrays.asList("no-cache"))); policy.put("conditions", conditions); String jsonPolicy = mapper.writeValueAsString(policy); // 步骤2:构造待签名字符串(StringToSign)。 String stringToSign = new String(Base64.encodeBase64(jsonPolicy.getBytes())); // 步骤3:计算SigningKey。 byte[] dateKey = hmacsha256(("aliyun_v4" + accessKeySecret).getBytes(), formatISODate()); byte[] dateRegionKey = hmacsha256(dateKey, region); byte[] dateRegionServiceKey = hmacsha256(dateRegionKey, "oss"); byte[] signingKey = hmacsha256(dateRegionServiceKey, "aliyun_v4_request"); // 步骤4:计算Signature。 byte[] result = hmacsha256(signingKey, stringToSign); String signature = BinaryUtil.toHex(result); log.info("policy:{}, base64 policy:{}, signature:{}", jsonPolicy, stringToSign, signature); return new AliyunOssSignatureView(stringToSign, signature); } public static byte[] hmacsha256(byte[] key, String data) { try { // 初始化HMAC密钥规格,指定算法为HMAC-SHA256并使用提供的密钥。 SecretKeySpec secretKeySpec = new SecretKeySpec(key, "HmacSHA256"); // 获取Mac实例,并通过getInstance方法指定使用HMAC-SHA256算法。 Mac mac = Mac.getInstance("HmacSHA256"); // 使用密钥初始化Mac对象。 mac.init(secretKeySpec); // 执行HMAC计算,通过doFinal方法接收需要计算的数据并返回计算结果的数组。 byte[] hmacBytes = mac.doFinal(data.getBytes()); return hmacBytes; } catch (Exception e) { throw new RuntimeException("Failed to calculate HMAC-SHA256", e); } } /** * 获取ISO格式时间 * 2024-12-03T13:00:00Z * @return current time iso format */ public static String formatISODateTime() { ZonedDateTime utcTime = ZonedDateTime.now(); utcTime = utcTime.plusHours(1); return utcTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")); } public static String formatISODate() { LocalDate utcDate = LocalDate.now(ZoneOffset.UTC); return utcDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); } public static String formateDateTimeZ() { ZonedDateTime utcTime = ZonedDateTime.now(ZoneOffset.UTC); return utcTime.format(DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'")); } 其中region 一定要注意,是类似cn-beijing 这样的,而不是oss-cn-beijing.endpoint 是 https://bucketName.oss-cn-beijing.alyuncs.com上面使用的base64是apache 的。不是java自带的 前端代码filed的顺序一定不能错,错了就不好使 policy 和 x-oss-signature 都是后端生成返回给前端。key 是上传后的文件名称前端可以把policy base64 decode一下。在里面取x-oss-signature-version,x-oss-credential, x-oss-date,success_action_status这些值 。file 是要上传的文件 转载于:https://www.cnblogs.com/zhangyy3/p/19176009
-
概述华为云OBS(Object Storage Service)是一种安全、高可靠、低成本、高扩展性的云存储服务,适用于多种业务场景,如数据备份、归档、文件共享和大数据分析等。华为云OBS提供了丰富的SDK,支持多种编程语言,包括但不限于Java、Python、JavaScript、Go、C++等。本文将介绍如何使用不同的编程语言调用华为云OBS对象存储服务,实现文件的上传、下载和管理等操作。一、JavaJava是华为云OBS SDK支持的主要语言之一,适用于企业级应用和后端服务。1. 准备工作注册华为云账号:访问华为云官网,注册并登录账号。创建OBS桶:在华为云控制台中创建一个OBS桶,用于存储文件。获取访问密钥(AK/SK):在“我的凭证”中创建访问密钥,用于身份认证。引入OBS Java SDK:在项目中添加华为云OBS Java SDK的依赖。2. 示例代码上传文件import com.obs.services.ObsClient; import com.obs.services.model.PutObjectRequest; import com.obs.services.model.PutObjectResult; import java.io.File; public class ObsFileUpload { public static void main(String[] args) { String ak = "你的AK"; String sk = "你的SK"; String endpoint = "obs.cn-north-4.myhuaweicloud.com"; String bucketName = "你的桶名称"; String localFilePath = "C:/test/local-file.txt"; String objectKey = "remote-file.txt"; ObsClient obsClient = new ObsClient(ak, sk, endpoint); try { PutObjectRequest request = new PutObjectRequest(bucketName, objectKey, new File(localFilePath)); PutObjectResult result = obsClient.putObject(request); System.out.println("文件上传成功,ETag: " + result.getEtag()); } catch (Exception e) { System.err.println("文件上传失败:" + e.getMessage()); e.printStackTrace(); } finally { if (obsClient != null) { try { obsClient.close(); } catch (Exception e) { e.printStackTrace(); } } } } } 下载文件import com.obs.services.ObsClient; import com.obs.services.model.ObsObject; import java.io.InputStream; import java.io.ByteArrayOutputStream; public class ObsFileDownload { public static void main(String[] args) { String ak = "你的AK"; String sk = "你的SK"; String endpoint = "obs.cn-north-4.myhuaweicloud.com"; String bucketName = "你的桶名称"; String objectKey = "remote-file.txt"; ObsClient obsClient = new ObsClient(ak, sk, endpoint); try { ObsObject obsObject = obsClient.getObject(bucketName, objectKey); InputStream input = obsObject.getObjectContent(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] b = new byte[1024]; int len; while ((len = input.read(b)) != -1) { bos.write(b, 0, len); } System.out.println("文件内容:"); System.out.println(new String(bos.toByteArray())); bos.close(); input.close(); } catch (Exception e) { System.err.println("文件下载失败:" + e.getMessage()); e.printStackTrace(); } finally { if (obsClient != null) { try { obsClient.close(); } catch (Exception e) { e.printStackTrace(); } } } } } 二、PythonPython是一种简洁高效的脚本语言,广泛应用于数据处理、Web开发和自动化运维等领域。1. 准备工作注册华为云账号:同Java。创建OBS桶:同Java。获取访问密钥(AK/SK):同Java。安装OBS Python SDK:使用pip安装华为云OBS Python SDK。pip install obs-python-sdk2. 示例代码上传文件from obs import ObsClient ak = '你的AK' sk = '你的SK' endpoint = 'obs.cn-north-4.myhuaweicloud.com' bucket_name = '你的桶名称' local_file_path = 'C:/test/local-file.txt' object_key = 'remote-file.txt' obs_client = ObsClient(ak, sk, endpoint) try: resp = obs_client.putFile(bucket_name, object_key, local_file_path) if resp.status < 300: print('文件上传成功') else: print('文件上传失败,错误码:', resp.status) except Exception as e: print('文件上传失败:', e) finally: obs_client.close() 下载文件from obs import ObsClient ak = '你的AK' sk = '你的SK' endpoint = 'obs.cn-north-4.myhuaweicloud.com' bucket_name = '你的桶名称' object_key = 'remote-file.txt' download_path = 'C:/test/downloaded-file.txt' obs_client = ObsClient(ak, sk, endpoint) try: resp = obs_client.getObject(bucket_name, object_key, download_path=download_path) if resp.status < 300: print('文件下载成功') else: print('文件下载失败,错误码:', resp.status) except Exception as e: print('文件下载失败:', e) finally: obs_client.close() 三、JavaScript(Node.js)JavaScript(Node.js)适用于前端和后端开发,特别是在Web应用中。1. 准备工作注册华为云账号:同Java。创建OBS桶:同Java。获取访问密钥(AK/SK):同Java。安装OBS Node.js SDK:使用npm安装华为云OBS Node.js SDK。npm install obs-nodejs-sdk2. 示例代码上传文件const ObsClient = require('obs-nodejs-sdk'); const ak = '你的AK'; const sk = '你的SK'; const endpoint = 'obs.cn-north-4.myhuaweicloud.com'; const bucketName = '你的桶名称'; const localFilePath = 'C:/test/local-file.txt'; const objectKey = 'remote-file.txt'; const obsClient = new ObsClient(ak, sk, endpoint); obsClient.putFile(bucketName, objectKey, localFilePath) .then((result) => { if (result.status < 300) { console.log('文件上传成功'); } else { console.log('文件上传失败,错误码:', result.status); } }) .catch((err) => { console.error('文件上传失败:', err); }) .finally(() => { obsClient.close(); }); 下载文件const ObsClient = require('obs-nodejs-sdk'); const ak = '你的AK'; const sk = '你的SK'; const endpoint = 'obs.cn-north-4.myhuaweicloud.com'; const bucketName = '你的桶名称'; const objectKey = 'remote-file.txt'; const downloadPath = 'C:/test/downloaded-file.txt'; const obsClient = new ObsClient(ak, sk, endpoint); obsClient.getObject(bucketName, objectKey, downloadPath) .then((result) => { if (result.status < 300) { console.log('文件下载成功'); } else { console.log('文件下载失败,错误码:', result.status); } }) .catch((err) => { console.error('文件下载失败:', err); }) .finally(() => { obsClient.close(); }); 四、GoGo语言适用于高性能、高并发的应用开发。1. 准备工作注册华为云账号:同Java。创建OBS桶:同Java。获取访问密钥(AK/SK):同Java。安装OBS Go SDK:使用go get安装华为云OBS Go SDK。go get github.com/huaweicloud/huaweicloud-sdk-go-obs2. 示例代码上传文件package main import ( "fmt" "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" ) func main() { ak := "你的AK" sk := "你的SK" endpoint := "obs.cn-north-4.myhuaweicloud.com" bucketName := "你的桶名称" localFilePath := "C:/test/local-file.txt" objectKey := "remote-file.txt" client, err := obs.New(ak, sk, endpoint) if err != nil { fmt.Println("创建客户端失败:", err) return } defer client.Close() input := &obs.PutFileInput{} input.Bucket = bucketName input.Key = objectKey input.SourceFile = localFilePath output, err := client.PutFile(input) if err != nil { fmt.Println("文件上传失败:", err) return } fmt.Println("文件上传成功,ETag:", output.ETag) } 下载文件package main import ( "fmt" "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" ) func main() { ak := "你的AK" sk := "你的SK" endpoint := "obs.cn-north-4.myhuaweicloud.com" bucketName := "你的桶名称" objectKey := "remote-file.txt" downloadPath := "C:/test/downloaded-file.txt" client, err := obs.New(ak, sk, endpoint) if err != nil { fmt.Println("创建客户端失败:", err) return } defer client.Close() input := &obs.GetObjectInput{} input.Bucket = bucketName input.Key = objectKey input.DownloadPath = downloadPath output, err := client.GetObject(input) if err != nil { fmt.Println("文件下载失败:", err) return } fmt.Println("文件下载成功,ETag:", output.ETag) } 五、C++C++适用于系统级开发和性能敏感的应用。1. 准备工作注册华为云账号:同Java。创建OBS桶:同Java。获取访问密钥(AK/SK):同Java。安装OBS C++ SDK:下载并安装华为云OBS C++ SDK。2. 示例代码上传文件#include <iostream> #include "obs/ObsClient.h" using namespace obs; int main() { std::string ak = "你的AK"; std::string sk = "你的SK"; std::string endpoint = "obs.cn-north-4.myhuaweicloud.com"; std::string bucketName = "你的桶名称"; std::string localFilePath = "C:/test/local-file.txt"; std::string objectKey = "remote-file.txt"; ObsClient client(ak, sk, endpoint); PutObjectRequest request(bucketName, objectKey, localFilePath); auto outcome = client.PutObject(request); if (outcome.IsSuccess()) { std::cout << "文件上传成功,ETag: " << outcome.GetResult().GetETag() << std::endl; } else { std::cout << "文件上传失败: " << outcome.GetError().GetMessage() << std::endl; } return 0; } 下载文件#include <iostream> #include "obs/ObsClient.h" using namespace obs; int main() { std::string ak = "你的AK"; std::string sk = "你的SK"; std::string endpoint = "obs.cn-north-4.myhuaweicloud.com"; std::string bucketName = "你的桶名称"; std::string objectKey = "remote-file.txt"; std::string downloadPath = "C:/test/downloaded-file.txt"; ObsClient client(ak, sk, endpoint); GetObjectRequest request(bucketName, objectKey); request.SetDownloadPath(downloadPath); auto outcome = client.GetObject(request); if (outcome.IsSuccess()) { std::cout << "文件下载成功,ETag: " << outcome.GetResult().GetETag() << std::endl; } else { std::cout << "文件下载失败: " << outcome.GetError().GetMessage() << std::endl; } return 0; } 六、总结华为云OBS提供了多种编程语言的SDK,方便开发者在不同的应用场景中调用OBS服务。本文介绍了Java、Python、JavaScript(Node.js)、Go和C++五种语言的调用方法,涵盖了文件上传和下载的基本操作。开发者可以根据自己的技术栈和项目需求,选择合适的语言和SDK进行开发。更多高级功能,如分片上传、生命周期管理、权限控制等,可以参考华为云OBS的官方文档和SDK文档。
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签