京东秒杀原来价格是'动态'的
上午的洗碗凝珠,秒杀页面和下单按钮都是 9.75,到了支付界面就是 16.9. 狗东客服就一句价格是动态的,真是狗.
xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。
上午的洗碗凝珠,秒杀页面和下单按钮都是 9.75,到了支付界面就是 16.9. 狗东客服就一句价格是动态的,真是狗.
一、概述总结 飞创证书查询系统是微擎应用市场的一款专业证书管理工具,由KaijingStudio开发,该系统是一款高度自定义的证书管理与查询解决方案,适用于各行各业,旨在帮助企业和机构实现证书信息的数字化管理、快速查询与批量生成。 系统核心优势在于"零技术门槛"——用户无需编程基础,只需填写相应信息即可自动生成证书,大幅降低证书制作与管理成本。目前已获得14家企业采用,在微擎平台拥有5.0分的信誉评分和应用评分。 二、功能介绍 核心功能模块: 高度自定义字段系统 高度自定义模板引擎 智能查询系统 批量打印模板 多平台适配 技术特性: 三、适用场景与行业价值 适用场景: 场景类型 具体应用 教育培训 学员结业证书、培训合格证、在线课程证书 企业认证 员工资质证书、产品认证证书、授权经销商证书 行业协会 会员资格证书、技能等级证书、荣誉奖项证书 政府机构 行政许可证书、资质认定证书、电子证照 赛事活动 参赛证书、获奖证书、志愿者服务证书 行业价值: 四、常见问题解答(Q&A) Q1:这个系统需要技术背景才能使用吗? A:不需要。系统设计初衷就是"简单易操作",普通工作人员只需填写信息即可自动生成证书,无需编程或设计基础。 Q2:证书模板可以自定义设计吗? A:完全可以。系统支持高度自定义模板,您可以根据品牌VI设计专属证书样式,包括LOGO、配色、版式等。 Q3:用户如何查询证书? A:用户可通过微信公众号或小程序,输入指定信息(如姓名、证书编号等)进行查询。查询条件支持后台自定义设置。 Q4:是否支持批量生成证书? A:支持。系统提供批量打印模板功能,可一次性生成大量证书,适合毕业季、培训结业等批量场景。 Q5:数据安全性如何保障? A:系统源码已加密,部署在微擎平台,数据存储安全可靠。同时支持权限管理,确保敏感信息不被泄露。 Q6:可以部署到抖音小程序吗? A:系统本身支持多平台扩展,具体抖音小程序定制开发需求可联系开发者KaijingStudio进行商谈。 Q7:系统对服务器有什么要求? A:需要支持PHP7.1+的运行环境,建议使用微擎官方推荐的服务器配置以确保最佳性能。
一、概述总结 随心项目管理系统是一款专为外包团队、设计团队及项目驱动型组织打造的轻量级项目管理工具。该系统由开发者基于自身实际需求开发,旨在解决项目分类管理、进度跟踪及团队协作中的常见痛点,以低成本、免开发的方式帮助中小团队快速实现项目数字化管理。 核心定位:聚焦项目全生命周期管理,提供从项目创建、任务分配到进度查询的一站式解决方案,特别适合需要精细化流程管理的外包服务团队。 二、功能介绍 三、适用场景与行业价值 适用场景 场景类型 具体应用 外包服务团队 软件外包、设计外包项目全流程管理 创意工作室 美工、UI/UX设计项目进度管控 小型技术团队 内部项目分类与任务分配 自由职业者联盟 多人协作项目的进度同步 行业价值 四、产品参数与购买信息 问答环节(Q&A) Q1:这个系统适合多大的团队使用? A:随心项目管理系统主要面向中小型外包团队、设计工作室及10-50人的项目驱动型组织。系统轻量易用,无需专职IT人员维护,特别适合没有技术开发能力但急需项目管理工具的团队。 Q2:购买后如何部署使用? A:系统基于微擎平台交付,购买后可直接在您的微擎系统中安装。支持微信公众号接入,需确保服务器环境满足PHP7.1要求。具体部署可参考微擎官方文档或联系卖家客服。 Q3:系统数据安全性如何保障? A:系统部署在您自己的服务器上,数据自主可控。微擎平台提供官方正品保障,开发者已通过实名认证和企业认证,信誉指数5.00分,可放心购买。 Q4:是否支持多项目管理? A:是的,系统核心功能就是项目分类管理,支持同时管理多个项目,按客户、类型、状态等多维度分类,满足外包团队多项目并行的管理需求。 Q5:与普通项目管理工具(如Teambition、Tower)相比有什么优势? A:随心项目管理系统深度适配外包团队工作流程,特别是针对美工、UI等创意岗位优化了项目分类和进度查询方式。同时基于微信生态,无需额外安装APP,在移动端使用更便捷,且一次购买永久使用,长期使用成本更低。 温馨提示:请勿线下交易!90%的欺诈、纠纷、资金盗取均由线下交易导致。请通过微擎官方平台完成购买,享受消费保障服务。
刚开始我还以为会很难呢,结果看了一下就明白了。哈哈 😄

跨境业务的快速发展为全球经济带来了新的机遇,但随之而来的网络安全挑战也愈加严峻。不同地区的法规、文化和网络环境使得跨境业务面临独特的安全威胁。尤其是来自不同国家和地区的IP地址,可能涉及到各种类型的网络攻击和欺诈活动。 这些问题不仅给企业的网络安全带来巨大威胁,还可能对企业的声誉、财务安全和合规性造成长期影响。因此,跨境业务需要借助有效的IP风险情报服务,提前识别并应对这些潜在的安全威胁。 IP风险情报是通过对IP地址及其相关数据进行分析,从而识别和预测可能的网络安全威胁。它能够提供以下几个重要功能: IP风险情报服务通过对全球范围内的IP地址进行实时监控和更新,识别出被标记为恶意的IP地址。这些IP地址可能与网络攻击、数据泄露或欺诈活动相关联。通过对恶意IP的实时警报,跨境业务能够有效阻止攻击的发生。 攻击者往往使用代理或VPN来隐藏真实IP地址,从而规避安全系统的检测。IP风险情报服务可以通过IP地址的特殊模式、历史数据和地理位置信息,识别是否存在代理或VPN的使用,帮助企业判断其是否为合法用户。 每个IP地址都有一个信誉评分,反映其历史行为和安全性。通过对这些评分的分析,企业能够判断某个IP是否属于高风险区域。对那些信誉较低的IP进行封锁或限制访问,可以有效减少安全隐患。 在跨境业务中,某些地区可能会存在较高的网络攻击频率和欺诈风险。通过IP风险情报服务,企业能够对不同地区的IP进行风险分析,制定更为精准的防护策略。 某跨境电商公司在拓展国际市场的过程中,发现其网站常常遭遇恶意流量攻击,尤其是来自某些特定国家和地区的IP地址。为了保障网络安全,该公司决定引入IP风险情报服务,并根据以下几个步骤进行了安全优化: 通过IP风险情报,该公司能够实时识别来自恶意IP的流量,并快速阻止其进入系统。这些恶意IP通常与DDoS攻击、数据盗窃和账户滥用等行为有关。 在进行订单处理和用户身份验证时,IP风险情报帮助该公司识别了大量使用VPN的IP地址,许多伪装成来自合法地区的攻击者被成功识别并封锁。 利用IP信誉评分,企业能够有效评估每个IP的安全性,并采取相应的防护措施。例如,对于来自高风险国家的IP地址,增加了多重身份验证措施,减少了欺诈行为。 通过这些措施,该电商公司成功降低了欺诈风险,提升了交易安全性,也有效保障了客户的个人信息和资金安全。 在选择IP风险情报服务时,企业需要考虑以下几个因素: 例如,IP数据云提供全球范围内的IP地址风险情报服务,能够识别各类恶意IP、代理和VPN,并提供精准的IP信誉评分,帮助跨境企业加强网络安全防护。 随着跨境业务的不断扩展,网络安全已成为企业面临的重要挑战。通过有效利用IP风险情报,企业可以实时识别恶意IP、代理和VPN,保护自身免受网络攻击和数据泄露等风险。IP数据云等专业的IP情报服务,不仅能提升跨境业务的安全性,还能帮助企业优化全球运营策略,减少网络威胁对业务的影响。因此,选择一个可靠的IP风险情报服务,并将其应用于日常的安全防护中,已成为跨境企业保障网络安全的必然之举。一、跨境业务面临的网络安全挑战
常见的网络安全风险包括:

二、IP风险情报如何帮助识别恶意IP、代理和VPN
1. 恶意IP识别:
2. 代理和VPN检测:
3. IP信誉评分:
4. 地区性风险分析:
三、实际案例:IP风险情报在跨境电商中的应用
1. 识别恶意流量:
2. 代理与VPN检测:
3. 风险评分优化:
四、如何选择适合的IP风险情报服务
五、总结
你想要基于HarmonyOS 6.0和ArkTS语言开发一个TodoList(待办清单)应用,这篇文章会从项目搭建、核心功能实现到界面美化,一步步带你完成一个可运行、功能完整的TodoList应用,适合HarmonyOS开发新手学习和实践。 在开始编码前,确保你已完成以下准备: 配置项目信息: 首先定义待办事项的数据结构,创建 修改 核心方法: UI组件: 交互优化: 点击“运行”按钮,应用启动后: 你可以基于此基础版本扩展更多实用功能: 这个TodoList应用覆盖了ArkTS开发的核心知识点(状态管理、组件使用、事件处理),是HarmonyOS新手入门的经典练手项目,你可以直接复制代码运行,也可以根据自己的需求调整界面和功能。从零开始开发HarmonyOS 6.0 TodoList应用(ArkTS版)

一、开发环境准备
二、项目创建
三、核心功能实现

3.1 数据模型定义
model/TodoItem.ets文件:/**
* 待办事项数据模型
*/
export interface TodoItem {
// 唯一标识
id: string;
// 待办内容
content: string;
// 是否完成
isCompleted: boolean;
// 创建时间
createTime: string;
}
/**
* 生成唯一ID
*/
export function generateId(): string {
return Date.now().toString() + Math.random().toString(36).substr(2, 9);
}
/**
* 格式化时间
*/
export function formatTime(time: number): string {
const date = new Date(time);
return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
}3.2 主页面实现(核心功能)
pages/Index.ets,实现待办事项的添加、删除、状态切换、清空功能:@Entry
@Component
struct TodoListPage {
// 待办事项列表(状态管理)
@State private todoList: TodoItem[] = [];
// 输入框内容
@State private inputContent: string = '';
// 页面标题
private title: string = '我的待办清单';
build() {
Column() {
// 标题区域
Text(this.title)
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ top: 20, bottom: 15 })
.alignSelf(ItemAlign.Center);
// 输入和添加区域
Row({ space: 10 }) {
TextField(this.inputContent, (value: string) => {
this.inputContent = value;
})
.placeholder('请输入待办事项...')
.width('70%')
.height(40)
.border({ width: 1, radius: 8, color: '#E5E5E5' })
.padding({ left: 10 });
Button('添加')
.width('20%')
.height(40)
.backgroundColor('#007DFF')
.fontColor(Color.White)
.borderRadius(8)
.onClick(() => this.addTodoItem());
}
.margin({ bottom: 20 })
.padding({ left: 15, right: 15 });
// 待办事项列表区域
List({ space: 10 }) {
ForEach(this.todoList, (item: TodoItem) => {
ListItem() {
Row({ space: 10 }) {
// 完成状态切换复选框
Checkbox()
.select(item.isCompleted)
.onChange((isChecked: boolean) => {
this.toggleTodoStatus(item.id);
})
.width(20)
.height(20);
// 待办内容(完成时加删除线)
Text(item.content)
.fontSize(16)
.decoration({ type: item.isCompleted ? TextDecorationType.LineThrough : TextDecorationType.None })
.fontColor(item.isCompleted ? '#999999' : '#333333')
.flexGrow(1);
// 创建时间
Text(item.createTime)
.fontSize(12)
.fontColor('#999999')
.width(100);
// 删除按钮
Button('删除')
.width(60)
.height(30)
.backgroundColor('#FF4D4F')
.fontColor(Color.White)
.borderRadius(6)
.fontSize(12)
.onClick(() => this.deleteTodoItem(item.id));
}
.padding(10)
.backgroundColor(Color.White)
.borderRadius(8)
.shadow({ radius: 2, color: '#00000010', offsetX: 0, offsetY: 2 });
}
})
}
.width('100%')
.flexGrow(1)
.padding({ left: 15, right: 15 });
// 清空按钮(有数据时显示)
if (this.todoList.length > 0) {
Button('清空所有待办')
.width('90%')
.height(40)
.backgroundColor('#F5F5F5')
.fontColor('#666666')
.borderRadius(8)
.margin({ top: 10, bottom: 20 })
.onClick(() => this.clearAllTodos());
}
}
.width('100%')
.height('100%')
.backgroundColor('#F8F8F8');
}
/**
* 添加待办事项
*/
private addTodoItem(): void {
// 空内容校验
if (this.inputContent.trim() === '') {
prompt.showToast({ message: '待办内容不能为空!' });
return;
}
// 创建新待办项
const newTodo: TodoItem = {
id: generateId(),
content: this.inputContent.trim(),
isCompleted: false,
createTime: formatTime(Date.now())
};
// 添加到列表
this.todoList.push(newTodo);
// 清空输入框
this.inputContent = '';
}
/**
* 切换待办事项完成状态
* @param id 待办项ID
*/
private toggleTodoStatus(id: string): void {
const index = this.todoList.findIndex(item => item.id === id);
if (index !== -1) {
this.todoList[index].isCompleted = !this.todoList[index].isCompleted;
}
}
/**
* 删除待办事项
* @param id 待办项ID
*/
private deleteTodoItem(id: string): void {
this.todoList = this.todoList.filter(item => item.id !== id);
}
/**
* 清空所有待办事项
*/
private clearAllTodos(): void {
this.todoList = [];
}
}
// 导入数据模型
import { TodoItem, generateId, formatTime } from '../model/TodoItem';
// 导入提示框
import prompt from '@ohos.promptAction';3.3 代码核心解释
@State装饰器管理待办列表(todoList)和输入框内容(inputContent),状态变化会自动触发UI刷新。addTodoItem():校验输入内容,创建新待办项并添加到列表,清空输入框;toggleTodoStatus():根据ID切换待办项的完成状态;deleteTodoItem():根据ID过滤删除指定待办项;clearAllTodos():清空整个待办列表。TextField:用于输入待办内容;Checkbox:标记待办项是否完成;List + ForEach:循环渲染待办列表;Button:实现添加、删除、清空操作。四、运行效果

五、功能扩展建议(可选)
@ohos.data.preferences将待办数据保存到本地,重启应用不丢失;总结
@State状态管理实现UI与数据的双向绑定,通过List+ForEach渲染动态列表;
几个月前刚出的,UI 非常棒。
OpenClaw模型接入全指南:免费Token+新模型适配(含Higress解决方案) 当前AI圈迭代速度迅猛,智谱GLM-5、MiniMax M2.5等新模型接连发布,在性能和性价比上实现大幅突破,但OpenClaw用户普遍面临两大痛点:一是Token消耗过快、付费成本高,二是新模型无法及时适配,需等待官方发版升级。本文将整合两大核心解决方案——讯飞星辰免费Token计划(解决成本问题)与Higress AI网关(解决新模型适配问题),搭配详细操作步骤,帮助OpenClaw用户零成本、高效适配各类前沿模型,畅享大模型生产力。 一、基础保障:讯飞星辰免费Token计划(零成本用模型) 对于追求低成本使用OpenClaw的用户,讯飞星辰MaaS平台推出的春节免费Token计划,是经实测可行的优选方案,可有效解决Token消耗过快的核心痛点,适配各类OpenClaw基础使用场景。 1.1 核心优势 补充说明:官方宣传Token使用无速度限制,实际使用中会存在轻微卡顿,整体流畅度可满足日常文本生成、简单编程等需求,属于可接受范围。 1.2 前期准备:获取讯飞星辰Token及API授权 配置前需先前往讯飞星辰MaaS平台,获取模型API授权、API Key等关键信息,具体步骤如下: 1.3 OpenClaw配置步骤(附可直接复制模板) 讯飞星辰MaaS平台提供OpenAI兼容接口,可在OpenClaw中按“OpenAI / OpenAI-Compatible”模式直接配置,全程无需修改复杂参数: 可直接复制的配置模板 { }, }, }, }, }, }, } 二、进阶解决方案:Higress AI网关(适配各类新模型) 随着智谱GLM-5、MiniMax M2.5等新模型密集发布,OpenClaw原生存在“模型硬编码”问题——新模型无法通过配置直接接入,需等待官方发版升级,严重滞后于模型迭代速度。而Higress AI网关通过“模型配置与网关解耦”的设计,可彻底解决这一痛点,让OpenClaw用户即时适配各类前沿模型。 2.1 OpenClaw原生模型支持困境 目前OpenClaw的各个provider默认模型均为硬编码,新模型发布后无法通过配置支持,需等待维护者处理相关issue并发版升级,具体痛点如下: 2.2 Higress AI网关核心优势 Higress采用与OpenClaw原生完全不同的设计思路,将模型配置与网关解耦,新增模型无需升级,热更新即时生效,核心优势如下: 2.3 Higress接入OpenClaw详细步骤 Higress通过专属Integration Skill简化配置流程,全程无需手动修改配置文件,仅需通过OpenClaw对话即可完成: 使用新模型:配置完成后,直接在OpenClaw中指定模型即可使用,示例如下: 2.4 后续新增模型:一句话快速适配 若后续DeepSeek发布V4、Qwen推出新版本等,无需重启网关、无需升级组件,仅需在OpenClaw中发送简单指令即可完成适配: 指令发送后,配置热加载即时生效,真正实现“模型迭代无滞后”。 三、重点关注:GLM-5与MiniMax M2.5核心能力解析 当前AI圈最值得关注的两大新模型——GLM-5(开源标杆)与MiniMax M2.5(性价比之王),通过Higress可直接接入OpenClaw,其核心能力如下,方便用户根据需求选择使用: 3.1 GLM-5:开源界的“系统架构师” 智谱2月11日发布的GLM-5,采用MoE架构,744B总参数中每次仅激活44B,配合DeepSeek稀疏注意力机制,在保持高性能的同时大幅降低部署成本,核心亮点如下: 3.2 MiniMax M2.5:Agent时代的性价比之王 MiniMax在GLM-5发布一天后推出的M2.5,主打“真实世界生产力”,性能与成本优势突出,核心亮点如下: 四、高效使用技巧:Higress自动路由功能 GLM-5与MiniMax M2.5定位不同(GLM-5架构能力强,M2.5性价比高),Higress的自动路由功能可根据任务类型智能调度模型,无需手动切换,提升使用效率: 4.1 配置自动路由规则 在OpenClaw中发送指令,即可配置自动路由规则,示例如下: 4.2 使用方法 配置完成后,仅需在OpenClaw中指定模型为“higress/auto”,系统将根据消息内容自动选择最合适的模型进行推理,兼顾性能与成本。 五、常见问题及补充说明 5.1 讯飞星辰Token相关问题 5.2 Higress网关相关问题 六、总结与后续支持 6.1 核心方案对比 对比项 OpenClaw原生 OpenClaw+讯飞星辰Token OpenClaw+Higress 使用成本 较高(需付费Token) 零成本 按需选择(可搭配免费/付费Token) 新模型支持 需等待官方发版 仅支持讯飞星辰相关模型 一句话配置,即时适配 操作难度 中等 简单(模板复制) 极简(对话指令) 维护成本 高(等官方更新) 低(官方保障) 低(自主可控,即时响应) 6.2 后续支持 6.3 相关链接 综上,讯飞星辰免费Token计划解决了OpenClaw用户的成本痛点,Higress AI网关解决了新模型适配痛点,两者结合可让用户零成本、高效使用各类前沿AI模型。无论是追求低成本的普通用户,还是需要使用新模型提升生产力的进阶用户,均可按照本文步骤操作,快速实现模型接入与高效使用。 本文由mdnice多平台发布
"meta": {"lastTouchedVersion": "2026.2.1",
"lastTouchedAt": "2026-02-04T12:14:10.945Z"
"models": {"mode": "merge",
"providers": {
"ds": {
"baseUrl": "https://maas-api.cn-huabei-1.xf-yun.com/v2",
"apiKey": "YOUR_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "xopdeepseekv32",
"name": "DeepSeek-V3.2",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0.0025,
"output": 0.01,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 32768,
"maxTokens": 32768
}
]
}
}
"agents": {"defaults": {
"model": {
"primary": "ds/xopdeepseekv32"
},
"models": {
"ds/xopdeepseekv32": {
"alias": "xopdeepseekv32"
}
},
"compaction": {
"mode": "safeguard"
},
"maxConcurrent": 4,
"subagents": {
"maxConcurrent": 8
}
}
"messages": {"ackReactionScope": "group-mentions"
"commands": {"native": "auto",
"nativeSkills": "auto"
"channels": {
},
"gateway": {"mode": "local",
"tailscale": {
"mode": "off"
}
"plugins": {"entries": {
},
"installs": {
}
}
随着高校信息化建设的推进,传统的宿舍管理模式存在效率低、信息孤岛多、交互体验差等问题。新生入住宿舍是学校管理中非常关键的环节,从分配床位、办理入住手续,到查询宿舍信息,管理流程繁杂。 本篇文章以 HarmonyOS 6.0 原生开发 为基础,分享 DormMate 新生宿舍管理系统中“欢迎区域”模块的实现方法。重点解析 ArkTS 声明式 UI 构建、多端适配以及鸿蒙原生组件使用技巧,为想基于 HarmonyOS 6.0 进行原生应用开发的读者提供参考。 传统管理痛点: 系统设计目标: 技术选型: HarmonyOS 6.0 基于“一次开发,多端部署”的核心理念,提供了 分布式软总线、分布式数据管理 和 统一的 ArkUI 框架。ArkTS 作为其原生开发语言,具备以下优势: 在 DormMate 系统中,我们将利用 ArkTS + ArkUI 构建原生界面,充分发挥 HarmonyOS 6.0 的分布式特性,实现多端统一的欢迎页面。 下面是“欢迎区域”的核心实现代码,以及逐行解析。该模块的功能包括: 在 HarmonyOS 6.0 中,该组件可通过以下方式实现多端自适应: 布局适配:通过媒体查询( HarmonyOS 6.0 原生开发优势: UI 设计技巧: 开发效率: 本文介绍了基于 HarmonyOS 6.0 原生开发 的 DormMate 新生宿舍管理系统欢迎区域模块实现思路。通过 ArkTS + ArkUI 构建的原生界面,充分利用了鸿蒙系统的分布式能力和原生渲染优势,为新生提供了一个简洁、易读、现代化的入口界面。 HarmonyOS 原生开发在系统集成度、性能表现和多端适配方面更具优势,尤其适合深度适配鸿蒙生态的应用。该欢迎区域组件具备良好的可扩展性,可快速添加公告、快捷入口等功能,并天然支持在手机、平板、桌面端等多设备上统一呈现。 DormMate 的设计理念是:原生、高效、跨端统一,为学校宿舍管理系统提供了一套深度适配 HarmonyOS 生态的前端解决方案。纯原生适配!ArkTS 开发 DormMate新生系统欢迎界面全解析

前言

背景
HarmonyOS 6.0 原生开发介绍
特性 HarmonyOS 6.0 原生开发 跨端开发 ✅ 天然支持手机、平板、智慧屏、桌面端等多终端部署 UI 构建 ✅ 声明式 UI 语法,与 相近但更贴合鸿蒙系统 性能 ✅ 系统级深度优化,原生渲染性能更佳 系统能力 ✅ 全面调用 HarmonyOS 分布式能力、系统服务 开发核心代码:欢迎区域实现
完整代码
@Entry
@Component
struct WelcomeSection {
// 获取系统主题
@State theme: ThemeConstants = getThemeConstants();
build() {
Column() {
this.buildWelcomeCard()
}
.padding(16)
.width('100%')
.backgroundColor(this.theme.backgroundColor)
}
/**
* 构建欢迎区域卡片
*/
@Builder
buildWelcomeCard() {
Row() {
// 文字内容区域
Column() {
// 欢迎标题
Text('欢迎使用新生宿舍管理系统')
.fontSize(this.theme.headlineSmall.fontSize)
.fontWeight(FontWeight.Bold)
.fontColor(this.theme.onSurface)
.margin({ bottom: 8 })
// 功能描述
Text('为新生提供便捷的宿舍分配、入住流程管理和宿舍信息查询服务')
.fontSize(this.theme.bodyMedium.fontSize)
.fontColor(this.theme.onSurfaceVariant)
.margin({ bottom: 16 })
.maxLines(2)
.textOverflow({ overflow: TextOverflow.Ellipsis })
// 入住季标签
Text('2024届新生入住季')
.fontSize(this.theme.labelLarge.fontSize)
.fontWeight(FontWeight.Bold)
.fontColor(this.theme.primary)
.backgroundColor(this.theme.primaryContainer)
.padding({ left: 16, right: 16, top: 8, bottom: 8 })
.borderRadius(20)
}
.alignItems(ItemAlign.Start)
.flexGrow(1) // 占据剩余空间,适配多端
// 装饰图标区域
Stack() {
Text('宿')
.fontSize(this.theme.displayLarge.fontSize)
.fontWeight(FontWeight.Bold)
.fontColor(this.theme.primary)
}
.width(100)
.height(100)
.backgroundColor(this.theme.primaryContainer)
.borderRadius(20)
.justifyContent(FlexAlign.Center)
.margin({ left: 16 })
}
.width('100%')
.padding(24)
// 渐变背景
.backgroundImage(
LinearGradient.createLinearGradient(
{ x: 0, y: 0 }, // 起始点
{ x: 1, y: 0 }, // 结束点
[
this.theme.surfaceVariant + '80', // 带透明度的表面变体色
this.theme.surface + 'CC' // 带透明度的表面色
]
)
)
.borderRadius(16)
}
}
/**
* 主题常量定义(模拟系统主题,实际开发可通过AbilityStage获取)
*/
interface ThemeConstants {
backgroundColor: string;
surface: string;
surfaceVariant: string;
onSurface: string;
onSurfaceVariant: string;
primary: string;
primaryContainer: string;
headlineSmall: { fontSize: number };
bodyMedium: { fontSize: number };
labelLarge: { fontSize: number };
displayLarge: { fontSize: number };
}
/**
* 获取主题常量(简化实现,实际项目建议使用主题管理)
*/
function getThemeConstants(): ThemeConstants {
// 亮色主题示例,实际可根据系统设置动态切换
return {
backgroundColor: '#f9f9f9',
surface: '#ffffff',
surfaceVariant: '#f0f0f0',
onSurface: '#1d1d1f',
onSurfaceVariant: '#6e6e73',
primary: '#007aff', // 鸿蒙系统蓝色
primaryContainer: '#007aff1a', // 主色透明变体
headlineSmall: { fontSize: 24 },
bodyMedium: { fontSize: 16 },
labelLarge: { fontSize: 14 },
displayLarge: { fontSize: 64 }
};
}
逐行解析
1. 组件结构与入口
@Entry
@Component
struct WelcomeSection {
@State theme: ThemeConstants = getThemeConstants();
build() {
Column() {
this.buildWelcomeCard()
}
.padding(16)
.width('100%')
.backgroundColor(this.theme.backgroundColor)
}@Entry:标记该组件为应用入口组件@Component:声明这是一个 ArkUI 组件@State:状态装饰器,用于管理组件内部状态(此处存储主题信息)build():组件的构建方法,返回 UI 结构Column 作为根布局,提供基础的页面边距和背景色2. 欢迎卡片构建器
@Builder
buildWelcomeCard() {
Row() {
// 文字内容区域
Column() { ... }
.flexGrow(1)
// 装饰图标区域
Stack() { ... }
...
}
.width('100%')
.padding(24)
...
}@Builder:构建器装饰器,用于封装可复用的 UI 片段Row:水平布局容器,对应 Row 组件flexGrow(1):让文字区域占据剩余空间,实现自适应布局Stack:堆叠容器,用于实现装饰图标区域( Container + Center)3. 文字内容区域
Column() {
// 欢迎标题
Text('欢迎使用新生宿舍管理系统')
.fontSize(this.theme.headlineSmall.fontSize)
.fontWeight(FontWeight.Bold)
.fontColor(this.theme.onSurface)
.margin({ bottom: 8 })
// 功能描述
Text('为新生提供便捷的宿舍分配、入住流程管理和宿舍信息查询服务')
.fontSize(this.theme.bodyMedium.fontSize)
.fontColor(this.theme.onSurfaceVariant)
.margin({ bottom: 16 })
.maxLines(2)
.textOverflow({ overflow: TextOverflow.Ellipsis })
// 入住季标签
Text('2024届新生入住季')
.fontSize(this.theme.labelLarge.fontSize)
.fontWeight(FontWeight.Bold)
.fontColor(this.theme.primary)
.backgroundColor(this.theme.primaryContainer)
.padding({ left: 16, right: 16, top: 8, bottom: 8 })
.borderRadius(20)
}
.alignItems(ItemAlign.Start)
.flexGrow(1)Column:垂直布局容器,对应 Column 组件Text:文本组件,支持 fontSize、fontWeight、fontColor 等样式配置maxLines + textOverflow:实现文本超出两行时的省略号效果4. 装饰图标区域
Stack() {
Text('宿')
.fontSize(this.theme.displayLarge.fontSize)
.fontWeight(FontWeight.Bold)
.fontColor(this.theme.primary)
}
.width(100)
.height(100)
.backgroundColor(this.theme.primaryContainer)
.borderRadius(20)
.justifyContent(FlexAlign.Center)
.margin({ left: 16 })Stack 配合 justifyContent(FlexAlign.Center) 实现文字居中效果margin({ left: 16 }) 实现与文字区域的间距5. 渐变背景实现
.backgroundImage(
LinearGradient.createLinearGradient(
{ x: 0, y: 0 }, // 起始点
{ x: 1, y: 0 }, // 结束点
[
this.theme.surfaceVariant + '80', // 80对应16进制的透明度(0.5)
this.theme.surface + 'CC' // CC对应16进制的透明度(0.8)
]
)
)LinearGradient 创建线性渐变背景6. 主题管理
interface ThemeConstants { ... }
function getThemeConstants(): ThemeConstants {
return {
backgroundColor: '#f9f9f9',
surface: '#ffffff',
surfaceVariant: '#f0f0f0',
onSurface: '#1d1d1f',
onSurfaceVariant: '#6e6e73',
primary: '#007aff',
primaryContainer: '#007aff1a',
headlineSmall: { fontSize: 24 },
bodyMedium: { fontSize: 16 },
labelLarge: { fontSize: 14 },
displayLarge: { fontSize: 64 }
};
}AbilityStage 和 Configuration 实现深色/浅色主题动态切换多端适配说明
width('100%'))和 flexGrow 实现不同屏幕尺寸适配vp 单位(虚拟像素)替代固定像素值,自动适配不同屏幕密度@Media)为不同设备类型定制布局:// 平板/桌面端适配示例
@Media(minWidth: 800) {
.buildWelcomeCard() {
Row() {
// 平板端可调整布局比例
Column() { ... }.flexGrow(2)
Stack() { ... }.width(120).height(120)
}
}
}心得

总结
关键点回顾
你想要开发的是基于HarmonyOS 6.0、使用ArkTS语言构建的图书馆管理系统,该系统面向图书馆管理员和读者,核心实现图书查询、借阅/归还、图书管理等基础功能,采用HarmonyOS 6.0的最新特性(如Stage模型、ArkUI组件化)开发,适配多设备形态,兼顾易用性和性能。 本系统聚焦3个核心模块,满足基础图书馆管理需求: 定义图书和借阅记录的数据结构,作为全局数据模型: 实现图书列表展示和关键词查询功能,采用ArkUI声明式UI: 实现图书借阅和归还的核心操作: 该系统充分利用了HarmonyOS 6.0的ArkTS特性,代码结构清晰、易扩展,适合作为HarmonyOS应用开发的入门实战项目。HarmonyOS 6.0 图书馆管理系统(ArkTS)开发实战
一、项目概述

二、技术栈与环境准备
1. 核心技术
2. 环境要求
三、核心功能设计
四、代码实现
1. 项目结构(Stage模型)
library-system/
├── entry/
│ ├── src/main/ets/
│ │ ├── entryability/ # 应用入口
│ │ ├── pages/ # 页面(图书列表、借阅页、管理页)
│ │ ├── model/ # 数据模型
│ │ ├── util/ # 工具类(数据库、存储)
│ │ └── resources/ # 资源(字符串、样式)
2. 数据模型定义(model/BookModel.ets)
/**
* 图书数据模型
*/
export interface Book {
id: string; // 图书编号(唯一标识)
name: string; // 书名
author: string; // 作者
category: string; // 分类(如计算机、文学)
status: boolean; // 状态:true-可借,false-已借出
borrowTime?: string;// 借阅时间(可选)
borrower?: string; // 借阅人(可选)
}
/**
* 全局状态管理(简化版)
*/
export class BookManager {
private static instance: BookManager;
private books: Book[] = [];
private constructor() {
// 初始化测试数据
this.books = [
{ id: "001", name: "ArkTS开发实战", author: "鸿蒙开发者", category: "计算机", status: true },
{ id: "002", name: "HarmonyOS 6.0进阶", author: "华为技术团队", category: "计算机", status: false, borrowTime: "2026-02-01", borrower: "张三" },
{ id: "003", name: "百年孤独", author: "加西亚·马尔克斯", category: "文学", status: true }
];
}
// 单例模式,保证全局唯一实例
public static getInstance(): BookManager {
if (!BookManager.instance) {
BookManager.instance = new BookManager();
}
return BookManager.instance;
}
// 获取所有图书
getBooks(): Book[] {
return this.books;
}
// 按关键词查询图书
searchBooks(keyword: string): Book[] {
return this.books.filter(book =>
book.name.includes(keyword) ||
book.author.includes(keyword) ||
book.category.includes(keyword)
);
}
// 借阅图书
borrowBook(bookId: string, borrower: string): boolean {
const book = this.books.find(b => b.id === bookId);
if (book && book.status) {
book.status = false;
book.borrowTime = new Date().toLocaleDateString();
book.borrower = borrower;
return true;
}
return false;
}
// 归还图书
returnBook(bookId: string): boolean {
const book = this.books.find(b => b.id === bookId);
if (book && !book.status) {
book.status = true;
book.borrowTime = undefined;
book.borrower = undefined;
return true;
}
return false;
}
// 新增图书
addBook(book: Book): void {
this.books.push(book);
}
// 删除图书
deleteBook(bookId: string): boolean {
const index = this.books.findIndex(b => b.id === bookId);
if (index !== -1) {
this.books.splice(index, 1);
return true;
}
return false;
}
}3. 图书列表/查询页面(pages/BookListPage.ets)
@Entry
@Component
struct BookListPage {
// 状态变量:搜索关键词、图书列表
@State searchKeyword: string = "";
@State bookList: Book[] = [];
private bookManager = BookManager.getInstance();
// 页面初始化时加载数据
aboutToAppear() {
this.bookList = this.bookManager.getBooks();
}
// 搜索图书
onSearch() {
this.bookList = this.bookManager.searchBooks(this.searchKeyword);
}
build() {
Column() {
// 搜索栏
Row({ space: 10 }) {
TextField({ placeholder: "输入书名/作者/分类查询" })
.width("70%")
.height(40)
.border({ width: 1, radius: 8 })
.padding(8)
.onChange((value) => {
this.searchKeyword = value;
})
Button("搜索")
.width("20%")
.height(40)
.backgroundColor("#007DFF")
.onClick(() => this.onSearch())
}
.padding(10)
.width("100%")
// 图书列表
List() {
ForEach(this.bookList, (book: Book) => {
ListItem() {
Column() {
Row({ space: 15 }) {
Text(`编号:${book.id}`)
.fontSize(14)
.fontColor("#666")
Text(`书名:${book.name}`)
.fontSize(16)
.fontWeight(FontWeight.Bold)
Text(book.status ? "可借" : "已借出")
.fontSize(14)
.fontColor(book.status ? "#00C800" : "#FF4D4F")
}
.width("100%")
.padding(5)
Row({ space: 15 }) {
Text(`作者:${book.author}`)
.fontSize(14)
Text(`分类:${book.category}`)
.fontSize(14)
}
.width("100%")
.padding(5)
// 已借出图书显示借阅信息
if (!book.status) {
Row() {
Text(`借阅人:${book.borrower}`)
.fontSize(12)
.fontColor("#999")
Text(`借阅时间:${book.borrowTime}`)
.fontSize(12)
.fontColor("#999")
}
.width("100%")
.padding(5)
}
}
.width("100%")
.padding(10)
.borderBottom({ width: 0.5, color: "#EEEEEE" })
}
})
}
.width("100%")
.flexGrow(1)
}
.width("100%")
.height("100%")
.padding(5)
}
}4. 借阅/归还页面(pages/BorrowReturnPage.ets)
@Entry
@Component
struct BorrowReturnPage {
@State bookId: string = "";
@State borrower: string = "";
@State tipText: string = "";
@State tipColor: string = "#333";
private bookManager = BookManager.getInstance();
// 借阅操作
borrowBook() {
if (!this.bookId || !this.borrower) {
this.tipText = "图书编号和借阅人不能为空!";
this.tipColor = "#FF4D4F";
return;
}
const result = this.bookManager.borrowBook(this.bookId, this.borrower);
if (result) {
this.tipText = `借阅成功!图书${this.bookId}已借出`;
this.tipColor = "#00C800";
} else {
this.tipText = "借阅失败!图书不存在或已借出";
this.tipColor = "#FF4D4F";
}
// 清空输入框
this.bookId = "";
this.borrower = "";
}
// 归还操作
returnBook() {
if (!this.bookId) {
this.tipText = "图书编号不能为空!";
this.tipColor = "#FF4D4F";
return;
}
const result = this.bookManager.returnBook(this.bookId);
if (result) {
this.tipText = `归还成功!图书${this.bookId}已入库`;
this.tipColor = "#00C800";
} else {
this.tipText = "归还失败!图书不存在或未借出";
this.tipColor = "#FF4D4F";
}
// 清空输入框
this.bookId = "";
}
build() {
Column({ space: 20 }) {
// 借阅模块
Column({ space: 10 }) {
Text("图书借阅")
.fontSize(18)
.fontWeight(FontWeight.Bold)
.alignSelf(ItemAlign.Start)
TextField({ placeholder: "输入图书编号" })
.width("100%")
.height(40)
.border({ width: 1, radius: 8 })
.padding(8)
.onChange((value) => this.bookId = value)
TextField({ placeholder: "输入借阅人姓名" })
.width("100%")
.height(40)
.border({ width: 1, radius: 8 })
.padding(8)
.onChange((value) => this.borrower = value)
Button("确认借阅")
.width("100%")
.height(40)
.backgroundColor("#007DFF")
.onClick(() => this.borrowBook())
}
.width("90%")
.padding(15)
.backgroundColor("#F5F7FA")
.borderRadius(10)
// 归还模块
Column({ space: 10 }) {
Text("图书归还")
.fontSize(18)
.fontWeight(FontWeight.Bold)
.alignSelf(ItemAlign.Start)
TextField({ placeholder: "输入图书编号" })
.width("100%")
.height(40)
.border({ width: 1, radius: 8 })
.padding(8)
.onChange((value) => this.bookId = value)
Button("确认归还")
.width("100%")
.height(40)
.backgroundColor("#00C800")
.onClick(() => this.returnBook())
}
.width("90%")
.padding(15)
.backgroundColor("#F5F7FA")
.borderRadius(10)
// 提示信息
Text(this.tipText)
.fontSize(14)
.fontColor(this.tipColor)
}
.width("100%")
.height("100%")
.padding(20)
.justifyContent(FlexAlign.Center)
}
}五、功能扩展与优化建议
六、运行效果
总结
引言 技术栈选择 Language: Python 3.9+ Protocol: WebSocket (RFC 6455) Library: websocket-client (同步阻塞模式,适合独立进程) 模块实现细节 JSON反序列化:将字符串转为Dict。 业务路由:根据symbol字段,将数据分发给不同的策略回调函数。 总结
在Web开发中,我们习惯了RESTful API。但在金融量化(FinTech)领域,RESTful往往是性能瓶颈的代名词。
本文将从后端工程的角度,详细拆解如何使用Python的websocket-client库,对接第三方行情服务商(以AllTick为例),实现一个高可用、低延迟的港股行情接入模块。
为了保持代码的整洁,建议将WebSocket操作封装在一个类中。我们需要处理Socket生命周期的四个关键事件:Open, Message, Error, Close。
在on_open回调中,我们执行订阅操作。这是一种典型的异步编程思想——连接建立是事件,订阅是响应。import websocket
import json
def on_message(ws, message):
data = json.loads(message)
print(data) # 输出实时行情数据
def on_open(ws):
# 订阅港股代码为HK.0005(汇丰控股)的实时数据
ws.send(json.dumps({
"event": "subscribe",
"symbol": "HK.0005", # 港股代码
"channel": "market_data"
}))
if __name__ == "__main__":
websocket.enableTrace(True)
ws = websocket.WebSocketApp("wss://api.alltick.co/market_data", # 使用AllTick的WebSocket URL
on_message=on_message,
on_open=on_open)
ws.run_forever()
服务端推送的数据是Byte流或String。我们需要做两件事:
注意:这里的异常处理至关重要,格式错误的包不应导致进程崩溃。response = '{"symbol": "HK.0005", "price": 123.45, "volume": 10000}'
data = json.loads(response)
price = data['price']
volume = data['volume']
print(f"汇丰控股当前价格: {price}, 成交量: {volume}")
根据API文档,订阅请求通常是一个包含Event Type和Channel的JSON对象。这里演示了如何构造一个标准的订阅Payload。
在分布式系统中,"Design for Failure"是核心准则。我们利用while True循环配合try...except块,实现了一个简易但有效的守护进程(Daemon)。如果Socket意外断开,程序会休眠数秒后尝试重连,实现无人值守运行。import time
def fetch_data_with_retry():
retries = 3
for _ in range(retries):
try:
data = fetch_data_from_api()
return data
except Exception as e:
print(f"请求失败: {e}, 正在重试...")
time.sleep(2) # 等待2秒后重试
print("重试次数已用完,无法获取数据")
通过WebSocket,我们成功将网络开销分摊到了连接建立的一次性成本上,后续的数据传输几乎没有额外Header开销。这对于高频数据处理是非常必要的优化。
博睿大使|推荐Bonree ONE 有礼活动正式启幕!原创 一体化智能可观测 博睿宏远 2026年2月12日 16:00 北京
博睿大使【推荐Bonree ONE有礼】活动正式启幕!即日起至2026年12月31日诚邀各位伙伴成为 Bonree ONE 的引荐者向博睿数据推荐新客户、新商机,解锁丰厚奖励!即刻点击下方海报或扫描海报二维码参与活动吧!具体活动规则详见下方海报👇
— 精彩资料推荐 —






往期推荐_● 博睿数据持续领跑中国APMO市场!► 点击阅读_● 扬帆奋楫 再攀高峰!博睿数据2025年度精彩回顾!► 点击阅读_● 新起点·新视觉|博睿数据全球品牌VI系统全新升级!► 点击阅读_● 《智能体协同矩阵重塑自主运维新范式》白皮书重磅发布!► 点击阅读
编者按: 你是否曾好奇过,那些声称能将长文本输入成本降低90%、延迟减少85%的"Prompt Caching"技术,背后究竟缓存了什么?是简单的文本复用,还是某种更深层的计算优化? 我们今天为大家带来的文章,作者的核心观点是:Prompt Caching的本质并非简单的文本字符串缓存,而是对Transformer注意力机制中Key-Value(KV)矩阵计算结果的复用,通过避免重复计算注意力权重来实现成本削减与性能提升。 文章的重点内容包括:第一,从Tokenizer到Embedding再到Transformer的完整技术拆解,帮助读者建立对LLM内部数据流的直觉认知;第二,对注意力机制(Attention)的数学原理进行深入浅出的阐释,详细展示了Query、Key、Value矩阵的计算过程以及Softmax权重分配机制;第三,揭示了"KV Caching"的核心实现逻辑 —— 通过缓存历史token的K、V投影矩阵,使模型在增量生成时只需计算最新token,而非重新处理整个上下文;第四,对OpenAI与Anthropic两种缓存策略的对比分析,指出自动路由与显式控制之间的权衡,以及Temperature等采样参数对缓存机制的零影响。 作者 | Sam Rose 编译 | 岳扬 撰写本文时,OpenAI 和 Anthropic 的 API 中,缓存的 input token 单价仅为普通 input token 的十分之一。 Anthropic 甚至声称[1],prompt caching 能将长 prompt 的延迟“最高降低 85%”。而在实际测试中,我发现对于足够长的 prompt,这一说法确实成立。我向 Anthropic 和 OpenAI 各发送了数百次请求,注意到在所有 input token 均被缓存的情况下,首 token 延迟(time-to-first-token latency)出现了明显下降。 缓存 token(cached token)到底是什么玩意儿? 这背后究竟发生了什么,让服务商能给 input token 打出 1 折的超低折扣?他们在各次请求之间到底保存了什么?这可不是简单地把响应结果存下来,等收到相同 prompt 时再复用 —— 通过 API 就能很容易地验证这一点并未发生。随便写个 prompt,连续发送十几次,你会发现即使使用情况栏(usage 部分)显示 input token 已被缓存,每次得到的回复仍然各不相同。 我对大模型厂商文档中的解释[2-3]并不满意 —— 它们虽能很好地说明如何使用 prompt caching,却巧妙地避开了“究竟缓存了什么”这个核心问题。于是我决定深入探究,一头扎进 LLM 工作原理的“兔子洞”,直到彻底搞明白服务商究竟缓存了哪些精确的数据、这些数据的用途,以及它们如何让每个人的 LLM 请求都变得更快速、更便宜。 读完本文,你将…… 本质上,LLM 就是一个巨大的数学函数:输入一串数字,并输出一个数字。在 LLM 内部,存在着一个由数十亿个精心设计的运算构成的巨型图结构,负责将这些输入数字转化为输出数字。 这个由海量数学运算构成的巨型图结构大致可分为 4 个部分。 图中的每个节点都可以看作一个函数,接收输入并产生输出。输入会以循环方式不断馈入 LLM,直到遇到某个特殊的输出值指示其停止。 用伪代码表示大致如下: 尽管以上描述已大幅简化,但现代 LLM 的核心代码行数之少仍让我感到意外。 Sebastian Raschka[4] 用 PyTorch 从零实现了多个开源模型,还产出了大量高质量的教学材料 —— 如果你喜欢本文,大概率也会喜欢他的内容。以当前领先的开源模型之一 Olmo 3 为例,其核心代码仅数百行[5]。 Prompt caching 发生在 Transformer 的“attention(注意力机制)”中。接下来我们将按顺序逐步拆解 LLM 的工作原理,直到抵达这一环节。这意味着,我们的旅程得从 tokens 说起。 在 LLM 处理你的 prompt(提示词)之前,必须先将其转换为它能理解的表示形式。这个过程分为两步,由 tokenizer 和 embedding 共同完成。为什么要这么做,要到讲 embedding 时才能完全明晰,现在请先耐心了解 tokenizer 的作用。 Tokenizer 会将你的 prompt 拆成多个小片段,并为每个唯一的片段分配一个整数 ID,称为"token"。例如,GPT-5 对 prompt "Check out ngrok.ai" 的分词结果如下: 该 prompt 已被拆分为数组 [“Check”, " out", " ng", “rok”, “.ai”],并转换为 tokens [4383, 842, 1657, 17690, 75584]。相同的 prompt 始终生成相同的 tokens。tokens 也是区分大小写的 —— 因为大小写能传递语义信息。例如,首字母大写的 "Will" 更可能是人名,而小写的 "will" 则更可能是助动词。 为什么不直接按空格或字符分割? 这其实是个相当深刻的问题,细讲起来足以让本文篇幅翻倍。简短而不尽兴的答案是:这是一种权衡。若想深入理解,Andrej Karpathy 有一期从零实现 tokenizer 的精彩视频(https://www.youtube.com/watch?v=zduSFxRajkE) 。对于 prompt caching 而言,只需知道:tokenization 的作用就是把文本变成数字。 Tokens 是 LLM 输入与输出的基本单位。当你向 ChatGPT 提问时,回复会随着每次 LLM 迭代完成而逐个 token 流式返回。服务商这么做,是因为生成完整回复可能需要数十秒,而一旦 token 生成就立即返回,能让交互体验更流畅自然。 我们来问一个 LLM 领域的经典问题,亲眼看看这个过程: Prompt tokens 输入,✨ AI 魔法发生 ✨,输出一个 token,循环往复。这个过程称为“inference(推理)”。注意:每个输出 token 都会在下一轮迭代前被追加到 input prompt 中。LLM 需要全部上下文才能给出高质量回答 —— 如果只输入原始 prompt,它会反复尝试生成答案的第一个 token。如果只输入已生成的回答部分,它会立刻忘记问题本身。因此,每一轮迭代都必须将完整的 prompt 加上已生成的回答内容重新输入 LLM。 那个 199999 <END> token 是什么? 这个推理过程总得有个终点。LLM 拥有多种“特殊”token,其中之一就是标志着响应结束的 token。 在 GPT-5 的分词器中,这就是 token 199999。这只是 LLM 终止生成过程的多种方式之一:你也可以通过 API 指定最大生成 token 数,服务商还可能基于安全策略设定其他终止规则。 此外还有用于标记对话消息起止的特殊 token —— 正是这些 token 让 ChatGPT、Claude 等聊天模型能分辨一条消息何时结束、下一条何时开始。 关于 tokenizer(分词器)的最后一点:它们种类繁多!ChatGPT 使用的 tokenizer 与 Claude 不同,甚至 OpenAI 自家的不同模型也使用不同的 tokenizer。每种 tokenizer 都有自己独特的文本切分规则。如果你想直观比较不同 tokenizer 的分词效果,可以试试 tiktokenizer[6]。 认识了 tokens 之后,接下来我们聊聊 embeddings。 经过 tokenizer 处理后的 tokens,现在进入 embedding 阶段。要理解 embedding,不妨先思考模型的目标是什么。 人类用代码解决问题时,会编写接收输入、产生输出的函数,比如华氏转摄氏: 我们可以把任意数字传入 fahrenheitToCelsius,并能获得正确结果。但假如我们面对一个问题,却不知道背后的公式呢?假如我们只有下面这张神秘的输入-输出对照表: (我并不指望你能认出这个函数 —— 不过,如果你把截图贴进 ChatGPT,它能立刻识别出来。) 当我们知道每个输入对应的正确输出,却不知道产生这种对应关系的函数时,就可以“训练”一个模型来学习这个函数。做法是:给模型提供一块“画布” —— 那个由海量数学运算构成的巨型图结构,然后不断调整这个图结构,直到模型收敛到正确的函数。每次更新图结构后,我们都将输入数据喂进去,观察输出数据与目标的差距。反复迭代,直到结果足够接近目标。这就是训练的本质。 事实证明,在训练文本生成模型时,能够识别两个句子是否“相似”会很有帮助。但“相似”具体指什么?它们可能同样悲伤、幽默或发人深省;也可能在长度、节奏、语气、语言、词汇或结构上相近。描述句子相似性的方式有无数维度,而两个句子可能在某些维度上相似,在另一些维度上则不然。 Tokens 本身只是简单的整数编号,没有任何“维度”信息;而 embeddings 则是高维向量,承载了丰富的语义和结构信息。 Embedding 是一个长度为 n 的数组,代表 n 维空间中的一个位置。如果 n=3,embedding 可能是 [10, 4, 2],表示三维空间中 x=10、y=4、z=2 的坐标点。在 LLM 训练过程中,每个 token 会被随机分配一个起始位置,随后训练过程会不断微调所有 token 的位置,直到找到能产生最佳输出的排列方式。 Embedding 阶段的第一步,就是查表获取每个 token 对应的 embedding。用伪代码表示大概是这样: 于是,我们把 tokens(整数数组)转换成了 embeddings(数组的数组,即“矩阵”)。 tokens [75, 305, 284, 887] 被转换为一个由 3 维 embeddings 构成的矩阵。 Embedding 的维度越多,模型可用于比较句子的“角度”就越多。 我们刚才一直在用 3 维 embeddings 举例,但当前主流模型的 embedding 维度通常是几千维,最大的甚至超过 10,000 维。 为了说明更高维度的价值,下面我展示了 8 组彩色形状,它们最初位于一维空间中 —— 挤在一条直线上,杂乱无章,难以理解。但随着维度增加,你就能清楚地看到存在 8 个不同的、相关的组别。 三维是我这里能提供的视觉示例的极限,至于几千维的空间能表达什么,就得靠你发挥想象力了。 Embedding 阶段还有最后一件事要做。在获取 token 的 embedding 后,会将该 token 在 prompt 中的位置信息编码进 embedding 中。 我没有深入研究这一机制的具体实现方式,只知道它对 prompt caching 的工作方式影响不大,但如果没有这一步,LLM 就无法判断 prompt 中 tokens 的先后顺序。 更新一下前面的伪代码,假设存在一个叫 encodePosition 的函数,它接收 embeddings 和位置信息,并返回嵌入了位置编码的新 embeddings。 总而言之,embeddings 是 n 维空间中的点,你可以将其视为它们所代表文本的语义含义。在训练过程中,每个 token 都会在该空间中移动,靠近其他语义相似的 token。维度越多,LLM 对每个 token 的表示就越复杂、越细腻。 至此,tokenizer 和 embedding 阶段所做的全部工作,都是为了把原始文本转换成 LLM 能处理的形式。接下来,我们来看看这些数据进入 transformer 阶段后会发生什么。 Transformer 阶段的核心任务,就是接收 embeddings 作为输入,并在 n 维空间中对它们进行调整。它通过两种方式实现这一点,而我们只关注第一种:attention(注意力机制)。我们暂不讨论 “Feedforward” 层或输出阶段(至少在这篇文章中👀)。 Attention 机制的作用,是帮助 LLM 理解 prompt 中各个 token 之间的关系 —— 具体做法是让每个 token 能够影响其他 token 在 n 维空间中的位置。 它通过加权组合 prompt 中所有 token 的 embeddings 来实现这一点。输入是整个 prompt 的 embeddings,输出则是一个新的 embedding,它是所有输入 embeddings 的加权组合。 举个例子,如果 prompt 是 “Mary had a little”,被分词为四个 token:Mary、had、a、little,那么 attention 机制可能会决定,在生成下一个 token 时,模型会认为: 然后,它会把所有 token 的 embeddings 分别乘以对应的权重,然后把结果加在一起,得到一个融合后的向量。这正是 LLM 判断“在当前上下文中,每个 token 应该被关注多少”的方式。 这是目前为止整个流程中最复杂、最抽象的部分。我会先用伪代码展示它,然后再看看 embeddings 在经过这一过程时是如何被变换的。我本想让这一部分的数学内容少一些,但这里很难避免一些数学运算。别担心,你能行的,我相信你。 Attention 中的大部分计算都是矩阵乘法。对于本文而言,你只需知道:输出矩阵的形状由两个输入矩阵的形状决定,输出的行数等于第一个输入矩阵的行数,列数等于第二个输入矩阵的列数。 理解了这一点,我们来看一个简化版的注意力机制如何计算分配给每个 token 的权重。在以下代码中,我用 * 表示矩阵乘法。 接下来,让我们看看 embedding 在流经这个函数时是如何变化的。 等等,WQ 和 WK 变量到底是什么? 还记得我之前说过,每个 token 的 embedding 最初都被随机分配了一个位置,然后在训练过程中不断微调,直到模型找到一个良好的排列状态吗? WQ 和 WK 也是类似的。它们是 n×n 的矩阵(n 即 embedding 维度),在训练开始时被赋予随机值,随后也在训练中被不断调整,以帮助模型收敛到一个更优的解。 任何在训练过程中被调整的数,都被称为“模型参数”。embedding 向量中的每个浮点数,以及 WQ、WK 矩阵中的每个数值,都是一个参数。当你听说某个模型有“1750 亿参数”时,指的就是这些数字。 至于 WQ 和 WK 到底代表什么,我们其实并不完全清楚。随着模型训练收敛,它们最终会变成某种对 embedding 的变换方式,有助于模型生成更好的输出。 它们内部可能在做任何事情 —— 而如何解释这些矩阵的含义,目前仍是一个开放且活跃的研究方向。 要得到 Q 和 K,我们分别将 embeddings 与 WQ 和 WK 相乘。WQ 和 WK 的行数和列数始终等于 embedding 的维度(本例中为 3)。这里我为 WQ 和 WK 选取了随机值,并将结果四舍五入到小数点后两位以便阅读。 得到的 Q 矩阵有 4 行 3 列。4 行是因为 embeddings 矩阵有 4 行(每个 token 一行),3 列是因为 WQ 有 3 列(每个 embedding 维度一列)。 K 的计算完全相同,只是将 WQ 换成 WK。 Q 和 K 都是输入 embedding 到新的 n 维空间的"投影"。它们不是原始的 embedding,但由原始 embeddings 推导而来。 然后,我们将 Q 和 K 相乘。我们对 K 进行“转置”,也就是沿对角线翻转,使得得到的矩阵是一个方阵,其行数和列数都等于输入提示词中的 token 数量。 这些 scores 表示每个 token 对下一个生成 token 的重要程度。 左上角的数值 -0.08,代表 “Mary” 对 “had” 的重要性。再往下一行的 -0.10,则代表 “Mary” 对 “a” 的重要性。在展示完矩阵运算后,我会用图示更直观地说明这一点。接下来的所有操作,都是为了将这些 scores 转换为可用于混合 embeddings 的权重。 这个 score 矩阵的第一个问题是:它允许未来的 token 影响过去的 token。在第一行,我们唯一知道的词是"Mary",所以它应该是唯一对生成"had"有贡献的词。第二行也是如此,我们知道"Mary"和"had",所以只有这两个词应该对生成"a"有贡献,依此类推。 为了解决这个问题,我们对矩阵应用一个三角形掩码(triangular mask),将未来 token 对应的位置置零。不过,我们并不是真的设为 0,而是设为负无穷(negative infinity) —— 原因稍后解释。 第二个问题是,这些 scores 是任意的数值。如果它们能变成一个每行之和等于 1 的概率分布,对我们来说会更有用。这正是 softmax 函数的作用。softmax 具体如何运作的细节并不重要 —— 它比简单的“将每个数字除以该行总和”稍复杂一点,但结果是一样的:每行之和为 1,且每个数字都在 0 和 1 之间。 为了解释为什么用负无穷,下面是一个 softmax 的代码实现: 它并不是简单地把每个数加起来再除以总和,而是先对每个数值取 Math.exp,也就是计算 e^x。如果我们用 0 代替负无穷,Math.exp(0) === 1,这些被屏蔽的位置仍然会产生非零权重。而 Math.exp(-Infinity) 是 0,这正是我们想要的。 下面的图片展示了提示词"Mary had a little"的 attention 权重示例。 这些权重与上面的计算结果不匹配,因为我是从 Transformer Explained 网站[7]上运行的 GPT-2 模型中提取的。所以这些是一个真实模型(尽管是老模型)的真实权重。 第一行只有"Mary",因此Mary对"had"的生成的贡献是100%。然后在第二行,"Mary"贡献了79%,而"had"贡献了21%用于生成"a",以此类推。LLM 认为这个句子中最重要的词是 “Mary”,这一点并不意外——从每一行中 “Mary” 都拥有最高权重就能看出。如果我让你补全"Jessica had a little"这个句子,你不太可能选择"lamb"。 接下来就只剩下对 token embeddings 进行加权混合了,谢天谢地,这一步比计算权重要简单得多。 为什么不直接混合原始 embeddings? 当我们通过 Q 和 K 相乘得到 attention 权重时,我们完全是在衡量 token 之间的相关性。Embeddings 编码了 token 的各种语义信息 —— 某一维可能表示“颜色”,另一维表示“大小”,再一维表示“礼貌/粗鲁程度”,等等。而权重是通过相似度来判断哪些 token 更相关。 WV 的作用,则是让模型决定在混合时保留哪些维度的信息。 以句子 “Mary had a little” 为例,这里关于 “Mary” 最重要的信息是“人名”。模型在训练中可能也学到了很多关于 “Bloody Mary(血腥玛丽鸡尾酒)” 或 “Mary Queen of Scots(苏格兰女王玛丽)” 的知识,但这些与这首童谣无关,如果带入后续计算反而会引入噪声。因此,WV 允许模型在混合 embeddings 之前,先过滤掉不相关的特征。 接着,我们将生成的权重与 V 相乘,输出一组新的 embeddings: Attention 机制的最终输出,就是这个输出矩阵的最后一行。 通过 attention 过程,前面所有 token 的上下文信息都被融合进了这一行。但要注意:为了得到最后一行,前面所有行都必须被计算出来。 总而言之,输入是一组 embeddings,输出是一个新的 embedding。Attention 机制通过大量精细的数学运算,按照训练中学到的 WQ、WK 和 WV 矩阵所决定的重要性比例,将各个 token 的信息进行了加权融合。正是这一机制,让 LLM 能够理解在其上下文窗口中“什么内容重要,以及为什么重要”。 现在,我们终于掌握了讨论 caching 所需的一切知识。 当然,Attention 还有更多技术细节 我在本文展示的是一个简化版的 attention,目的是突出与 prompt caching 最相关的核心部分。实际中的 attention 机制更为复杂。如果你希望深入了解更多技术细节,我推荐 3blue1brown 关于 attention 的视频[8]。 我们再来看一遍上面的网格,但这次会展示在推理循环中每生成一个新 token 时,它是如何逐步填充的。 每次生成新 token 时,都会将其追加到输入中,并重新完整处理整个 prompt。但仔细观察:之前计算出的权重从未改变。第二行始终是 0.79 和 0.21,第三行始终是 0.81、0.13、0.06。我们其实在不断重复大量不必要的计算。如果你刚刚才处理完 “Mary had a”,那么在生成下一个 token 时,对 “Mary had a little” 中前三个 token 的大部分矩阵运算其实是冗余的 —— 而这正是 LLM 推理循环的默认行为。 通过以下两个改动,就能避免这些重复计算: 现在我们再次走一遍矩阵运算过程,但这一次:前 4 个 token 的 K 和 V 矩阵已被缓存,我们只传入一个新 token 的 embeddings。 是的,又要面对矩阵运算了,抱歉!不过内容和之前基本一致,我们会快速过一遍。 计算新的 Q 时,输出只有一行。WQ 和之前一样,没有变化。 接着,计算新的 K 也同样只输出一行,而 WK 也和之前一样保持不变。 但随后我们将这一新行追加到前一次迭代缓存的 4 行 K 矩阵之后: 于是现在我们拥有了提示词中所有 token 的 K 矩阵,但我们只需要计算它的最后一行。 我们继续以这种方式来获取新的 score: 以及新的的 weights: 全程我们只计算必需的部分,完全不需要对旧值进行任何重新计算。获取 V 的新一行时也是同样的做法: 然后将其追加到我们缓存的 V 中: 最后,我们将新的权重与新的 V 相乘,得到最终的新 embeddings: 我们只需要这单独一行新的 embedding。得益于缓存的 K 和 V,先前所有 token 的上下文信息都已被融入其中。 被缓存的数据是 embeddings WK 和 embeddings WV 的结果,也就是 K 和 V。 因此,提示词缓存通常被称为"KV caching"。 就是这样,上面那些 K 和 V 矩阵,就是服务提供商保存在他们巨大数据中心里的 1 和 0,用来给我们提供一折的 token 成本和更快的响应。 服务提供商在请求发出后,会将每个提示词的这些矩阵保留 5-10 分钟,如果你发送一个以相同提示词开头的新请求,他们就会复用缓存的 K 和 V,而不是重新计算它们。缓存匹配不需要完全一致 —— 即使新 prompt 只和缓存中的某一部分开头相同,也可以复用那部分已缓存的计算结果,而不必整个 prompt 完全匹配。 OpenAI 和 Anthropic 的缓存机制截然不同。OpenAI 完全自动处理,会尽可能尝试将请求路由到缓存条目。 在我的实验中,通过发送请求然后立即重发,缓存命中率约为 50%。考虑到长上下文窗口的首字节延迟(time-to-first-byte)可能很长,这种自动缓存可能导致性能表现不稳定。 Anthropic 则赋予你更多控制权,让你决定何时缓存以及缓存多久。 你需要为这项特权付费,但在我进行的实验中,当我们要求 Anthropic 缓存某个提示词时,他们会 100% 地将请求路由到缓存条目。因此,如果你的应用涉及长上下文窗口,并且需要可预测的延迟,Anthropic 可能是更合适的选择。 等等,那 temperature 这些参数会影响提示词缓存吗? LLM 提供商提供了多种参数来控制模型输出的随机性,常见的有 temperature、top_p 和 top_k。这些参数都作用于推理循环的最后一步,即模型根据它为词表中每个 token 分配的概率来选取 token。这发生在 attention 机制产生最终 embedding 之后,因此提示词缓存不受这些参数影响。你可以随意调整它们,而不用担心导致缓存的提示词失效。 为了学习撰写本文所需的全部知识,我如饥似渴地阅读了大量优质内容,以下是我认为对我最有帮助的: 如果你喜欢这篇文章,你一定会喜欢这些资源。 END 本期互动内容 🍻 ❓按照文中逻辑,缓存本质是拿内存换计算。当你处理10万Token以上的超长上下文时,有没有估算过KV Cache的内存占用成本 vs 重新计算的API成本?在什么临界点你会选择放弃缓存? 文中链接 [1]https://claude.com/blog/prompt-caching [2]https://docs.claude.com/en/docs/build-with-claude/prompt-caching [3]https://platform.openai.com/docs/guides/prompt-caching [4]https://magazine.sebastianraschka.com/ [5]https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/13_olmo3/standalone-olmo3.ipynb [6]https://tiktokenizer.vercel.app/ [7]https://poloclub.github.io/transformer-explainer/ [8]https://www.youtube.com/watch?v=eMlx5fFNoYc [9]https://www.oreilly.com/library/view/build-a-large/9781633437... [10]https://sebastianraschka.com/ [11]https://www.youtube.com/watch?v=VMj-3S1tku0&list=PLAqhIrjkxbu... [13]https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000... [14]https://www.youtube.com/@3blue1brown [15]https://poloclub.github.io/transformer-explainer/ [16]https://aereeeee.github.io/ 本文经原作者授权,由 Baihai IDP 编译。如需转载译文,请联系获取授权。 原文链接:
01 LLM 架构

prompt ="What is the meaning of life?";
tokens = tokenizer(prompt);
while(true){
embeddings = embed(tokens);
for([attention, feedforward] of transformers){
embeddings = attention(embeddings);
embeddings = feedforward(embeddings);
}
output_token = output(embeddings);
if(output_token === END_TOKEN){
break;
}
tokens.push(output_token);
}
print(decode(tokens));02 Tokenizer(分词器)



03 Embedding

function fahrenheitToCelsius(fahrenheit){
return((fahrenheit -32)*5)/9;
}
// Created during training, never changes during inference.
const EMBEDDINGS = [...];
function embed(tokens) {
return tokens.map(token => {
return EMBEDDINGS[token];
});
}




const EMBEDDINGS =[...];
// Input: array of tokens (integers)
function embed(tokens){
// Output: array of n-dimensional embedding arrays
return tokens.map((token, i)=>{
const embeddings = EMBEDDINGS[token];
return encodePosition(embeddings, i);
});
}04 Transformer


// Similar to EMBEDDINGS from the pseudocode
// earlier, WQ and WK are learned during
// training and do not change during inference.
//
// These are both n*n matrices, where n is the
// number of embedding dimensions. In our example
// above, n =3.
const WQ =[[...],[...],[...]];
const WK =[[...],[...],[...]];
// The input embeddings look like this:
//[
//[-0.1,0.1,-0.3],// Mary
//[1.0,-0.5,-0.6],// had
//[0.0,0.8,0.6],// a
//[0.5,-0.7,1.0]// little
//]
function attentionWeights(embeddings){
const Q = embeddings * WQ;
const K = embeddings * WK;
const scores = Q * transpose(K);
const masked = mask(scores);
return softmax(masked);
}




function softmax(matrix){
return matrix.map(row =>{
const exps = row.map(x => Math.exp(x));
const sumExps = exps.reduce((a, b)=> a + b,0);
return exps.map(exp => exp / sumExps);
});
}
// Learned during training, doesn't change
// during inference. This is also an n*n matrix,
// where n is the number of embedding dimensions.
const WV =[[...],[...],...];
function attention(embeddings){
const V = embeddings * WV;
// This is the `attentionWeights` function from
// the section above. We're wrapping it in
// this `attention` function.
const weights = attentionWeights(embeddings);
return weights * V;
}

05 Prompt caching










致谢
在使用OpenClaw的过程中,很多用户都会面临Token消耗过快的问题,目前各大厂商纷纷推出相关Code Plan计划以优化Token使用体验,但多数需要付费购买。对于追求低成本、高实用性的用户而言,一款免费且可用的Token供应方案就显得尤为重要。本文将详细介绍讯飞星辰推出的春节免费Token计划,以及如何将其配置到OpenClaw中,帮助大家零成本畅享大模型应用。 一、讯飞星辰免费Token计划核心优势 讯飞星辰MaaS平台推出的春节免费Token计划,是目前验证可行的免费Token解决方案,核心优势集中在以下几点,适配OpenClaw用户的实际需求: 补充说明:官方宣传该Token使用无速度限制,但实际使用过程中会存在轻微卡顿,整体流畅度可满足日常使用需求,属于可接受范围。 二、前期准备:获取讯飞星辰Token及相关授权 在进行OpenClaw配置前,需先前往讯飞星辰MaaS平台获取模型API授权、API Key等关键信息,具体步骤如下: 三、OpenClaw详细配置步骤(附可直接复制模板) 讯飞星辰MaaS平台提供OpenAI兼容的接口形态,因此在OpenClaw中可直接按“OpenAI / OpenAI-Compatible”模式配置,具体操作如下,全程无需修改复杂参数: 步骤1:找到OpenClaw配置文件 打开OpenClaw工具,定位到配置文件(通常可在工具设置中找到“配置文件”入口,或按工具指引找到对应文件路径),将以下模板复制粘贴到配置文件中,替换原有相关配置(若配置文件为空,可直接粘贴)。 步骤2:填充核心配置信息 将前期在讯飞星辰推理服务控制台获取的API Key,替换模板中“YOUR_API_KEY”位置,其余参数无需修改(模板已包含常用模型及最优基础配置)。 可直接复制的配置模板 { }, }, }, }, }, }, } 步骤3:验证配置是否成功 配置完成后,保存配置文件并重启OpenClaw(部分版本无需重启,直接生效)。在工具的聊天窗口中发送一条简单的测试消息(如“你好”),若能正常收到返回结果,即表示已成功调用讯飞星辰MaaS平台的模型服务,Token可正常使用。 四、常见问题及补充说明 优先检查API Key是否填写正确(注意大小写、空格),若API Key无误,可重新登录讯飞星辰平台确认API授权是否有效,或刷新推理服务控制台后重新获取API Key再次配置。 如前文所述,实际使用中会存在轻微卡顿,属于正常现象,不影响日常使用;若卡顿严重,可检查网络连接,或重启OpenClaw及网络设备尝试优化。 该计划为讯飞星辰春节专属免费活动,具体使用期限及额度以平台官方通知为准,建议获取Token后及时配置使用,避免过期。 五、后续支持 若在配置过程中遇到其他问题,无法独立解决,可通过以下方式获取协助:点赞、关注本文,转发一次并在评论区留言“666”,即可获取手把手配置指导,全程协助完成所有操作,确保顺利使用免费Token畅享OpenClaw服务。 综上,讯飞星辰春节免费Token计划是OpenClaw用户的高性价比选择,零成本、易配置、可实用,无需额外付费即可解决Token消耗过快的问题,适合各类OpenClaw用户尝试使用。按照本文步骤操作,即可快速完成配置,开启流畅的大模型应用体验。 本公众号提供有偿搭建 openclaw 和 opencode 等服务,并提供免费AI 模型 token方案,让大家可以畅快使用,免费续杯。 有需要的加V mapleCx330 本文由mdnice多平台发布


"meta": {"lastTouchedVersion": "2026.2.1",
"lastTouchedAt": "2026-02-04T12:14:10.945Z"
"models": {"mode": "merge",
"providers": {
"ds": {
"baseUrl": "https://maas-api.cn-huabei-1.xf-yun.com/v2",
"apiKey": "YOUR_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "xopdeepseekv32",
"name": "DeepSeek-V3.2",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0.0025,
"output": 0.01,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 32768,
"maxTokens": 32768
}
]
}
}
"agents": {"defaults": {
"model": {
"primary": "ds/xopdeepseekv32"
},
"models": {
"ds/xopdeepseekv32": {
"alias": "xopdeepseekv32"
}
},
"compaction": {
"mode": "safeguard"
},
"maxConcurrent": 4,
"subagents": {
"maxConcurrent": 8
}
}
"messages": {"ackReactionScope": "group-mentions"
"commands": {"native": "auto",
"nativeSkills": "auto"
"channels": {
},
"gateway": {"mode": "local",
"tailscale": {
"mode": "off"
}
"plugins": {"entries": {
},
"installs": {
}
}
本来要上到明天的,但是老板已经走了,明天可以居家(相当于放了吧),看还有上到明天的老哥,给大家送个小福利吧。
本来想送几张咖啡券的,结果现在给别人账号送有点麻烦,不搞了,就发三个红包吧(支付宝口令红包,每个 10 块)。4 点来 Append 口令码,明天上班的兄弟姐妹们辛苦咯~~~
祝大家马年 666 吧~~
随着网络安全形势的日益严峻,入侵检测系统(IDS)成为了防御恶意攻击、保障网络安全的重要工具。在移动互联网和物联网的时代背景下,如何设计一个高效的入侵检测系统,并通过跨平台技术在多个设备上进行部署和管理,成为了开发者面临的一个重要问题。本篇技术博客将通过 Flutter × Harmony6.0 跨端开发技术,深入解析如何构建一个入侵检测系统,并重点介绍如何实现“检测规则”模块。 入侵检测系统主要用于监控计算机系统和网络流量,及时发现潜在的安全威胁并进行报警。随着技术的发展,越来越多的企业和组织开始依赖智能手机和其他移动设备来管理入侵检测系统。因此,如何实现跨平台、统一的用户体验,成为了关键。Flutter 和 Harmony6.0 技术结合,能够满足这一需求,通过一次开发即可覆盖多个平台(包括安卓、iOS、HarmonyOS等)。 Flutter 是 Google 推出的 UI 框架,它使用 Dart 语言,可以编写原生应用,支持 iOS、Android、Web 以及桌面应用开发。它的一大优势是可以通过一个代码库编译生成多个平台的应用,极大地提高了开发效率。 HarmonyOS(鸿蒙操作系统)是华为开发的一款分布式操作系统,支持多设备互联、资源共享。Harmony6.0 是其最新版本,具有更高效的多屏协同和跨平台能力。将 Flutter 与 Harmony6.0 结合使用,可以实现跨平台的无缝连接和高度一致的用户体验。 在入侵检测系统中,监控项用于显示具体的监控数据,例如网络流量、进程监控等。以下是 Flutter 中构建监控项的代码: 解析: 检测规则模块是入侵检测系统的核心部分之一,用于展示各种检测规则及其启用状态。以下是代码实现: 解析: 每个检测规则项通过 解析: 在构建这一入侵检测系统时,借助 Flutter 和 Harmony6.0 的强大跨平台能力,能够大大简化开发流程。特别是在设计 UI 时,Flutter 提供的组件库能够灵活地适配不同平台的界面要求,同时与 Harmony6.0 的分布式特性结合,保证了系统在多设备上的一致性体验。 通过本次项目的开发实践,我们实现了一个基于 Flutter × Harmony6.0 的入侵检测系统,并重点完成了“检测规则”模块的构建。通过详细的代码解析,可以看到 Flutter 在跨平台开发中的优势,以及如何通过简洁的代码实现丰富的功能和界面。这个系统的核心目标是提高网络安全的检测效率,同时通过统一的用户界面让用户能够方便地查看和管理入侵检测规则。基于 Flutter × Harmony6.0 的入侵检测系统:构建检测规则模块
前言

背景
Flutter × Harmony6.0 跨端开发介绍

开发核心代码

1. 构建监控项
/// 构建监控项
/// @param label 标签文本
/// @param value 数值文本
/// @param icon 图标
/// @param color 主题颜色
/// @param theme 主题数据
Widget _buildMonitoringItem(String label, String value, IconData icon, Color color, ThemeData theme) {
return Row(
children: [
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: color.withOpacity(0.1),
borderRadius: BorderRadius.circular(8),
),
child: Icon(icon, color: color, size: 20),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
label,
style: theme.textTheme.bodyMedium?.copyWith(fontWeight: FontWeight.bold),
),
Text(
'今日检测',
style: theme.textTheme.bodySmall?.copyWith(
color: theme.colorScheme.onSurfaceVariant,
),
),
],
),
),
Text(
value,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: color,
),
),
],
);
}Row 组件用于排列监控项的各个部分,包括图标、标签文本、数值文本等。Container 用来显示图标,图标颜色使用传入的 color 参数,并通过 withOpacity(0.1) 添加透明度效果。Expanded 让标签文本和数值文本能够自适应布局。Text 组件展示,并根据传入的 color 进行样式设置。2. 构建检测规则模块
/// 构建检测规则模块
/// 显示各种入侵检测规则及其启用状态
Widget _buildDetectionRules(ThemeData theme) {
return Card(
elevation: 2,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'检测规则',
style: theme.textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold),
),
TextButton.icon(
onPressed: () {},
icon: const Icon(Icons.add, size: 16),
label: const Text('添加', style: TextStyle(fontSize: 12)),
),
],
),
const SizedBox(height: 16),
_buildRuleItem('端口扫描检测', '已启用', Colors.green, theme),
const SizedBox(height: 8),
_buildRuleItem('暴力破解检测', '已启用', Colors.green, theme),
const SizedBox(height: 8),
_buildRuleItem('DDoS攻击检测', '已启用', Colors.green, theme),
const SizedBox(height: 8),
_buildRuleItem('SQL注入检测', '已启用', Colors.green, theme),
const SizedBox(height: 8),
_buildRuleItem('XSS攻击检测', '已启用', Colors.green, theme),
],
),
),
);
}Card 组件用于显示规则卡片,卡片设置了圆角和阴影效果。Row 中的 TextButton.icon 按钮用于添加新的检测规则。_buildRuleItem 展示,传入规则名称、状态以及颜色。使用 SizedBox 来控制每条规则之间的间距。3. 构建检测规则项
_buildRuleItem 方法实现,显示规则的名称、启用状态以及颜色:/// 构建检测规则项
/// 显示单条检测规则
Widget _buildRuleItem(String ruleName, String status, Color color, ThemeData theme) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
ruleName,
style: theme.textTheme.bodyLarge?.copyWith(fontWeight: FontWeight.bold),
),
Text(
status,
style: TextStyle(color: color, fontWeight: FontWeight.bold),
),
],
);
}Row 展示每个规则的名称和状态。color 参数,确保与规则的启用状态一致。
心得
总结
Vibe 起来真爽啊
Xcode 的最新版本 26.3 扩展了对编程代理的支持,可接入 Anthropic 的 Claude Agent 和 OpenAI 的 Codex,助力开发者处理复杂任务并提升生产力。 借助智能体编程,Xcode 能够以更高的自主性朝着开发者的目标推进工作——从任务分解、基于项目架构做出决策,到使用内置工具执行操作。 新版本在 Xcode 26 已引入的智能体编程能力基础上,进一步为编程智能体开放了更多 Xcode 功能的访问权限。苹果公司表示,智能体现在可以进行协作、搜索文档、浏览文件结构以及修改项目设置。此外,智能体还能通过捕获 Xcode 预览来验证代码,查看正在构建的界面效果,识别问题并在此基础上迭代优化。Anthropic 表示,这“在构建 SwiftUI 视图时尤为实用,因为视觉输出是重中之重”。 Anthropic 还强调,Xcode 26.3 集成了 Claude Agent SDK,该 SDK 为 Claude Code 提供支持,让开发者能够使用“Claude Code 的全部功能,包括子智能体、后台任务和插件”。 Xcode 26.3 另一项重要新功能是支持模型上下文协议(Model Context Protocol,MCP),允许开发者将任意兼容 MCP 的智能体或工具与 Xcode 配合使用,也使得在 IDE 直接使用 Claude、Codex 之外的其他智能体成为可能。MCP 集成可通过 xcrun mpcbridge 来启用,示例如下: codex mcp add xcode -- xcrun mcpbridge iOS 开发者 Akhlaq Ahmad 在 LinkedIn 上指出,该公告似乎标志着从 AI 编程助手向更多 AI 协作伙伴变,因为智能体现在可以与 Xcode 交互,“分解目标、规划、实施、运行构建/测试,并持续优化直到代码编译成功并按预期运行”。 虽然对 MCP 的支持有望让 Xcode 以以往无法实现的方式与外部工具交互,但 Reddit 用户 TrajansRow 提醒,其权限模型“会带来一些阻碍”: 如果你将 Xcode MCP 服务器添加到外部智能体系统,每次有新的智能体 PID 发出请求时,都必须手动关闭“允许‘agent’访问 Xcode?”的弹窗。 不过,Hacker News 的读者 drak0n1c4 反馈,Xcode 26.3 中的 MCP 支持“目前存在缺陷”,它返回的格式与其声明的 Schema 不一致,导致无法与 OpenCode 配合使用。 Xcode 26.3 虽可安装在旧版 macOS 上,但 AI 编程相关功能仅在运行代号为 Tahoe 的 macOS 26 时可用。Xcode 26.3 目前已通过苹果开发者网站向 Apple Developer Program 会员提供,不久后将通过 App Store 向所有开发者开放。 原文链接: https://www.infoq.com/news/2026/02/xcode-26-3-agentic-coding/
Matrix 首页推荐
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
前段时间,我终于为桌面添置了一对音箱,来自 Kali Audio 的 LP-UNF,也算是给我纠结了许久的桌面音箱选择,先按下了一个暂停键。说实话,作为一个桌面音箱的小白,即便此前翻过不少 HiFi 理论,也折腾过耳机和麦克风,真到了音箱的领域,还是难免有种「武功全废」的迷茫感。
打开电商平台,在上面搜索「桌面音箱」这个关键词时,迎面而来的是一片混乱:外形各异、体积悬殊,从花里胡哨、闪着 RGB 灯光的桌面摆件,到长得像从上世纪实验室穿越来的黑匣子。但在研究了一圈之后,剥离掉那些花哨的营销词汇,真正决定使用体验的,始终只有三件事:声音表现、功能配置,以及使用场景。
基于这个理解,我开始了自己的筛选之路。下面就顺着这条选购路径,和大家聊聊我为什么最终选择了 LP-UNF,以及这段时间它的真实使用体验。

如果你在意的是音箱的声音本身,那么无论它被归类为影音娱乐还是工作监听,它首先得是一个正经的音箱。声音本质上是空气的振动,这意味着音箱必须具备足够的内部容积(搭配单元尺寸、冲程),让低频得以自然展开,同时拥有足够的箱体刚性避免箱体自身共振产生杂音,这是箱体设计的基础。合适的声音单元和合理的分频逻辑亦是让音箱发出好声音的关键。而规范的接口与电源设计,则直接关系到音箱系统的稳定性,以及长期使用时的可靠程度。
只有在这些前提成立的情况下,你才能在有限的预算内,买到哪怕只多一点、但确实「值回票价」的声音——这也是避开「听个响」的第一步。而这,往往也意味着你需要在音箱的外观上做出取舍,或者通过提高预算来换取更多自由度——但对于新玩家而言,我并不建议一开始就把预算拉得太高。毕竟,大部分高价音箱在二手市场上的折价幅度都不小,流通性也不如其他数码产品。

关于预算,如今,即便看起来颇为专业的监听音箱,在价格上也已不再高不可攀;但在千元(成对)以内,真正称得上可靠的选择依旧不多。原因其实并不复杂——箱体、单元、功放、电源,每一项都在实打实地消耗成本,几乎不存在「压缩」的空间。在千元位段内,我个人推荐更为常见的国产多媒体桌面音箱。能在几百元的成本下,依然给出完整的箱体结构、明确的单元配置,以及相对规范的供电与接口设计,本身就非常考验供应链整合能力。在这一点上,长期深耕 PC 多媒体音箱市场的国产厂商,独具优势。
我的预算是 2000-3000 元(成对),这个价位可以买到一些品牌的入门型号,也是我认为开始折腾音箱较为合适的价格区间。说实话,在这个价位段,每一位选手都非常有说服力。
这里面既有近一年在各类内容平台中被频繁推荐、迅速积累人气的 Adam D3V 这样的新锐;也有 IK iLoud Micro Monitor 这类以便携性与极限体积控制见长的专业选手;更少不了 JBL LSR305P MkII 这样经受过市场长期检验的守门员。
但在反复权衡后,我最终还是以 2100 元左右的价格,购入了这对白色版本的 Kali Audio LP-UNF。

坦率地说,在下单前我也有过犹豫。在一众大牌面前,Kali Audio 这个名字听起来实在太陌生了。但深入了解后我才发现,这个年轻的品牌并非「来路不明」。它由 Charles Sprinkle 和 Nate Baglyos 等前 JBL 核心成员创立,团队曾深度参与 7 系及 M2 等旗舰录音室音箱的研发。所以 Kali 更像是从 JBL 监听体系中分化出来的一条支线。
也正因为如此,虽然 Kali 的产品在设计上显得粗犷、随性:用地名缩写命名产品系列(如 LP Lone Pine 孤松镇、 IN Independence 独立城、 SM Santa Monica 圣莫妮卡),外观直白到几乎没有修饰。但我对他们的产品实力,仍抱有较高期待,毕竟师出有名,这也是我最终选择 LP-UNF 的原因之一。
接下来,我会结合自己的桌面环境,从声音表现、使用体验与外观设计三个方面,验证一款桌面音箱在这个价位段究竟该提供哪些价值,以及我为什么最终选择了它。
如果只选一个最直接、也最核心的理由,LP-UNF 最打动我的,毫无疑问是它的声音表现。整体听下来,作为一款正经的监听音箱,LP-UNF 三频的取向相对克制而均衡,其中中频的表现无疑是最佳的。
人声与大多数乐器都处在一个自然、连贯且密度适中的位置,不会刻意前凸,也不会被低频或高频所掩盖。像军鼓或各类打击乐这类瞬态极强、动态起伏明显的声音,会利落地从音箱中跃动而出,但这种「冲击感」并不建立在夸张的边缘感或刺激性的高频之上,而是一种干净、迅速且可控的呈现方式。它不追求听感上的华丽或讨好,也不会刻意渲染质感,只是如实地把声音本身的起音、力度与衰减过程完整地交代出来。关于低频,几乎所有提及 LP-UNF 的内容,都对其低频延伸能力不吝溢美之词。客观来说,这种评价并非空穴来风——无论是官方给出的频响参数,还是实际的聆听体验,LP-UNF 在低频下潜上的表现,确实超出了我对桌面音箱的常规预期。

而另一个在声音上的优点便是底噪,Kali 早期的产品(如第一代产品)在底噪控制上口碑不佳,这也成为了我的顾虑。不过得益于 Kali 近几年在 D 类功放与整体电路设计上的持续研究迭代,自 LP-6 V2 开始,其底噪问题就已经得到了相当程度的改善,而 LP-UNF 的底噪也非常低,比我此前在线下的音像店试听的一些小音箱都要更低。更不用提原本在我选购清单里的 JBL LSR305P MkII 了,诚然,作为一款经典的入门箱,它的听感冲击力以及瞬态表现都非常棒,但是它的底噪在贴近之后还是较为明显的。
声场方面,在桌面环境中,最常见的问题,便是「箱感」会被放大,声场并非真正铺展在空间之中,而更像是从某个箱体、某个具体单元里被直接「推」出来。LP-UNF 在桌面近场听音条件下,依然能够构建出相当开阔的声场,在结像与声场融合度上的控制相当到位,即便贴近聆听,也不会有明显的箱感。不过若说这个尺寸这个价位,有没有更强劲的选手,我此前试听过一套 DALI 达尼 KUPID 丘比特的系统,在这方面要更为震撼,但作为无源音箱,其使用体验又属于完全不同的范畴,预算估计也要翻上一番。

简单聊完了声音表现,我们再来聊聊它的外观设计。
造型方面,相较于走精致、小巧路线的紧凑型桌面音箱,LP-UNF 的设计可以说相当粗犷。它在电商页面上的白底展示图中,很难在第一眼就让人产生好感——造型朴实,塑料感几乎要溢出屏幕。全黑的正面面板、大尺寸的波导结构,以及指示灯与触控区域的布局,都在反复强调「功能优先」的取向。
不过,在实际到手、并真正放入桌面环境之后,这对音箱倒也逐渐显露出一些值得细看的设计细节。

作为一款采用前置倒相孔、且并不追求紧凑化设计的 4.5 英寸音箱,LP-UNF 在桌面音箱中俨然是个「大块头」。以常见书籍尺寸作参考,单只音箱的宽度接近两本 16 开书并排,高度则约等于一本厚杂志立放,但 LP-UNF 在桌面上并不显得笨拙。
音箱侧面采用了连续的曲面过渡,顶部与底部也都略微向内收敛。这种几何上的「内缩」在视觉上削弱了体积感,从正面看过去,反而让箱体显得比实际尺寸要苗条一些。而在主音箱背面,则集成了接口和 EQ 调试面板,并在上方丝印了使用说明,很直观,很好用。

而真正让我产生情绪波动的,主要是音箱的正面。
在单元面板上,Kali 勾勒出两条凸显「曼妙」腰身的凹槽曲线。或许意在通过视觉引导去强调单元本身的存在感,也可能是试图挽回一点作为桌面音箱的「设计感」,至于效果如何,就见仁见智了。高音与低音单元之间,是一条梭形的 LED 灯条。正常工作状态下,蓝色的光点会伫立在灯条中心,灯条左右两端则印有加减符号,对应前面板的多功能触控区域。音量调节、静音、蓝牙配对、左右声道切换等操作,都会通过灯条的变化直观反馈出来。

比起它的前辈,这灯条不仅变大变粗了,功能也变多了。从使用角度来说,这套设计确实直观、也很实用。常用操作都集中在前面板,不必再把手绕到音箱背后摸索;和传统的前置旋钮相比,触控方案谈不上绝对优劣,但在桌面场景下,足够方便。只是你若指望它能为桌搭增添多少审美价值,不妨试想这样一个画面——当你坐在显示器前,那个蓝色的「眼睛」正安静地注视着你。我脑海里浮现的,大概只有《X 战警》里蓄势待发的镭射眼,或《终结者》那只随时准备锁定目标的电子眼。

视线沿着低音单元继续下移,便撞见了 Kali 引以为傲的「家族式设计」——那道标志性的微笑倒相孔。前置倒相孔在桌面环境中的实用性毋庸置疑,对摆位友好,只是相较于声擎等品牌刻意弱化存在感的狭缝式前倒相设计,Kali 选择了完全相反的路线——尺寸不小、形态直白,以至于你在使用过程中,目光会不自觉地一次次落到这个「微笑形」的开孔上,甚至会产生一种它在炫耀的错觉:「嘿,我的倒相孔很大块吧」。我几乎可以想象到,设计师在拍板这个足够「标志性」的造型时,那种难以掩饰的洋洋自得。
说真的,盯着这个倒相孔看久了,确实会莫名产生一种想把手伸入其中的冲动,或许人类天生对洞穴有着一种近乎自杀式的探索欲,而这道「微笑」恰好深邃得仿佛《鬼妈妈》里通往蜘蛛巢穴的秘密通道,或是《罗马假日》里裁断谎言的真理之口。一个用来消除端口噪音和压缩的曲面通道,硬是搞出了凝视深渊的恐惧。

面板最底部镶嵌着 Kali 的品牌铭牌,立体电镀的字符在光线下微微反射,在哑光白色的面板衬托下,透着一种克制的冷峻感。这大概是整对音箱身上,唯一一处试图通过装饰来彰显身份的设计。只是 Kali 的图标设计,确实有够「理工男」的,两条交汇的波形,像是从某次示波器里截取的相位图,下面托着方方正正、毫无修饰的 KALI 四个大写字母。
算了,还是聊聊更重要的使用体验吧——包括那些让我满意的点,和不太舒服的槽点。

作为一款监听音箱, LP-UNF 在使用上最大的优势,莫过于连接方式的便捷。无论是 USB 直连电脑,还是通过 TRS、RCA 接入专业设备,或是蓝牙连接手机和平板,都能轻松应对。主副音箱设计也极为直观:几乎所有接口和调节功能都集中在主音箱上,副音箱只需一根四针线即可工作,电源也只接入主箱即可。如果你曾深陷于选功放、挑解码器、纠结信号线材的 HiFi 玄学之中,那么 LP-UNF 几乎可以说完全免疫这些烦恼。有源设计意味着无需外接功放,内置 DAC 省去了折腾解码器的成本,而 USB 直连则让数字信号直接进入音箱的处理链路,避免了多余的模拟转换——也不必再去买什么单晶铜镀银或合金音频线,一根平平无奇的 USB 数据线就足够了。你可以把更多精力放在实际听感与桌面布局上,而不是被复杂的硬件组合搞得头大。

而作为一款桌面音箱,它的声学性能也非常扎实,无论是纸面参数,还是实际的近场聆听体验,它都对得起监听这两个字。如果你为声音而来,LP-UNF 绝不会让你失望。它在专业监听能力与多样化连接方式之间,给出了一个极具性价比的平衡点,你真的很难在 2000 元价位段,买到一对配置如此均衡且「省心」的选手。
那么,代价是什么?
为了控制成本与体积,LP-UNF 的箱体并未采用传统监听音箱常见的纤维板、实木板,而是选择了注塑塑料。当然,随着制造工艺的进步,塑料箱体并不必然等同于「廉价」——通过使用高密度工程塑料、增加壁厚、加强内部筋位设计,同样可以获得相当不错的刚性与共振控制。但很遗憾,LP-UNF 并不属于这一类产品。尽管白色涂装在视觉上掩盖了不少廉价感,敲击箱体时,能明显感受到较为清脆、偏空的回馈,而非好箱体那种相对沉稳的钝响。对于便宜的入门型号来说,这样的箱体取舍本身无可厚非。

但问题在于,LP-UNF 在声音表现上却相当「贪心」。 更大的单元、更长的冲程,让它能够推动更多、更重的空气;与此同时,在近场桌面环境中,这些低频能量也更容易与桌面、墙面发生耦合,而塑料箱体也没有足够的密度去减少共振。结果是,在小房间或摆位不佳的情况下,低频会显得偏厚、略显浑浊,甚至在某些频段出现嗡鸣。
从这个角度来说,LP-UNF 的低频能力更像是一把双刃剑:在合适的摆位与环境下,它能提供远超普通桌面音箱的下潜与量感;但若空间有限、声学条件欠佳,它也更容易暴露出低频设计上的问题。

这些问题并非无法改善,通过合理调整房间的声学环境、优化音箱摆位,或者适度使用 EQ 调节,都可以在一定程度上缓解这些低频问题。但终归,这是一项设计上的硬伤,但既然你想花更少的钱得到更好的声音,难免要折腾一番。
如果你和我一样,预算不多,也不想折腾前端系统,又想获得扎实的声音,那 Kali Audio 的 LP-UNF 绝对是这个价位段的优秀选择之一。

在此基础上,如果你对外观设计有更高的要求,折腾达尼丘比特这类入门级无源音箱,或许会是另一条更舒适的路径。如果预算提升,对声音有着更高追求,私心推荐 Focal(劲浪) 的录音室系列。相较于它声名远扬、价格高昂的民用 HiFi 系列,其专业监听线在国内虽名不见经传,但声价比绝对没话说,是进阶路上的绝佳选择

最后的最后,尽管前文吐槽了不少,但即便时间倒流,我大概还是会把它带回桌面。Kali 不嫌我穷,我自是没有嫌它「塑料」的道理。更何况,在这个玄学肆虐的音频市场里,能有这样一个朴素,甚至有点接地气的品牌,何尝不是一种浪漫。
当然,这种浪漫是有前提的,只要它别涨价。

> 关注 少数派小红书,感受精彩数字生活 🍃
> 实用、好用的 正版软件,少数派为你呈现 🚀
在数字化转型浪潮中,CRM(客户关系管理)系统已成为企业打通销售全链路、提升客户运营效率的核心工具。本次评测选取11款国内外主流CRM产品,围绕客户管理、SFA( 销售自动化 )、团队协同、统计分析、自定义能力五大核心维度展开深度横向对比,为不同规模、不同业务场景的企业选型提供专业参考。 评测对象包括:超兔一体云、Pipedrive、Nimble、Insightly、Streak、Infor CRM、Zendesk Sell、快启CRM、金现代CRM、管家婆、飞书CRM。 客户管理的核心是实现线索-客户-成交-复购的全流程可控,通过精准画像、数据查重和权限隔离提升客户运营效率与数据安全性。 SFA通过标准化跟单模型、自动化任务触发和订单财务管控,降低销售手动操作成本,提升成单转化率。 通过角色权限隔离、跨部门工单流转和供应链协同,打破信息孤岛,实现销售、财务、采购、客户的全链路协同。 通过多维度数据聚合、可视化报表和AI预测,为企业提供销售效能、库存管理、财务状况的全景洞察。 通过按需订阅、自定义配置和低代码开发,让CRM系统快速适配企业独特业务流程,降低落地成本。 本次评测显示,不同CRM系统的核心能力差异显著:国际品牌侧重通用销售自动化,本土品牌更贴合国内企业的全流程协同与低代码定制需求,而超兔一体云凭借全业务打通的一体云架构、多场景跟单模型和高自定义能力,在中小微企业CRM选型中具备明显优势。企业需根据自身业务规模、行业属性和数字化阶段,选择最适配的CRM系统。引言
一、客户管理:从线索到复购的全生命周期闭环
核心价值
关键能力横向对比
品牌 全生命周期覆盖 客户画像能力 查重机制 数据权限管理 特色功能 超兔一体云 全流程覆盖 工商补全/社交头像/经纬度标记 多字段查重/模糊简称查重/自定义 角色分级/财务数据隔离 自动标记工商地址经纬度、微信支付宝头像获取 Pipedrive 全流程覆盖 可定制字段/移动端同步 基础字段查重 角色级权限 移动端实时数据同步 Nimble 全流程覆盖 社交数据自动更新 基础字段查重 团队级权限 Twitter/LinkedIn数据整合 Infor CRM 全流程覆盖 行业化客户细分 行业适配查重 角色+部门权限 汽车/零售垂直行业客户管理模板 快启CRM 全流程覆盖 基础画像/分类管理 基础字段查重/公海规则关联 角色分级/签约客户分库 智能公海推荐、来电弹屏 金现代CRM 全流程覆盖 360°视图/流失预警 基础字段查重 角色分级/跨部门权限 AI客户画像、智慧商城联动 典型流程可视化(超兔一体云)
flowchart LR
A[多渠道集客<br>百度/抖音/官网/微信/工商搜客] --> B[线索一键处理<br>新客户/老客户待办/订单]
B --> C[客池分类<br>需求培养/有需求/上首屏/目标/成功]
C --> D[客户画像与背景调查<br>工商补全/天眼查/微信头像]
D --> E[客户维护<br>跟单/订单/财务记录]
E --> F[客户复购/流失预警]
style A fill:#f9f,stroke:#333,stroke-width:2px
style F fill:#9f9,stroke:#333,stroke-width:2px二、SFA(销售自动化):适配多场景的跟单效率引擎
核心价值
关键能力横向对比
品牌 跟单模型数量 自动化场景 订单/财务管控 特色功能 超兔一体云 3种(三一客/商机/多方项目) 待办提醒/订单锁库/采购计划生成 应收三角联动/账期信用管理 三一客小单快单模型、多方项目全周期管控 Pipedrive 1种(通用) 任务提醒/AI销售助理/互动追踪 交易阶段预测 AI销售助理、交易进度预测 Zendesk Sell 1种(通用) 邮件序列/自动拨号 基础订单跟踪 批量个性化邮件模板、原生拨号功能 金现代CRM 1种(通用) 跟进任务触发/AI开单 库存价格实时同步 语音/图片AI开单、智能漏斗分析 快启CRM 1种(通用) 跟进任务触发/日程同步 基础订单跟踪 可视化销售漏斗、跟单转日程 特色模型可视化(超兔三一客小单快单)
mindmap
root((超兔三一客小单快单模型))
三定规则
定性<br>判断客户需求真假
定级<br>评估客户购买力等级
定量<br>明确成单时间与金额
关键节点推进
首次触达<br>需求确认
方案发送<br>异议处理
报价跟进<br>逼单成交
效率提升
一键生成待办
自动同步跟单时间线
数据自动汇总报表三、团队协同:跨角色跨链路的信息协同网络
核心价值
关键能力横向对比
品牌 角色权限管理 跨部门协同能力 供应链协同能力 特色功能 超兔一体云 双重指挥系统/角色分级 跨岗位数据隔离/待办同步 OpenCRM平台全流程协同 华为式行政+业务双重指挥系统、上下游对账 飞书CRM 飞书原生角色权限 飞书会议/文档/即时通讯联动 无原生供应链协同 依托飞书生态全场景协同 Infor CRM 角色+部门权限 跨系统数据同步 Infor SCM套件联动 制造业零部件采购进度同步 金现代CRM 飞书原生角色权限 工单流转/SLA管理 无原生供应链协同 飞书即时沟通+工单流转闭环 快启CRM 角色分级管理 跨部门短消息沟通 无原生供应链协同 异常操作实时提醒、项目考核闭环 供应链协同可视化(超兔一体云)
flowchart TD
subgraph 企业内部系统
A[超兔一体云CRM] --> B[订单管理]
A --> C[采购管理]
A --> D[财务管理]
end
subgraph 上游供应商
B --> E[询价响应]
C --> F[采购执行<br>发货/物流]
D --> G[付款发票/对账]
E & F & G --> H[供应商评分]
end
subgraph 下游客户
B --> I[报价确认/订单确认]
B --> J[物流订阅/收货确认]
D --> K[款项发票/投诉处理]
I & J & K --> L[客户满意度反馈]
end
H --> A
L --> A四、统计分析:数据驱动的决策支撑体系
核心价值
关键能力横向对比
品牌 分析引擎类型 数据覆盖维度 可视化能力 特色功能 超兔一体云 多表聚合/同比环比引擎 销售/财务/库存/客户全维度 自定义大屏/驾驶舱 单日KPI引擎、复杂多表关联BI分析 Pipedrive AI预测分析引擎 销售全维度 销售漏斗可视化 AI驱动交易预测、实时销售报告 金现代CRM 对话式BI引擎 销售/财务/库存/服务多维度 多维可视化报表 AI对话生成报表、经营预警 快启CRM 效能分析引擎 销售过程/结果/人员维度 效能报表可视化 薪酬激励体系支撑报表 Infor CRM 行业化分析引擎 销售/供应链维度 行业化报表 汽车/零售行业定制报表 五、自定义能力:适配企业个性化需求的柔性框架
核心价值
关键能力横向对比
品牌 功能订阅模式 菜单/工作台自定义 业务表/工作流自定义 特色功能 超兔一体云 功能白名单按需订阅 三级菜单/多岗位驾驶舱 自定义业务表/复合工作流 自定义多表聚合BI分析 飞书CRM 生态内按需开通 飞书工作台自定义 低代码Apaas定制 基于飞书应用引擎深度定制 金现代CRM 模块按需订阅 角色专属工作台 低代码平台全流程定制 20+行业模板适配 快启CRM 模块按需订阅 基础菜单自定义 低代码字段/报表定制 跟进字段/效能报表个性化配置 Infor CRM 行业套件订阅 行业模板固定菜单 行业化工作流定制 垂直行业智能补货系统定制 六、综合能力雷达图与选型推荐
综合能力评分(满分100)
品牌 客户管理 SFA 团队协同 统计分析 自定义能力 综合得分 超兔一体云 90 92 88 89 91 90 Pipedrive 85 88 82 86 84 85 Nimble 82 78 80 75 76 78 Insightly 83 81 84 80 82 82 Streak 75 72 70 68 70 71 Infor CRM 88 85 86 83 79 84 Zendesk Sell 80 83 78 77 75 79 快启CRM 86 84 81 85 87 85 金现代CRM 87 86 85 88 89 87 管家婆 84 82 83 82 80 82 飞书CRM 81 79 90 84 88 84 选型推荐
结语