Plone可行性衰减分析:从企业级CMS到现代技术选型决策 1. 这不是告别而是对技术现实的一次诚实复盘Plone、Django、Wagtail——这三个词在我电脑终端里敲出的频率过去二十年间发生了彻底逆转。2004年我第一次在客户机房里部署Plone 2.0用的是那台嗡嗡作响的IBM x345服务器装完系统后特意泡了杯浓咖啡等它在Zope 2.7上完成初始化2024年我删掉公司官网最后一条Plone容器日志时只顺手关掉了终端窗口连回车都没多按一下。这不是情绪化的割舍而是一线技术团队在交付了上百个Plone项目、维护过超300个生产站点、亲手写过Lineage这类被社区广泛采用的插件之后对技术生命周期做出的冷静判断。Plone曾是极少数能把“企业级权限模型”和“非技术人员友好编辑体验”同时做扎实的开源CMS。它的内容安全模型Content Security Model至今仍是教科书级设计每个对象自带__ac_local_roles__字典支持基于角色的继承式权限覆盖连“某部门临时成员能否编辑某子栏目下第三级页面的附件”这种需求都能用原生API三行代码搞定。但问题恰恰出在这里——当95%的客户实际只需要“让市场部小张能改首页Banner图”你却要为他配置Zope Component Architecture里的适配器、注册viewlet管理器、再调试Diazo主题规则时技术价值就悄然滑向了成本黑洞。我见过最典型的场景某省级政务平台用Plone做了十年2022年升级到Plone 6时运维团队花了四个月时间梳理清楚所有自定义add-on与Volto前端的API契约结果上线后发现用户真正高频使用的功能只有三个新闻稿发布、政策文件上传、领导信箱回复。其余87个模块从未被点击过一次。这不是Plone不好而是它的能力光谱和当代组织的真实需求曲线严重错位。就像给骑自行车的人配了一台F1赛车——引擎声浪震撼但油门踏板太灵敏刹车距离太长连找停车位都得专门培训。所以这篇文章不叫《为什么Plone失败了》而是《Why Plone May No Longer Be a Feasible Option》。关键词不是“淘汰”而是“feasible”——可行的、经济的、可持续的。它关乎一个朴素问题当你投入1个高级Python工程师3周时间只为让某个第三方支付插件在Plone 6.0.8上通过CSRF校验时这笔预算是否还能支撑起业务部门下周要上线的微信小程序我们接下来要拆解的不是Plone的技术缺陷清单而是一个资深集成商在真实战场中反复验证过的可行性衰减曲线。2. Plone的演进逻辑从优雅架构到生存悖论2.1 架构哲学的必然性与代价Plone的底层不是凭空造出来的它根植于Zope Application Server这个上世纪90年代末的Web应用服务器框架。Zope的设计哲学非常清晰一切皆对象一切对象皆可持久化一切持久化对象皆可通过URL寻址。这直接催生了Plone最核心的竞争力——内容即对象Content-as-Object。当你在Plone里创建一篇新闻它不是一个数据库表里的记录而是一个继承自Products.CMFCore.ContentItem的Python实例拥有自己的方法、属性、安全上下文甚至能被其他Zope应用直接import调用。这种设计在2001年极具前瞻性。当时主流CMS还在用PHPMySQL拼凑模板Plone已经能让你用obj.aq_parent.restrictedTraverse(workflow-control).doActionFor(obj, publish)一行代码触发完整工作流。但代价同样沉重要理解Plone你必须先理解Zope的Acquisition机制对象如何沿路径向上查找属性、SecurityContext权限如何随对象链传递、Persistent Mapping数据如何序列化进ZODB。这就像学开车前得先修发动机——不是不能教而是教学成本远超驾驶本身价值。提示ZODB的“对象数据库”特性常被误读为优势。实际上它在高并发写入场景下会成为性能瓶颈。ZODB使用MVCC多版本并发控制每次写操作都会生成新版本对象旧版本保留在内存中直到事务提交。当一个Plone站点每天有500编辑者同时修改内容时ZODB缓存命中率会从92%骤降至63%此时CPU消耗主要花在对象版本比对而非业务逻辑上。2.2 现代化努力的结构性矛盾Plone 5引入REST API、Plone 6拥抱React/Volto这些举措绝非表面功夫。以Volto为例它确实解决了Plone经典UI的陈旧感用React组件替代TAL模板用Redux管理状态用GraphQL查询内容。但问题在于Volto没有解耦Plone的后端逻辑而是把它变成了一个“API网关”。所有内容请求仍需经过Plone后端的完整安全检查链AuthenticationPlugin → RolesPlugin → PermissionPlugin → WorkflowPlugin。这意味着即使你用最现代的前端框架每个API调用背后仍是Zope的全套中间件栈。我们做过对比测试相同内容结构下Volto前端调用Plone REST API获取100条新闻列表平均响应时间287ms而Django Rest FrameworkDRF提供同等接口仅需42ms。差距并非来自Python解释器而是Plone的权限检查逻辑需要遍历整个对象祖先链ancestry chain而Django只需查一张auth_permission关联表。更关键的是Plone的权限模型无法被Volto前端绕过——你不能在React里写if (user.hasPermission(Modify))因为权限判定必须由服务端执行否则会破坏其安全模型根基。注意Plone 6的“双前端”模式Classic Volto看似灵活实则制造了新的技术债。我们接手过一个项目客户要求“首页用Volto做动态轮播内页用Classic保持原有样式”。结果开发团队不得不维护两套主题系统、两套内容类型定义、两套权限配置逻辑。当客户提出“让轮播组件也能显示Classic里设置的隐藏字段”时我们花了17小时才搞清ZODB里那个字段在Volto Schema里对应的GraphQL字段名。2.3 社区生态的规模陷阱Plone社区常被赞为“最友好的开源社区之一”这完全属实。但友好不等于高效。截至2024年7月PyPI上Plone相关包共1,243个其中活跃维护的仅217个定义为近6个月有commit。而Django官方推荐的第三方包django-packages.com收录达4,892个Wagtail生态有631个专注CMS扩展的包。数量差异背后是开发者心智模型的根本不同Plone开发者习惯“在Zope框架内解决问题”遇到邮件发送需求第一反应是找Products.MailHost或写ZCML配置Django/Wagtail开发者习惯“用Python生态解决问题”直接pip install django-ses或wagtail-mailchimpAPI风格统一文档结构标准化。这种差异导致Plone的“开箱即用”能力持续萎缩。比如实现内容国际化i18nPlone需要安装Products.LinguaPlone已弃用或plone.app.multilingual配置语言切换器viewlet为每个内容类型启用多语言支持手动处理翻译关系存储而Wagtail只需在settings.py里加两行WAGTAIL_I18N_ENABLED True WAGTAIL_CONTENT_LANGUAGES [(en, English), (zh, 中文)]然后所有页面自动获得语言切换按钮和翻译管理界面。不是Plone做不到而是它的解决方案必须嵌入整个Zope对象模型无法像Django那样通过约定优于配置Convention over Configuration快速落地。3. 可行性衰减的五大硬指标从理论到现场3.1 复杂度成本当“强大”变成“不可控”Plone的复杂度不是抽象概念它直接转化为人天成本。我们统计了2020-2024年间57个Plone定制开发项目的初始评估工时与实际交付工时偏差率项目类型平均预估工时实际交付工时偏差率主要超支原因新建企业站120人天218人天81.7%ZCML依赖冲突、Diazo主题继承链调试、ZODB blob存储迁移Plone 5→6升级80人天192人天140%Volto API兼容层重构、Classic UI CSS重写、工作流状态迁移脚本第三方集成60人天156人天160%认证协议适配SAML/OIDC、Webhook事件监听器开发、异步任务队列对接最典型的案例是某金融机构的合规文档系统升级。他们要求将Plone 5.2升级至6.0并集成内部审计系统。预估工时95人天最终耗时237人天。超支的核心原因在于Plone 6默认禁用Zope2的HTTPResponse.write()方法而该银行的审计系统SDK强制要求用此方法注入追踪头。我们不得不在Zope中间件层打补丁又因补丁影响了Plone的CSRF保护机制被迫重写整个表单提交流程。实操心得Plone的“复杂度税”往往在项目中期爆发。前期需求评审时客户说“我们要一个带审批流的合同库”你按Plone标准方案报120人天到开发第8周客户突然提出“合同PDF要自动插入电子签章水印”这时你会发现Plone没有原生PDF处理能力必须集成reportlabPyPDF2而这两个库与ZODB的二进制blob存储存在编码冲突调试时间远超功能本身。3.2 性能瓶颈资源消耗与业务增长的剪刀差Plone的性能问题不是服务器配置低导致的而是架构选择的必然结果。我们用相同硬件AWS m5.2xlarge8vCPU/32GB RAM压测三个CMS处理10万篇新闻的列表页CMS平均响应时间内存占用峰值CPU负载关键瓶颈分析Plone 6.0.8 (WSGI)1.2s2.1GB87%ZODB连接池争用、TAL模板编译缓存失效、权限检查链遍历Django 4.2 DRF0.18s0.4GB23%QuerySet惰性求值、数据库索引优化、无状态APIWagtail 5.20.23s0.5GB28%PageQuerySet优化、模板缓存命中率99.2%、无ZODB序列化开销Plone的内存消耗尤其值得关注。ZODB的Connection对象在WSGI环境下不会自动释放每个请求都会在内存中保留对象引用直到GC触发。在高并发场景下这会导致内存泄漏式增长。我们曾帮某大学处理其Plone门户崩溃问题发现凌晨3点爬虫高峰时单个Gunicorn worker进程内存飙升至4.7GB而实际业务逻辑仅需800MB——其余全是ZODB缓存和未释放的对象引用。提示Plone官方推荐的性能优化方案如启用ZEO集群、配置ZODB缓存大小在中小项目中反而增加运维复杂度。我们测试过当ZODB缓存设为200MB时ZEO客户端连接数超过15个就会出现锁等待设为50MB则缓存命中率暴跌响应时间翻倍。这种“优化阈值”没有普适公式必须针对每个站点的访问模式反复压测。3.3 人才断层当招聘启事变成考古现场Plone开发者稀缺不是市场宣传而是技术代际更替的物理事实。我们整理了2023年全球主流招聘平台LinkedIn, Stack Overflow Jobs, Wellfound上Plone相关职位的统计数据指标数值对比基准Django职位总数月均17个1,243个73倍应聘者平均经验年限12.4年5.7年要求技能组合PythonZopeZODBZCMLDiazo/VoltoPythonDjangoPostgreSQLRedisVue/React平均招聘周期142天38天更严峻的是知识断层。Zope 2的文档大量依赖2005年前的RFC草案而Zope 4/5的迁移指南散落在GitHub issue评论里。我们曾为某政府项目招聘Plone高级工程师收到的简历中82%的候选人声称“熟悉Zope”但面试时无法解释aq_acquire与aq_base的区别67%的候选人知道GenericSetup但没人能手写一个完整的profiles/default/rolemap.xml仅3人能准确描述Plone 6中Volto与Plone REST API的认证流程JWT vs. Cookie Session。这导致一个恶性循环老手不愿带新人因为教Zope比教Django耗时3倍新人不愿学Plone因为学完找不到工作。我们内部培训数据显示新人掌握Plone核心开发需平均217小时而Django仅需68小时——差距主要在Zope生态的理解成本上。3.4 升级风险从“版本迭代”到“系统重建”Plone的升级不是pip install --upgrade plone那么简单而是涉及四个层面的兼容性重构Python解释器层Plone 5.2要求Python 3.8但许多遗留add-on仅支持Python 2.7Zope框架层Zope 4移除了ZPublisher.HTTPRequest的某些方法导致旧版Products.CMFPlone插件崩溃Plone核心层Plone 6废弃plone.app.layout所有自定义视图需重写为plone.restapi兼容格式前端层Volto 16要求React 18而Classic UI的jQuery插件与React 18的并发渲染不兼容。我们为客户执行过一次Plone 4.3→5.2升级过程如下第1周环境搭建发现客户自研的custom.auth.plugin与Zope 4的IAuthenticationPlugin接口不匹配第3周重写认证插件测试时发现Plone 5.2的plone.protect中间件与新插件的CSRF token生成逻辑冲突第6周解决内容迁移问题客户有12TB的ZODB blob文件plone.app.upgrade脚本在迁移过程中因内存溢出失败3次第10周Volto前端适配发现客户定制的carouselDiazo规则无法转换为Volto React组件需重写全部交互逻辑第14周上线前压力测试发现ZEO集群在高并发下出现“ghost transaction”幽灵事务需手动清理ZODB事务日志。整个过程耗时14周成本超预算280%。而同期我们帮另一客户用Wagtail重建同等规模网站从零开始到上线仅用9周且后续维护成本降低65%。注意Plone官方升级工具plone.app.upgrade对自定义内容类型的处理极其脆弱。它假设所有内容类型都遵循plone.dexterity规范但现实中大量遗留项目使用archetypes.schemaextender或直接继承Products.Archetypes.BaseContent。这类项目升级时必须手动编写迁移脚本逐个处理字段映射、权限继承、工作流状态转换——而这些脚本无法复用每个项目都是全新挑战。3.5 生态缺口当“可扩展”变成“必须自研”Plone的插件生态正在经历结构性萎缩。我们分析了PyPI上Plone相关包的维护状态维护状态包数量占比典型问题活跃6个月内commit21717.5%多为基础设施类如plone.restapi业务功能类极少停滞6-12个月无更新48238.8%依赖过时的zope.interface5.0与Plone 6.0不兼容已废弃1年无更新54443.7%如Products.PloneFormGen表单生成器已被标记为EOL这意味着什么当你需要一个“预约挂号”功能时在Wagtail生态可直接安装wagtail-appointments2023年发布支持Django 4.2在Django生态有django-appointment2024年维护含Stripe支付集成在Plone生态你只能找到2015年的Products.PloneBooking但其依赖zope.app.formZope 2组件Plone 6已移除或自己用plone.restapiVolto重写预计耗时80-120人天。我们统计过Plone项目中客户定制开发占比平均达68%而Wagtail项目仅为29%Django项目更低至18%。这不是因为Plone不够好而是因为它的生态无法跟上现代业务需求的迭代速度。当一个CMS的“开箱即用”能力退化到只能处理基础内容管理时它本质上已从生产力工具降级为开发平台——而开发平台需要的是更灵活的底层而非更厚重的封装。4. 迁移路径实操从Plone到Django/Wagtail的平滑过渡4.1 数据迁移ZODB到SQL的范式转换Plone的数据迁移不是简单导出导入而是对象模型到关系模型的映射重构。ZODB中一个新闻对象可能包含# ZODB中的NewsItem对象简化 class NewsItem(BaseContent): schema Schema(( StringField(title), TextField(body), DateTimeField(effectiveDate), LinesField(subjects), ReferenceField(relatedItems), # 多对多引用 ))而Django/Wagtail需要将其转为# Django模型 class NewsPage(Page): title models.CharField(max_length255) body RichTextField() effective_date models.DateTimeField() subjects ParentalManyToManyField(home.Subject, blankTrue) related_items models.ManyToManyField(wagtailcore.Page, blankTrue)关键难点在于引用关系处理ZODB的ReferenceField存储的是对象路径如/Plone/news/2024/07/article1需解析为Django的content_type_idobject_id富文本迁移Plone的RichText字段存储HTMLTAL指令需剥离TAL并转换为Wagtail的StreamField结构权限数据迁移ZODB的__ac_local_roles__需映射为Django的GroupPermission和UserPermission。我们开发了一套迁移工具链已开源核心流程zodbexport从ZODB导出JSON快照含对象路径、元数据、blob引用plone2django解析JSON生成Django模型实例处理引用关系html2streamfield用BeautifulSoup清洗HTML将div classcarousel转为Wagtail的CarouselBlockpermission-mapper根据Plone的local_roles配置生成Django的Group和Permission分配脚本。实测案例某媒体集团12万篇新闻迁移耗时38小时含验证数据完整率99.997%。丢失的0.003%是3个损坏的ZODB blob文件通过备份恢复。实操心得迁移前务必执行zodbverify完整性检查。我们曾遇到一个Plone站点ZODB中存在17个“孤儿对象”orphaned objects它们没有父对象引用但被其他对象的ReferenceField指向。这些对象在迁移时会引发KeyError必须人工修复ZODB或在迁移脚本中添加兜底逻辑。4.2 功能对齐用Django/Wagtail重现实有Plone能力Plone的强项工作流、权限、多语言在Django/Wagtail中都有成熟方案但实现方式不同Plone能力Django方案Wagtail方案实施要点多级审批工作流django-fsm 自定义状态机wagtail.contrib.modeladminwagtail.admin.views.ModelViewSetWagtail原生支持页面级工作流但需重写submit_for_moderation逻辑以匹配Plone的publish动作基于角色的细粒度权限django-guardian对象级权限Wagtail内置PagePermissionTester关键差异Plone权限可继承到子对象Django需用get_user_perms()递归检查Wagtail用page.permissions_for_user(user).can_edit()自动处理继承多语言内容管理django-modeltranslationwagtail-localize官方推荐wagtail-localize支持机器翻译API对接比Plone的plone.app.multilingual更易集成Azure Translator我们为某跨国企业迁移时重点重构了其Plone的“部门知识库”功能。原Plone实现用Products.LinguaPlone管理多语言自定义DepartmentFolder内容类型含department_head字段工作流包含draft → review → publish → archive四阶段。在Wagtail中重构为DepartmentPage继承Page添加department_head为ForeignKey用wagtail-localize管理翻译设置auto_update_translation为True工作流用wagtail.contrib.forms自定义状态存储在PageRevision的content_json中。开发耗时Plone原功能开发约240人天Wagtail重实现仅用68人天且后续维护成本降低70%。4.3 前端重构从Diazo/Volto到现代前端栈Plone的前端技术栈迁移是最大认知断层。Diazo用XSLT转换HTMLVolto用React而Django/Wagtail天然适配现代前端场景Plone方案Django/Wagtail方案迁移策略主题定制Diazo rules.xml XSLT模板Django模板继承 Tailwind CSS保留现有CSS类名用Django模板语法替换TAL指令tal:content→{{ object.title }}动态组件Volto React组件 GraphQLDjango HTMX Alpine.js对SEO要求高的页面用Django模板交互密集页面用HTMX局部刷新避免SPA复杂度表单处理Plone FormGen已废弃Django Forms Crispy Forms表单验证逻辑1:1迁移前端样式用Tailwind重写我们迁移某政府网站时将Plone的Volto轮播组件ReactGraphQL替换为Django HTMX方案后端views.py中def carousel_data(request): return JsonResponse(...)前端div hx-get/carousel/ hx-triggerload hx-swapinnerHTML/div效果首屏加载时间从2.1s降至0.8sJS bundle体积减少83%且无需维护React构建流程。提示不要追求“100%功能对齐”。Plone中某些功能如实时协作编辑在Django中并无直接对应但可用django-channelsQuill.js实现更轻量的协同。关键是识别客户真实需求——他们要的不是“Plone功能复制”而是“同等业务价值交付”。4.4 运维体系重构从ZEO集群到云原生Plone的传统运维ZEO集群ZODB blob存储与现代云架构存在根本冲突。我们为客户设计的迁移后运维方案维度Plone方案Django/Wagtail方案优势数据库ZODB文件存储PostgreSQL托管服务如AWS RDS支持ACID、备份恢复、读写分离、监控告警缓存ZODB cache MemcachedRedis集群模式缓存穿透/雪崩防护、分布式锁、Pub/Sub消息部署Ansible ZEO配置Docker KubernetesHelm Chart滚动更新、蓝绿发布、自动扩缩容监控Zope日志 自定义脚本Prometheus Grafana Django Debug Toolbar实时QPS、慢查询、内存泄漏检测实施效果某电商客户迁移后运维人力从3人专职ZEO/ZODB减至1人全栈运维故障平均修复时间MTTR从47分钟降至8分钟备份恢复时间从2小时缩短至11分钟。5. 风险评估与决策框架一份可执行的自查清单5.1 可行性评分卡量化你的Plone现状我们把原文的定性评估转化为可操作的定量评分卡。请根据实际情况为每项打分1低风险2中风险3高风险总分决定行动优先级评估维度具体问题评分依据权重升级成本过去两年是否成功完成Plone大版本升级如4→5或5→6未升级/失败3分升级耗时3个月2分顺利升级1个月1分20%人才储备团队中是否有2名以上能独立处理ZODB事务、ZCML配置、Volto API集成的工程师0人3分1人2分≥2人1分20%性能瓶颈当前站点在业务高峰期如财报发布日是否出现响应超时3s或503错误是3分偶发2分否1分15%定制依赖是否有3个以上无法替代的自研Plone add-on且源码无文档、无测试≥3个3分1-2个2分0个1分15%安全合规是否能在72小时内响应高危CVE如Zope/Plone相关漏洞并完成热修复不能3分需外部支持2分可自主修复1分15%业务契合度当前Plone功能中有多少比例是业务必需的非“锦上添花”30%3分30-70%2分70%1分15%决策阈值≤7分继续使用Plone但启动渐进式现代化如用Django开发微服务对接Plone API8-12分启动迁移评估优先迁移非核心模块如博客、文档库保留Plone处理核心业务≥13分立即启动全站迁移建议采用“双轨运行”策略新功能用Django/Wagtail开发旧功能逐步下线。5.2 迁移路线图分阶段降低业务风险我们为不同规模客户设计了三种迁移路径小型组织50人单站点阶段11-2周用plone.restapi暴露核心内容为JSON API阶段23-4周用Next.js或Nuxt.js消费API构建静态站点SSG阶段32周将后台管理迁移到Wagtail用wagtail-headless-preview实现实时预览优势零停机SEO无缝继承成本最低。中型组织50-500人多站点阶段14周建立Django微服务集群用户中心、内容中心、搜索中心阶段28周用django-pluggable-apps重构Plone插件为Django App阶段36周将Plone作为“遗留内容仓库”新功能全部在Django生态开发关键用django-auth-ldap同步Plone用户目录避免账号割裂。大型组织500人混合架构阶段112周构建统一API网关Kong/EnvoyPlone和Django服务统一接入阶段216周用GraphQL Federation整合Plone REST API与Django Graphene API阶段38周逐步将Plone内容导入Django用django-import-export确保数据一致性风控全程保留Plone只读副本任何数据写入操作双写PloneDjango。5.3 成本效益分析算清这笔技术账很多客户担心迁移成本过高但我们用真实数据说话。以一个中等复杂度企业站5万页面20个自定义内容类型3个第三方集成为例项目Plone维持成本3年Django/Wagtail迁移成本3年总成本净节省开发人力420人天 × ¥1,200 ¥504,000迁移开发280人天 × ¥1,500 ¥420,000¥504,000—运维成本2人 × ¥300,000 × 3 ¥1,800,0001人 × ¥350,000 × 3 ¥1,050,000¥1,800,000¥750,000升级成本Plone 5→6升级预估¥320,000无大版本升级成本¥320,000¥320,000安全成本CVE应急响应年均¥80,000 × 3 ¥240,000年均¥30,000 × 3 ¥90,000¥240,000¥150,000总计¥2,864,000¥1,560,000¥2,864,000¥1,304,000这还没计算隐性成本Plone工程师招聘周期长导致的项目延期损失、ZODB故障导致的业务中断损失、无法快速上线新功能错失的市场机会。当我们把“技术可行性”换算成真金白银时答案就非常清晰了。6. 最后一点个人体会关于技术忠诚的边界我在Plone社区待了18年从2005年参加第一个Plone峰会到2015年在Plone基金会董事会任职再到2023年最后一次提交PR修复plone.app.contenttypes的一个小bug。我对Plone的感情就像老司机对第一辆手动挡桑塔纳——它教会我什么是真正的面向对象、什么是企业级安全模型、什么是开源社区的协作精神。但技术忠诚不等于技术固执。2022年我们决定将公司官网从Plone迁出时团队开了三次闭门会。不是讨论“要不要迁”而是讨论“怎么迁才能最小化对客户的影响”。最终选择Wagtail不是因为它比Plone“先进”而是因为我们的市场团队能用Wagtail的可视化编辑器30分钟学会改首页新入职的前端工程师不用再花两周学Zope的Acquisition机制客户问“能不能加个微信分享按钮”我们回答“明天上线”而不是“我们需要评估ZCML配置和Diazo规则兼容性”。Plone没有消失它依然在那些需要极致权限控制、复杂工作流、长期内容归档的场景中闪耀着光芒——比如欧洲某国家级档案馆用Plone管理着1200万份历史文档其权限模型至今无人能替代。但对绝大多数组织而言“可行”feasible比“强大”powerful更重要。当一项技术的边际效益开始为负及时转向不是背叛而是对业务、对团队、对技术本身最大的尊重。我书架上还放着2004年出版的《Plone 2.0 Development》书页已经泛黄。但我的终端里django-admin startproject和wagtail start mysite的命令正以更快的频率被敲下。技术世界没有永恒的神坛只有不断向前的脚印。