鸿蒙应用集成DeepSeek AI API实战指南
1. 鸿蒙应用与DeepSeek技术整合概述在HarmonyOS鸿蒙操作系统应用生态中接入AI能力已成为当前开发者关注的重点方向。DeepSeek作为国内领先的大模型服务平台其API接口与鸿蒙应用的深度整合能够为终端用户带来更智能的交互体验。这种技术组合特别适合需要自然语言处理、知识问答、内容生成等功能的鸿蒙应用场景。我最近在一个鸿蒙元服务项目中实际接入了DeepSeek的API整个过程涉及到鸿蒙特有的权限配置、网络请求封装以及响应数据处理等多个技术环节。与Android/iOS平台不同鸿蒙的ArkTS开发范式和对分布式能力的支持使得AI能力的集成需要特别注意一些技术细节。2. 开发环境准备与基础配置2.1 开发工具与SDK准备首先需要确保开发环境配置正确安装最新版DevEco Studio建议4.1及以上版本创建或打开已有的鸿蒙应用工程在项目的oh-package.json5中添加网络权限abilities: [ { name: Networking, type: network } ]注意鸿蒙4.0及以上版本需要额外申请ohos.permission.INTERNET权限在module.json5中配置requestPermissions: [ { name: ohos.permission.INTERNET, reason: $string:permission_reason, usedScene: { abilities: [MainAbility], when: always } } ]2.2 DeepSeek API密钥获取访问DeepSeek开发者平台注册账号创建应用获取API Key建议选择适合的套餐记录下API endpoint和认证密钥建议将敏感信息存储在鸿蒙的Preferences工具中import preferences from ohos.data.preferences; async function saveApiKey(context, key) { try { const pref await preferences.getPreferences(context, deepseek_config); await pref.put(api_key, key); await pref.flush(); } catch (err) { console.error(Failed to save API key. Code: ${err.code}, message: ${err.message}); } }3. 网络请求模块实现3.1 鸿蒙HTTP客户端封装鸿蒙提供了ohos.net.http模块处理网络请求我们需要针对DeepSeek API进行定制封装import http from ohos.net.http; import { BusinessError } from ohos.base; class DeepSeekClient { private apiKey: string ; private endpoint: string https://api.deepseek.com/v1; constructor(apiKey: string) { this.apiKey apiKey; } async postRequest(path: string, data: object): Promiseany { let httpRequest http.createHttp(); try { let options: http.HttpRequestOptions { method: http.RequestMethod.POST, header: { Content-Type: application/json, Authorization: Bearer ${this.apiKey} }, extraData: JSON.stringify(data) }; const response await httpRequest.request( ${this.endpoint}${path}, options ); if (response.responseCode http.ResponseCode.OK) { return JSON.parse(response.result.toString()); } else { throw new Error(API request failed with status ${response.responseCode}); } } catch (err) { const error err as BusinessError; console.error(Request error: ${error.code} - ${error.message}); throw error; } finally { httpRequest.destroy(); } } }3.2 请求重试与超时机制考虑到移动网络环境的不稳定性建议实现重试逻辑const MAX_RETRIES 3; const RETRY_DELAY 1000; async function requestWithRetry(client: DeepSeekClient, path: string, data: object, retries MAX_RETRIES): Promiseany { try { return await client.postRequest(path, data); } catch (error) { if (retries 0 (error as BusinessError).code ! 401) { await new Promise(resolve setTimeout(resolve, RETRY_DELAY)); return requestWithRetry(client, path, data, retries - 1); } throw error; } }4. DeepSeek核心功能集成4.1 文本补全接口实现以下是调用DeepSeek文本补全API的示例async function generateText(prompt: string, maxTokens 200): Promisestring { const client new DeepSeekClient(await getApiKey()); const response await requestWithRetry(client, /completions, { model: deepseek-chat, prompt: prompt, max_tokens: maxTokens, temperature: 0.7 }); return response.choices[0].text.trim(); }4.2 流式响应处理对于长文本生成场景建议使用流式响应以提升用户体验import { Socket } from ohos.net.socket; class StreamClient { private socket: Socket; private buffer: string ; constructor(private apiKey: string) { this.socket new Socket(); } async connectStream(prompt: string, callback: (text: string) void) { try { await this.socket.connect({ address: api.deepseek.com, port: 443, tls: true }); const request POST /v1/completions HTTP/1.1\r Host: api.deepseek.com\r Authorization: Bearer ${this.apiKey}\r Content-Type: application/json\r Connection: keep-alive\r Transfer-Encoding: chunked\r \r ${JSON.stringify({ model: deepseek-chat, prompt: prompt, stream: true })}; this.socket.send(request); this.socket.on(message, (data: ArrayBuffer) { this.buffer String.fromCharCode.apply(null, new Uint8Array(data)); const lines this.buffer.split(\n); this.buffer lines.pop() || ; lines.forEach(line { if (line.startsWith(data: )) { const jsonStr line.substring(6); if (jsonStr ! [DONE]) { try { const data JSON.parse(jsonStr); callback(data.choices[0].text); } catch (e) { console.error(Parse error:, e); } } } }); }); } catch (err) { console.error(Stream error:, err); } } close() { this.socket.close(); } }5. 性能优化与缓存策略5.1 响应缓存实现为减少API调用次数可以添加本地缓存import database from ohos.data.database; let db: database.RdbStore; async function initCacheDb(context) { const STORE_CONFIG: database.StoreConfig { name: deepseek_cache.db, securityLevel: database.SecurityLevel.S1 }; const SQL_CREATE_TABLE CREATE TABLE IF NOT EXISTS cache ( key TEXT PRIMARY KEY, value TEXT, timestamp INTEGER ); db await database.getRdbStore(context, STORE_CONFIG); await db.executeSql(SQL_CREATE_TABLE); } async function getCachedResponse(key: string, ttl 3600): Promiseany { const predicates new database.RdbPredicates(cache); predicates.equalTo(key, key); const result await db.query(predicates, [value, timestamp]); if (result.rowCount 0) { const row result.rowAt(0); const now Math.floor(Date.now() / 1000); if (now - row.timestamp ttl) { return JSON.parse(row.value); } } return null; } async function cacheResponse(key: string, value: any) { const data { key: key, value: JSON.stringify(value), timestamp: Math.floor(Date.now() / 1000) }; await db.insert(cache, data); }5.2 请求批处理对于可能同时发起的多个相关请求可以实现批处理async function batchGenerate(prompts: string[]): Promisestring[] { const client new DeepSeekClient(await getApiKey()); const response await client.postRequest(/batch_completions, { operations: prompts.map(prompt ({ model: deepseek-chat, prompt: prompt, max_tokens: 150 })) }); return response.results.map((res: any) res.choices[0].text.trim()); }6. 错误处理与监控6.1 异常分类处理enum ApiError { NETWORK_ERROR 1001, API_LIMIT 1002, AUTH_FAILED 1003, INVALID_REQUEST 1004 } function handleError(error: BusinessError) { switch (error.code) { case 401: console.error(Authentication failed - check your API key); return ApiError.AUTH_FAILED; case 429: console.error(Rate limit exceeded - wait before retrying); return ApiError.API_LIMIT; case 400: console.error(Invalid request:, error.message); return ApiError.INVALID_REQUEST; default: if (error.message.includes(Network)) { console.error(Network connectivity issue); return ApiError.NETWORK_ERROR; } console.error(Unknown error:, error); return error.code; } }6.2 使用HiTrace进行性能监控鸿蒙提供了HiTrace工具链用于性能分析import hiTraceChain from ohos.hiTraceChain; async function tracedRequest(path: string, data: object) { const traceId hiTraceChain.begin(DeepSeek_API_Call); try { hiTraceChain.tracePoint(traceId, START_REQUEST, ); const result await postRequest(path, data); hiTraceChain.tracePoint(traceId, END_REQUEST, Success); return result; } catch (error) { hiTraceChain.tracePoint(traceId, END_REQUEST, Error: ${error.message}); throw error; } finally { hiTraceChain.end(traceId); } }7. 安全最佳实践7.1 API密钥安全管理import cryptoFramework from ohos.security.cryptoFramework; async function encryptApiKey(key: string): Promisestring { const symKeyGenerator cryptoFramework.createSymKeyGenerator(AES256); const keyBlob: cryptoFramework.DataBlob { data: new Uint8Array(Array.from(key).map(c c.charCodeAt(0))) }; const cipher cryptoFramework.createCipher(AES256|GCM|PKCS7); await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKeyGenerator.convertKey(keyBlob)); const encrypted await cipher.doFinal(keyBlob); return Array.from(encrypted.data).map(b b.toString(16).padStart(2, 0)).join(); }7.2 请求签名验证import { BusinessError } from ohos.base; import util from ohos.util; async function signRequest(data: object): Promisestring { try { const timestamp Math.floor(Date.now() / 1000); const nonce new util.Base64Helper().encodeToString( new Uint8Array(cryptoFramework.getRandomValues(16)) ); const message ${timestamp}:${nonce}:${JSON.stringify(data)}; const sha256 cryptoFramework.createHash(SHA256); await sha256.update({ data: new Uint8Array(Array.from(message).map(c c.charCodeAt(0))) }); const hash await sha256.digest(); return Array.from(hash.data).map(b b.toString(16).padStart(2, 0)).join(); } catch (err) { const error err as BusinessError; console.error(Signing failed: ${error.code} - ${error.message}); throw error; } }8. 测试与调试策略8.1 单元测试示例使用鸿蒙的单元测试框架import { describe, it, expect } from ohos/hypium; describe(DeepSeekClient, () { it(should handle network errors, async () { const client new DeepSeekClient(test_key); try { await client.postRequest(/invalid_path, {}); expect().assertFail(); } catch (error) { expect(error).toBeInstanceOf(Error); } }); it(should parse successful response, async () { const mockHttp { createHttp: () ({ request: (url, options) Promise.resolve({ responseCode: 200, result: {choices:[{text:Mock response}]} }), destroy: () {} }) }; // 使用依赖注入替换实际http模块 const client new DeepSeekClient(test_key); const response await client.postRequest(/completions, {}); expect(response.choices[0].text).assertEqual(Mock response); }); });8.2 端到端测试建议创建测试专用的HarmonyOS测试设备或模拟器使用不同的网络环境测试Wi-Fi/4G/5G模拟弱网环境测试重试机制验证API密钥轮换场景测试长时间运行的流式连接稳定性9. 实际应用场景示例9.1 智能助手功能实现Entry Component struct SmartAssistant { State message: string ; State conversation: Array{role: string, content: string} []; private client new DeepSeekClient(); aboutToAppear() { // 初始化API客户端 getApiKey().then(key { this.client new DeepSeekClient(key); }); } build() { Column() { List({ space: 10 }) { ForEach(this.conversation, (item) { ListItem() { Text(${item.role}: ${item.content}) .fontSize(16) } }) } TextInput({ placeholder: 输入你的问题 }) .onChange((value: string) { this.message value; }) Button(发送) .onClick(async () { this.conversation.push({ role: 用户, content: this.message }); const prompt this.conversation.map(m ${m.role}: ${m.content}).join(\n); const response await this.client.postRequest(/completions, { model: deepseek-chat, prompt: prompt, max_tokens: 300 }); this.conversation.push({ role: 助手, content: response.choices[0].text.trim() }); }) } } }9.2 内容生成工具集成async function generateContent(topic: string, style: string professional) { const prompt 请以${style}的风格撰写一篇关于${topic}的短文。要求结构清晰段落分明。; const response await generateText(prompt, 500); const paragraphs response.split(\n\n) .filter(p p.trim().length 0); return { title: 关于${topic}的${style}风格文章, paragraphs: paragraphs }; }10. 性能调优实战经验10.1 减少首屏响应时间预加载模型应用启动时预先建立API连接aboutToAppear() { // 预热连接 this.client.postRequest(/models, {}).catch(() {}); }本地缓存热门响应对常见查询结果进行本地存储const cachedResponse await getCachedResponse(prompt); if (cachedResponse) { return cachedResponse; }使用轻量级初始响应先返回简短结果再补充const initialResponse await generateText(prompt, 100); // ...显示初始结果... const fullResponse await generateText(prompt, 500);10.2 内存管理技巧及时释放资源try { // 使用流式连接 } finally { streamClient.close(); }控制并发请求数const MAX_CONCURRENT 2; const semaphore new Semaphore(MAX_CONCURRENT); async function throttledRequest() { await semaphore.acquire(); try { return await postRequest(...); } finally { semaphore.release(); } }大响应分块处理const CHUNK_SIZE 1024; for (let i 0; i largeText.length; i CHUNK_SIZE) { const chunk largeText.substr(i, CHUNK_SIZE); // 处理分块... }11. 鸿蒙特性深度整合11.1 分布式能力应用利用鸿蒙的分布式特性实现跨设备协同import distributedKVStore from ohos.data.distributedKVStore; async function syncConversation(deviceId: string, conversation: any[]) { const kvManager await distributedKVStore.createKVManager({ context: getContext(), bundleName: com.example.aiservice }); const kvStore await kvManager.getKVStore(conversation_store); await kvStore.put(deviceId, JSON.stringify(conversation)); }11.2 原子化服务封装将DeepSeek能力封装为鸿蒙原子化服务// module.json5 { abilities: [ { name: DeepSeekService, type: service, backgroundModes: [dataTransfer], visible: true, skills: [ { actions: [ action.ai.generate, action.ai.analyze ], entities: [ entity.ai.service ] } ] } ] }12. 商业化部署考量12.1 用量监控与限制class UsageTracker { private dailyUsage: number 0; private lastReset: number Date.now(); constructor(private limit: number) {} checkUsage() { const now Date.now(); if (now - this.lastReset 86400000) { // 24小时 this.dailyUsage 0; this.lastReset now; } if (this.dailyUsage this.limit) { throw new Error(Daily API limit exceeded); } } recordUsage(tokens: number) { this.dailyUsage tokens; } }12.2 多API密钥轮换const API_KEYS [key1, key2, key3]; let currentKeyIndex 0; function getNextApiKey() { currentKeyIndex (currentKeyIndex 1) % API_KEYS.length; return API_KEYS[currentKeyIndex]; } async function smartRequest(path: string, data: object) { let lastError; for (let i 0; i API_KEYS.length; i) { try { const client new DeepSeekClient(getNextApiKey()); return await client.postRequest(path, data); } catch (error) { lastError error; if ((error as BusinessError).code ! 429) break; } } throw lastError; }13. 持续集成与交付13.1 自动化测试流水线建议的CI流程代码提交触发构建运行单元测试和静态分析部署到测试环境执行端到端测试验证API调用配额安全扫描打包发布13.2 环境配置管理interface AppConfig { apiEndpoint: string; maxRetries: number; cacheTtl: number; } const ENV_CONFIGS: Recordstring, AppConfig { development: { apiEndpoint: https://dev.api.deepseek.com, maxRetries: 5, cacheTtl: 60 }, production: { apiEndpoint: https://api.deepseek.com, maxRetries: 3, cacheTtl: 3600 } }; function getConfig(): AppConfig { return ENV_CONFIGS[process.env.NODE_ENV || production]; }14. 用户体验优化技巧14.1 加载状态设计Component struct LoadingIndicator { State rotateAngle: number 0; build() { Stack() { Image($r(app.media.loading_icon)) .width(40) .height(40) .rotate({ angle: this.rotateAngle }) .onAppear(() { setInterval(() { this.rotateAngle (this.rotateAngle 10) % 360; }, 50); }) } } }14.2 渐进式结果显示async function* streamResponse(prompt: string) { const stream new StreamClient(await getApiKey()); let fullText ; await stream.connectStream(prompt, (chunk) { fullText chunk; return fullText; // 可以在此处更新UI }); return fullText; }15. 调试与问题排查15.1 常见错误代码速查错误代码含义解决方案400请求参数错误检查请求体格式和参数401认证失败验证API密钥是否有效429请求过多降低请求频率或升级套餐500服务器错误稍后重试或联系支持503服务不可用检查DeepSeek服务状态15.2 网络问题诊断import connection from ohos.net.connection; async function checkNetwork() { const netCap await connection.getDefaultNet(); if (!netCap) { console.error(No network connection); return false; } const stats await connection.getStats(); console.log(Network type: ${netCap.type}); console.log(Signal strength: ${stats.signalStrength}); return netCap.type ! none; }16. 高级功能扩展16.1 自定义模型微调async function fineTuneModel(trainingData: any[], baseModel deepseek-base) { const client new DeepSeekClient(await getApiKey()); const response await client.postRequest(/fine_tuning, { model: baseModel, training_data: trainingData, epochs: 3 }); return response.model_id; }16.2 多模态处理async function analyzeImage(imageData: Uint8Array) { const client new DeepSeekClient(await getApiKey()); const base64Data new util.Base64Helper().encodeToString(imageData); const response await client.postRequest(/vision, { image: base64Data, task: describe }); return response.description; }17. 资源清理与优化17.1 缓存清理策略async function cleanCache(olderThanDays 7) { const cutoff Math.floor(Date.now() / 1000) - olderThanDays * 86400; const predicates new database.RdbPredicates(cache); predicates.lessThanOrEqualTo(timestamp, cutoff); await db.delete(predicates); }17.2 连接池管理class ConnectionPool { private pool: DeepSeekClient[] []; private waitQueue: ((client: DeepSeekClient) void)[] []; constructor(private size: number, private apiKey: string) { for (let i 0; i size; i) { this.pool.push(new DeepSeekClient(apiKey)); } } async acquire(): PromiseDeepSeekClient { if (this.pool.length 0) { return this.pool.pop()!; } return new Promise(resolve { this.waitQueue.push(resolve); }); } release(client: DeepSeekClient) { if (this.waitQueue.length 0) { const resolve this.waitQueue.shift()!; resolve(client); } else { this.pool.push(client); } } }18. 兼容性处理18.1 多版本鸿蒙适配function getHttpModule() { try { // 尝试加载新版本模块 return require(ohos.net.http); } catch (e) { // 回退到旧版本 return require(system.network); } }18.2 降级策略实现async function withFallback(mainAction: () Promiseany, fallbackAction: () Promiseany) { try { return await mainAction(); } catch (error) { console.warn(Main action failed, trying fallback:, error); try { return await fallbackAction(); } catch (fallbackError) { console.error(Fallback also failed:, fallbackError); throw new Error(All strategies failed); } } }19. 监控与日志19.1 关键指标监控import hiAppEvent from ohos.hiAppEvent; function logApiEvent(success: boolean, latency: number, tokens: number) { hiAppEvent.write({ domain: DEEPSEEK_API, name: api_call, event: { success: success, response_time: latency, tokens_used: tokens } }).catch(err { console.error(Failed to log event:, err); }); }19.2 诊断日志收集import logger from ohos.logger; const apiLogger logger.getLogger(DeepSeekAPI); function logRequestDetails(request: any, response: any) { apiLogger.debug(API Request: %{public}s, JSON.stringify(request)); apiLogger.debug(API Response: %{public}s, JSON.stringify(response)); if (response.error) { apiLogger.error(API Error: %{public}s, response.error.message); } }20. 项目部署与发布20.1 应用签名配置确保在build-profile.json5中正确配置签名信息signingConfigs: [ { name: release, material: { certpath: sign/deepseek.p12, storePassword: your_password, keyAlias: deepseek, keyPassword: your_password, signAlg: SHA256withECDSA, profile: sign/deepseek.p7b, type: pkcs12 } } ]20.2 应用市场提交清单完整的应用签名文件各分辨率截图和演示视频详细的隐私政策说明API使用声明文件适配的不同设备类型清单多语言资源文件

相关新闻

3步找回QQ空间全部历史说说:GetQzonehistory保姆级上手指南

3步找回QQ空间全部历史说说:GetQzonehistory保姆级上手指南

3步找回QQ空间全部历史说说:GetQzonehistory保姆级上手指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 五年前的说说从QQ空间里找不到了。GetQzonehistory通过扫码登录自…

2026/9/21 6:51:58 阅读更多 →
Vibe Coding工具选型实战:从自然语言理解到可控代理的完整评估框架

Vibe Coding工具选型实战:从自然语言理解到可控代理的完整评估框架

自从“Vibe Coding”这个概念火起来之后,我身边几乎每个人都在讨论同一个问题:到底选哪个工具?GitHub Copilot、Cursor、Windsurf、Codeium、Aider、Cline,还有各种号称能“对话式写代码”的新产品,名字多得能绕地球一…

2026/9/20 4:43:14 阅读更多 →
Torch-TensorRT源码工程评测:PyTorch模型静态编译TensorRT全解析

Torch-TensorRT源码工程评测:PyTorch模型静态编译TensorRT全解析

这两年PyTorch转TensorRT的部署路径,我踩过的坑比写过的代码还多。早先做推理优化,最头疼的就是手写插件和TensorRT的C API,一个模型能从周四调到下周一。后来NVIDIA把Torch-TensorRT提出来,宣称“PyTorch模型直接编译成TensorRT …

2026/9/21 6:50:39 阅读更多 →

最新新闻

郑州seo顾问热狗hotdoger拆解3个实战案例教你搞定网站UI

郑州seo顾问热狗hotdoger拆解3个实战案例教你搞定网站UI

郑州seo顾问热狗hotdoger拆解3个实战案例教你搞定网站UI 不会写代码却想做个像样的官网?这种焦虑我懂。 很多老板或运营负责人,手里攥着预算,脑子里有画面,但对着设计师提的需求,心里直打鼓:这到底合不合理?怎么验收?怎么让网站既能留住人,又能被搜索引擎抓到?…

2026/9/21 6:44:12 阅读更多 →
2026最新wordpress调用字段避坑指南

2026最新wordpress调用字段避坑指南

2026最新wordpress调用字段避坑指南 找建站公司怕被坑高价?这是很多老板和运营新人的心头大患。很多公司报价动辄几万,说得天花乱坠,其实底层技术也就那样。2026最新的数据显示,超过60%的中小企业网站其实可以用更透明的开源方案搞定,比如WordPress。今天咱们不聊虚的,直接拆解Word…

2026/9/21 6:29:22 阅读更多 →
实战案例揭秘:wordpress删除rss的3个关键坑

实战案例揭秘:wordpress删除rss的3个关键坑

实战案例揭秘:wordpress删除rss的3个关键坑 域名解析改错,服务器配置没跟上,导致后台能改前台打不开?这种“域名服务器搞不懂”的噩梦,我在给客户做运维时见过太多次。上个月刚处理的一个 实战案例…

2026/9/21 6:15:47 阅读更多 →
3个实战案例拆解i网站建设报价,拒绝被坑

3个实战案例拆解i网站建设报价,拒绝被坑

3个实战案例拆解i网站建设报价,拒绝被坑 网站做好了没人访问?这不仅是流量焦虑,更是建站前的预算盲区。很多老板拿着“i网站建设”这个模糊的概念去询价,结果被报出从几千到几十万不等的天价,心里直打鼓。…

2026/9/21 6:03:14 阅读更多 →
网站建设的探讨与研究速查手册

网站建设的探讨与研究速查手册

网站建设探讨与研究:5大费用陷阱与选型注意事项 网站做好了没人访问,这是无数甲方老板和运营负责人深夜里最真实的焦虑。钱花出去了,服务器租了,域名买了,甚至SEO优化都上了,结果后台流量曲线平得像心电图停搏。很多人以为技术决定成败,但在我看来, 注意事项 往往比技术本身更决定生死。…

2026/9/21 5:46:06 阅读更多 →
Simulink与FlightGear联合仿真:飞行器控制算法三维可视化验证平台搭建

Simulink与FlightGear联合仿真:飞行器控制算法三维可视化验证平台搭建

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 5:38:52 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →