1. 这不是PPT,而是一张会呼吸的销售作战地图
Power BI 电商销售可视化看板,这个词组最近在运营、数据和BI工程师的茶水间里高频出现。它不是把Excel图表拖进PPT里凑数,也不是让设计师画几张高大上的Dashboard截图应付汇报——它是一套能实时响应业务脉搏、自动预警异常、支撑一线快速决策的动态作战系统。我带过三支电商团队做过类似项目,最深的体会是:一个真正落地的看板,80%的功夫花在“数据怎么来”和“业务怎么用”上,剩下20%才是Power BI界面里的拖拉拽。很多人卡在第一步:MySQL里几十张表,订单、商品、用户、促销、物流、售后……字段命名五花八门,时间格式不统一,空值逻辑混乱,连基础口径都对不上,这时候硬上Power BI,做出来的就是“好看但不敢信”的幻灯片。
这个“从0到1”的实战,核心解决三个真实痛点:第一,销售数据分散在MySQL、ERP、CRM多个系统里,每天靠人工导出再合并,滞后24小时以上;第二,管理层问“昨天哪个品类转化率跌了?为什么?”时,没人能在3分钟内给出带归因的结论;第三,运营同学想验证一个促销活动效果,得等数据同事排期,一周后才拿到结果,黄花菜都凉了。我们做的不是炫技的仪表盘,而是把MySQL数据库变成销售前线的“神经末梢”,让每个关键指标(比如“昨日实时GMV”、“TOP10滞销SKU库存周转天数”、“新客首购7日复购率”)像手机信号格一样,一目了然、随时可查、点击可钻。整个流程不依赖任何外部SaaS工具,全部基于Power BI Desktop + MySQL Connector + 本地部署的数据刷新机制,成本可控、权限清晰、链路透明。如果你是电商公司的数据分析师、运营负责人,或是刚转行想拿一个硬核项目进简历的新人,这篇内容就是你抄作业的完整底稿——从建模逻辑、DAX公式陷阱,到MySQL慢查询日志如何反向优化看板性能,全都有实操记录。
2. 整体设计思路:为什么必须绕开“先做图再填数”的坑
2.1 业务驱动建模,而非工具驱动堆砌
很多Power BI新手一上来就打开软件,新建空白报表,兴奋地拖入“销售额”“订单量”“用户数”三个饼图——这是典型“工具驱动”思维。结果做了一周,发现老板问:“上个月大促期间,安卓端新客的客单价比iOS低多少?这部分人群的退货率是否异常?”你翻遍所有图表,找不到答案,因为建模时根本没考虑“设备类型×新老客×促销周期”这个交叉维度。真正的起点,永远是业务问题清单。我们和销售总监、运营主管、客服主管开了三次对齐会,最终锁定6类高频决策场景:
- 场景1:实时监控——“此刻每分钟成交额、支付成功率、下单跳出率”
- 场景2:归因分析——“618大促GMV增长中,新品贡献占比 vs 老品复购贡献占比”
- 场景3:库存预警——“库存深度<7天且近3日销量环比涨超50%的SKU清单”
- 场景4:用户分层——“RFM模型下,高价值沉默用户(R>90天,F≥5,M≥2000)的召回策略效果”
- 场景5:渠道评估——“抖音小店 vs 淘宝旗舰店的获客成本(CAC)与生命周期价值(LTV)比值”
- 场景6:异常探测——“单日退款率突增超均值2个标准差的店铺/商品类目”
这6个场景,直接决定了我们的数据模型骨架。比如场景3要求我们必须有“SKU粒度的每日销售快照表”,场景4要求用户表必须包含首次购买时间、最近购买时间、总消费金额三个基础字段。建模不是为了把所有字段塞进Power BI,而是为了确保当业务问题抛过来时,模型里已经有现成的“答案路径”。我们最终只接入了MySQL中的7张核心表(orders, order_items, products, users, promotions, logistics, returns),其余32张辅助表全部被过滤掉——不是它们不重要,而是当前阶段用不到,强行接入只会拖慢刷新速度、增加维护成本。
2.2 数据链路设计:为什么选择MySQL直连而非ETL中转
网络热词里提到“power bi mysql connector/net”,这背后其实是个关键选型决策。市面上常见方案有三种:
- 方案A:MySQL → Python脚本清洗 → CSV文件 → Power BI导入
- 方案B:MySQL → Airflow调度ETL → 数据仓库(如ClickHouse) → Power BI连接
- 方案C:MySQL → Power BI DirectQuery模式直连
我们最终采用方案C,但做了重要改造:不使用DirectQuery,而是用Import模式+计划刷新+MySQL视图预聚合。原因很实在:
- DirectQuery模式下,每个图表交互(比如切片器筛选)都会实时向MySQL发SQL查询,而电商库的orders表单日增量常达百万级,一次“按省份筛选销售额”可能触发全表扫描,页面直接卡死;
- 方案A的CSV方式虽然简单,但无法实现“准实时”(最快1小时刷新),且Python脚本一旦出错,整个链路中断,排查成本高;
- 方案B的ETL中转最健壮,但需要额外运维数据仓库,对于中小电商团队属于过度设计。
我们的折中解法是:在MySQL里创建物化视图(MySQL 8.0+支持)或定时刷新的汇总表。例如,创建一张sales_summary_daily视图,每天凌晨2点通过事件调度器(Event Scheduler)执行:
CREATE OR REPLACE VIEW sales_summary_daily AS SELECT DATE(o.created_at) as sale_date, p.category_id, p.brand, COUNT(DISTINCT o.user_id) as new_user_count, SUM(oi.quantity * oi.price) as gmv, COUNT(*) as order_count FROM orders o JOIN order_items oi ON o.order_id = oi.order_id JOIN products p ON oi.product_id = p.product_id WHERE o.status IN ('paid', 'shipped') GROUP BY DATE(o.created_at), p.category_id, p.brand;Power BI只连接这张轻量级视图,而非原始orders表。实测下来,报表加载速度从12秒降至1.8秒,且避免了DirectQuery的并发压力。这个设计的核心逻辑是:把计算压力从Power BI前端移到MySQL后端,用数据库的索引和缓存能力扛住高频查询,而不是让BI工具当数据库用。
2.3 性能与安全的平衡术:为什么不用“全库权限”连接
很多教程教大家创建一个MySQL账号,授予SELECTon*.*权限,然后填进Power BI连接字符串。这在测试环境没问题,但上线后就是定时炸弹。我们给Power BI专用账号设置的权限精确到表和字段:
- 只授予
SELECT权限,禁止INSERT/UPDATE/DELETE; - 仅对7张核心表授权,且对
users表只开放user_id,register_date,last_login等脱敏字段,隐藏手机号、身份证号; - 对
orders表,通过视图限制只能查status IN ('paid','shipped')的订单,屏蔽“已取消”“待支付”等干扰状态。
更关键的是连接字符串写法。Power BI默认生成的连接串包含明文密码,我们改用Windows凭据管理器存储密码,并在Power BI Desktop中勾选“使用Windows身份验证”。生产环境部署到Power BI Service时,则通过“网关”配置,让网关服务账户持有MySQL权限,Power BI云端报表完全不接触数据库凭证。这套组合拳,既满足了GDPR式的数据最小化原则,又避免了密码泄露风险——毕竟,一个电商数据库的泄漏,代价远不止是技术问题。
3. 核心细节解析:从MySQL建模到DAX公式的硬核拆解
3.1 MySQL端准备:三张表决定看板成败
Power BI的威力,70%取决于上游数据质量。我们重点打磨了三张表的结构和索引,它们是整个看板的基石:
第一张:orders订单主表
字段精简至12个核心字段(删掉remark、ext_data等JSON冗余字段),关键改造:
created_at和paid_at字段统一为DATETIME类型,并建立复合索引(status, created_at),支撑“按状态查某日订单”的高频查询;- 新增
order_month虚拟列(ALTER TABLE orders ADD COLUMN order_month VARCHAR(7) AS (DATE_FORMAT(created_at, '%Y-%m')) STORED),避免Power BI里用DAX做日期截取,直接提升聚合性能; - 对
user_id字段添加非空约束和索引,确保与users表关联时不会因NULL值导致笛卡尔积。
第二张:order_items订单明细表
这是最容易被忽视的性能黑洞。原始表有order_id,product_id,quantity,price,discount等字段,但缺少“有效销售金额”预计算。我们在MySQL里加了一个生成列:
ALTER TABLE order_items ADD COLUMN actual_amount DECIMAL(10,2) AS (quantity * price - discount) STORED;并在(order_id, product_id)上建唯一索引。这样Power BI做“单品销量TOP10”时,直接SUM(actual_amount)即可,无需在DAX里写复杂条件判断。
第三张:products商品维度表
电商看板的灵魂在于“可钻取”。我们重构了这张表:
- 删除
description等长文本字段(Power BI加载时会吃掉大量内存); - 将
category_path(如“家电>大家电>空调>变频空调”)拆分为category_level1,category_level2,category_level3三个字段,方便做层级切片; - 添加
is_new_product布尔字段(根据launch_date > DATE_SUB(NOW(), INTERVAL 90 DAY)动态计算),让“新品监控”模块无需DAX判断。
这三张表的改造,看似只是DBA的工作,实则决定了Power BI里能否写出简洁高效的DAX。我试过直接连原始表,一个“各品类GMV同比”度量值写了23行DAX还报错;改完表结构后,同一需求只需:
GMV YoY = VAR CurrentYearSales = CALCULATE([Total GMV], YEAR('Date'[Date]) = YEAR(TODAY())) VAR LastYearSales = CALCULATE([Total GMV], YEAR('Date'[Date]) = YEAR(TODAY())-1) RETURN DIVIDE(CurrentYearSales - LastYearSales, LastYearSales)3.2 Power BI建模:关系不是“自动识别”,而是“精准手术”
Power BI的“自动检测关系”功能,在电商多表关联场景下大概率失效。orders表和order_items表的关联,表面看是orders.order_id = order_items.order_id,但实际存在一对多关系,且order_items里可能有同一订单的多次退款记录(status='refunded')。如果直接让Power BI自动建关系,会导致销售额被重复计算。
我们的手动建模步骤:
- 在“模型”视图中,删除所有自动生成的关系线;
- 手动创建关系:
orders[order_id]→order_items[order_id],方向设为“单向:从orders到order_items”(关键!避免反向聚合错误); - 对
order_items表,添加筛选器:FILTER(order_items, order_items[status] <> 'refunded'),这个筛选器写在表级别,而非度量值里,确保所有引用该表的度量值自动生效; - 创建“日期表”:用DAX生成连续日期表
Date = CALENDAR(MIN(orders[created_at]), TODAY()),并添加Year,Month,Weekday等列,必须将此表与orders表的created_at字段手动关联,否则时间智能函数(如SAMEPERIODLASTYEAR)无法工作。
这里有个血泪教训:曾有个同事没设关系方向,结果“昨日订单量”显示为实际值的3倍。排查了两天,最后发现是order_items里一条订单对应3条物流记录,Power BI默认双向关系导致了三次计数。关系方向不是技术细节,而是业务逻辑的具象化表达——订单是事实主体,明细是它的附属,不能反过来让明细驱动订单。
3.3 DAX公式避坑指南:那些文档里不会写的“坑”
DAX是Power BI的引擎,但也是新手最易翻车的地方。分享三个真实踩过的坑:
坑1:“销售额”度量值在切片器筛选下失效
现象:加了“省份”切片器后,销售额数字不变。
原因:原始公式Total Sales = SUM(order_items[actual_amount])没有考虑上下文。当切片器筛选“广东省”时,Power BI需要知道“哪些订单属于广东”,但order_items表里没有province字段,它只和orders表关联,而orders表里才有province。
解决方案:用RELATED函数穿透关联:
Total Sales = CALCULATE( SUM(order_items[actual_amount]), FILTER( orders, orders[province] IN VALUES('Province'[Province]) ) )或者更优雅的写法:
Total Sales = SUMX( RELATEDTABLE(orders), SUMX(RELATEDTABLE(order_items), order_items[actual_amount]) )坑2:“复购率”计算结果为0
需求:计算“过去30天下单用户中,有2次及以上订单的用户占比”。
错误写法:Repeat Rate = DIVIDE(COUNTROWS(FILTER(USERS, [Order Count] >= 2)), COUNTROWS(USERS))
问题:[Order Count]是用户表的度量值,但在FILTER函数里无法被正确上下文化。
正确解法:用SUMMARIZE先聚合再计算:
Repeat Rate = VAR UserOrders = SUMMARIZE(orders, orders[user_id], "OrderCount", COUNTROWS(orders)) VAR RepeatUsers = COUNTROWS(FILTER(UserOrders, [OrderCount] >= 2)) VAR TotalUsers = COUNTROWS(VALUES(orders[user_id])) RETURN DIVIDE(RepeatUsers, TotalUsers)坑3:“实时GMV”刷新延迟
需求:看板右上角显示“当前小时GMV”,要求每5分钟刷新。
误区:以为设置“计划刷新”为5分钟就行。实际上,Power BI Service的计划刷新最小粒度是15分钟,且受网关负载影响。
实战解法:用Power Automate创建流,每5分钟调用MySQL API获取最新gmv_last_hour值,写入一个单独的“实时指标”表,Power BI用DirectQuery模式连接这张小表。虽然增加了组件,但保证了业务要求的时效性。
4. 实操全流程:从环境搭建到发布上线的逐帧记录
4.1 环境准备:三步搞定MySQL与Power BI握手
Step 1:MySQL端开通远程访问
不是简单GRANT ALL,而是精准放行:
-- 创建专用账号 CREATE USER 'pbi_reader'@'%' IDENTIFIED BY 'StrongPass!2024'; -- 授予最小权限 GRANT SELECT ON ecommerce_db.sales_summary_daily TO 'pbi_reader'@'%'; GRANT SELECT ON ecommerce_db.products TO 'pbi_reader'@'%'; GRANT SELECT ON ecommerce_db.users TO 'pbi_reader'@'%'; FLUSH PRIVILEGES;注意:ecommerce_db是数据库名,不是*.*;sales_summary_daily是前面建的汇总视图,不是原始大表。
Step 2:安装MySQL Connector/NET
下载地址:https://dev.mysql.com/downloads/connector/net/ (选8.0.x版本,兼容Power BI)。安装时勾选“Add MySQL to PATH”,否则Power BI会提示“找不到驱动”。
Step 3:Power BI Desktop连接配置
打开Power BI Desktop → “获取数据” → “MySQL数据库” → 填写:
- 服务器:
your-mysql-server-ip:3306 - 数据库:
ecommerce_db - 用户名:
pbi_reader - 密码:输入密码(开发阶段可明文,上线前务必用凭据管理器)
→ 点击“高级选项”,勾选“启用查询折叠”,这能让Power BI把筛选条件(如WHERE category='手机')下推到MySQL执行,而不是把全表拉到本地再过滤。
4.2 数据加载与清洗:别跳过这15分钟,否则后面3天都在救火
连接成功后,Power BI会列出所有表。我们只勾选7张核心表,然后点击“转换数据”进入Power Query编辑器。清洗不是走形式,而是关键防线:
orders表清洗:
- 删除
test_order开头的测试订单(Text.StartsWith([order_id], "test_")); - 将
status字段标准化为"paid"、"shipped"、"completed"三态,其他状态(如"cancelled")直接过滤掉; - 对
created_at字段,用DateTime.LocalNow()对比,标记“未来时间”的异常记录(数据库时区配置错误导致)。
- 删除
order_items表清洗:
- 添加列:
IsRefund = if [status]="refunded" then 1 else 0; - 筛选:
IsRefund=0,彻底隔离退款数据; - 更改数据类型:
actual_amount设为“十进制数”,避免整数除法丢失精度。
- 添加列:
products表清洗:
- 拆分
category_path:用“按分隔符拆分列”功能,以>为分隔符,生成cat1,cat2,cat3三列; - 处理空值:
cat1为空的行,用"未知类目"填充,避免后续关联失败。
- 拆分
每一步清洗操作,Power Query都会生成M代码。我们把这些代码复制保存,形成《数据清洗手册》,新同事入职时直接导入即可复现,杜绝“上次谁改的我不知道”这种协作灾难。
4.3 可视化构建:四个核心看板模块的搭建逻辑
模块1:实时作战室(首页)
- KPI卡片:用“卡片”视觉对象,显示
[Total GMV],[Order Count],[Avg Order Value],设置背景色为深蓝,字体加粗; - 实时曲线图:X轴为
Time(用HOUR(NOW()) & ":" & MINUTE(NOW())生成动态时间),Y轴为[GMV Last Hour],类型选“折线图”,开启“实时刷新”; - 异常预警:用“KPI”视觉对象,设置目标值为
[Avg Refund Rate] * 1.5,实际值为[Refund Rate Today],红色预警。
模块2:品类作战地图(左侧导航)
- 树状图:X轴为
products[cat1],Y轴为[GMV],大小为[Order Count],点击可下钻到cat2; - TOP10商品列表:用“表格”视觉对象,排序依据
[GMV],添加条件格式——GMV最高的前三行标蓝,最低的三行标灰; - 库存健康度:用“分解树”,根节点为
products[cat1],子节点为products[product_id],值为[Stock Days],颜色由[Stock Days]数值映射(<7天红,7-30天黄,>30天绿)。
模块3:用户作战沙盘(右侧导航)
- RFM热力图:用“矩阵”视觉对象,行=
RFM_Segment(用DAX分类:IF([Recency]<=30 && [Frequency]>=5 && [Monetary]>=2000, "高价值", ...)),列=[Month],值=[User Count]; - 新客来源漏斗:用“漏斗图”,步骤为“曝光→点击→加购→下单”,数据源来自
marketing_campaigns表(需提前在MySQL里建好); - 沉默用户召回:用“卡片+按钮”,显示
[Silent Users Count],按钮链接到“召回策略”详细页。
模块4:异常探测中心(底部横幅)
- 用“分解树”展示“退款率突增TOP5类目”,根节点为
products[cat1],值为[Refund Rate Change](DAX:[Refund Rate Today] - [Refund Rate Last Week]); - 点击类目,自动跳转到该类目下的“异常商品清单”,用“表格”显示
product_name,[Refund Rate],[Sales Volume],并加一列[Action](DAX:SWITCH(TRUE(), [Refund Rate]>0.15, "下架审核", [Refund Rate]>0.1, "客服回访", "持续观察"))。
所有视觉对象的标题,我们都写成业务语言:“今日实时成交额”而非“Measure 1”,“高价值用户占比”而非“RFM Segment %”。因为最终使用者是运营经理,不是数据工程师。
4.4 发布与权限:让看板真正用起来的最后一步
发布到Power BI Service不是终点,而是开始:
- 工作区设置:创建专用工作区“电商作战室”,邀请销售总监、运营主管、数据负责人加入,角色设为“成员”;
- 数据集权限:在工作区设置里,找到数据集→“管理权限”→添加
pbi_reader账号,确保网关能正常连接; - 报表权限:对报表设置“组织范围”共享,但敏感页(如“用户明细”)设为“仅限特定人员”,输入HRBP邮箱;
- 移动端适配:在Power BI Service里打开报表→“文件”→“移动布局”,拖拽调整元素位置,确保iPhone SE屏幕也能看清KPI卡片。
最关键的一步:给每个业务方配一个“自助分析”快捷入口。我们在报表首页加了一个“自助分析”按钮,链接到Power BI的“Analyze in Excel”功能。运营同学点击后,Excel里自动加载当前筛选上下文的数据,他们可以用透视表自由切片,而不会破坏主看板。这解决了“我想看自己负责品类的细节,但又不想麻烦数据同事”的终极诉求。
5. 常见问题与排查技巧实录:那些深夜救火的真实记录
5.1 刷新失败:从“网关离线”到“MySQL锁表”的全链路排查
问题现象:Power BI Service提示“刷新失败:无法连接到数据源”,但MySQL服务正常。
排查路径:
- 先看网关状态:登录Power BI Admin Portal → “网关” → 查看网关状态是否为“正在运行”。曾有一次因Windows更新自动重启,网关服务没设开机自启,导致离线;
- 再查网关日志:在网关安装目录
C:\Program Files\On-premises data gateway\logs下,打开最新.log文件,搜索ERROR。发现一行Failed to execute query: Lock wait timeout exceeded; - 登录MySQL,执行
SHOW PROCESSLIST;,发现一个ALTER TABLE语句阻塞了所有SELECT; - 终止阻塞进程:
KILL 12345;(12345是阻塞进程ID); - 预防措施:在MySQL里设置
innodb_lock_wait_timeout=30(默认50秒),并约定DDL操作只在凌晨1点执行。
经验心得:网关日志是第一手线索,比Power BI报错信息详细10倍。我们把常用排查命令写成.bat脚本,双击就能一键输出网关状态+MySQL连接数+慢查询数量,新同事10分钟就能上手。
5.2 图表空白:不是数据没了,而是上下文断了
问题现象:某个切片器(如“促销活动”)选择后,所有图表变空白。
根因分析:
- 检查
promotions表与orders表的关系:发现orders[promotion_id]字段有大量NULL值,而promotions[promotion_id]是主键,Power BI默认关系是“活动表→订单表”,但NULL值导致关联断裂; - 解决方案:在Power Query里,对
orders[promotion_id]做替换:if [promotion_id] = null then "no_promotion" else [promotion_id],并在promotions表里补一行promotion_id="no_promotion"的记录。
避坑口诀:“有NULL,必处理;关系线,看方向;切片器,查源头”。每次新增维度表,我们必做三件事:检查NULL比例、确认关系方向、用“数据视图”验证关联后行数是否合理。
5.3 DAX性能瓶颈:当“计算列”变成拖慢元凶
问题现象:报表加载超过30秒,CPU占用率100%。
性能分析:
- 在Power BI Desktop里,打开“视图”→“性能分析器”,刷新报表,查看各视觉对象耗时;
- 发现一个“用户地域分布”地图耗时22秒;
- 检查其数据源,发现用了计算列
UserProvince = LOOKUPVALUE(users[province], users[user_id], orders[user_id]),而orders表有500万行,LOOKUPVALUE对每一行都执行一次查找;
优化方案: - 改用
RELATED函数:UserProvince = RELATED(users[province]),前提是已建立orders[user_id] → users[user_id]的有效关系; - 或者,在Power Query里直接合并
users表,用“合并查询”功能,比DAX计算列快10倍。
实测对比:优化前22秒,优化后1.3秒。记住:计算列是静态的,适合维度属性;度量值是动态的,适合聚合计算;能用Power Query解决的,绝不用DAX。
5.4 权限失控:当“只读”账号突然能删数据
问题现象:审计发现,pbi_reader账号执行了DELETE FROM orders语句。
真相还原:
- 不是账号权限被篡改,而是有人在Power BI Desktop里,用“高级编辑器”直接写了
Sql.Database("server", "db", [Query="DELETE FROM orders"]); - Power BI Desktop连接MySQL时,默认允许执行任意SQL,包括DML;
加固方案: - 在MySQL端,撤销
pbi_reader的DELETE、UPDATE、INSERT权限; - 在Power BI Desktop里,禁用高级编辑器:文件→选项→安全性→取消勾选“允许在Power Query编辑器中运行本机数据库查询”;
- 最后,在网关配置里,勾选“仅允许SELECT查询”。
安全铁律:数据库权限最小化 + Power BI功能限制 + 网关策略兜底,三层防护缺一不可。我们每月用脚本自动扫描MySQL账号权限,发现异常立即告警。
6. 后续演进:从看板到决策引擎的自然生长
这个“从0到1”的看板上线三个月后,我们没停在“能看”的层面,而是让它真正“能用”。现在它已进化为销售决策的神经中枢:
- 自动化归因:当GMV环比下跌超5%,系统自动触发邮件,附带归因报告——“下跌主因是华东区安卓端新客转化率下降12%,建议检查APP闪退率”;
- 预测式预警:集成Prophet算法,对TOP100 SKU做7日销量预测,当预测值低于安全库存时,自动在看板弹窗提醒采购;
- AB测试看板:新增“营销活动对比”模块,支持上传不同活动的曝光、点击、转化数据,一键生成统计显著性报告(p-value < 0.05标绿)。
这些升级,都不是推倒重来,而是在原有框架上叠加。比如预测功能,我们没换技术栈,只是在MySQL里加了一张forecast_results表,Power BI定期读取;AB测试模块,复用原有的marketing_campaigns表结构,只新增test_group字段。好的看板设计,应该像乐高——基础模块稳固,新功能可以插拔式扩展,而不是每次升级都要重建地基。
最后分享一个小技巧:我们给每个DAX度量值加了注释。在Power BI Desktop里,右键度量值→“属性”→“描述”,写上业务含义:“[GMV YoY]:计算当前年份与上年同口径GMV增长率,用于月度经营分析会议”。这样,半年后新来的同事看到这个度量值,不用翻文档,一眼就知道它为什么存在、该怎么用。技术终会过时,但清晰的业务意图,永远是最可靠的传承。