文章背景图

Trae AI 助力 Halo 主题开发-终端主题开发「卒」

2026-01-18
164
-
- 分钟
|

想试点新玩意,让他集成pjax NProgress(进度条)和配置 Pjax 转场动画 以及懒加载

让ai自己集成

ai创建一个项目规则

手动移动到.trae/rules 目录下面

开始开发

我输入了一个 设计极客终端风格的web主题 然后通过trae一键优化提示词,并引用刚才的项目规则

提示词
设计一个极客风格的终端样式Web主题,要求具有以下技术特性和视觉元素:

1. 视觉风格:
- 采用经典的黑底绿字终端配色方案(#00FF00文字/#000000背景
- 模拟CRT显示器的扫描线效果和轻微的光晕
- 包含闪烁的光标动画效果
- 使用等宽字体(如Courier New或Fira Code)

2. 交互元素:
- 所有UI组件(按钮/输入框等)都设计成终端命令行样式
- 实现命令行输入时的打字机效果
- 添加终端启动时的ASCII艺术欢迎界面
- 包含模拟命令行提示符(如"user@host:~$ ")

3. 功能要求:
- 完全响应式设计,适配各种屏幕尺寸
- 支持暗黑/明亮模式切换(通过终端命令实现)
- 实现终端特有的滚动回显效果
- 添加合理的终端音效(如键盘敲击声)

4. 技术实现:
- 使用CSS变量实现主题定制
- 采用Web Animation API实现动画效果
- 确保WCAG 2.1 AA无障碍标准合规
- 提供完整的主题文档和使用说明

5. 测试要求:
- 在主流浏览器(Chrome/Firefox/Safari/Edge)最新版本测试
- 验证移动端触控操作的可用性
- 性能测试确保动画流畅(60fps)

随便找了一个终端图放上

首页演示图

一次成功无报错。。。,

继续开发

使用ai开发最简单的方式就是报错就是将:错误日志复制给ai,让ai自己去分析,自己去定位错误位置,halo开发一般就三个地方有错误日志,后续开发中会增加不同日志展示,与如何使用ai修复的方式

  • 编辑器 终端日志

    • vite相关才会使用到这个地方

  • 浏览器控制台 调试日志

    • 一般是前端代码写错会提示,遇到错误200或500就要看docker日志

  • docker 后端日志

编辑器终端日志:

修复-直接发给ai

新增键盘上下选择,模拟真实终端

部分ai 可以大白话直接使用,但并不是每一个ai ide都是这样的,我们来尝试一下 trae solo~

前端报错

main.iife.js?v=1.0.0:5 Uncaught SyntaxError: Unexpected token '{'
at new AsyncFunction (<anonymous>)
at main.iife.js?v=1.0.0:5:734
at Si (main.iife.js?v=1.0.0:5:958)
at Ei (main.iife.js?v=1.0.0:5:1003)
at hr (main.iife.js?v=1.0.0:5:325)
at C (main.iife.js?v=1.0.0:5:176)
at bn (main.iife.js?v=1.0.0:5:34223)
at r (main.iife.js?v=1.0.0:5:3067)
at n (main.iife.js?v=1.0.0:5:3097)
at Ti (main.iife.js?v=1.0.0:5:3107)
(匿名) @ main.iife.js?v=1.0.0:5
Si @ main.iife.js?v=1.0.0:5
Ei @ main.iife.js?v=1.0.0:5
hr @ main.iife.js?v=1.0.0:5
C @ main.iife.js?v=1.0.0:5
bn @ main.iife.js?v=1.0.0:5
r @ main.iife.js?v=1.0.0:5
n @ main.iife.js?v=1.0.0:5
Ti @ main.iife.js?v=1.0.0:5
M @ main.iife.js?v=1.0.0:5
(匿名) @ main.iife.js?v=1.0.0:5
Ni @ main.iife.js?v=1.0.0:5
(匿名) @ main.iife.js?v=1.0.0:5
(匿名) @ main.iife.js?v=1.0.0:5

这个报错是th标签和alpineJS 内联出现的问题,修了一次报错500,查看后端日志

尝试直接复制log后修复失败

发送大白话再次尝试

修复成功

体验功能,出现新的问题

修复键盘选中时,文字不高亮

直接将遇到的问题,截图+你遇到的问题,(有一点,你可以说大白话,但千万不要说的很笼统,就最简单的直接的描述问题即可)

成功,看看演示~

仔细想想,我们还缺少什么功能?

ai并不能给你完善所有的事情,你得有一部分的想法,比如,我想要什么,我想干什么,我缺少什么

先来看看首页

  1. skyblog 标题 后端自定义

  2. 前端权限样式位置 做一个登录对应的文章作者的账号 显示可以编辑,其他的为只读,不登录为只读的一个ui样式

  3. 页脚增加一下国内需要的备案参数

  4. 部分文字颜色太暗的地方+亮一点,更符合整体设计

  5. 上一页下一页也集成到键盘可选项并增加确认键可点击

  6. 登录后显示的首页上面的 账号名称要根据登录账号显示,不登录显示guest,并且旁边做一个login的登录按钮,点击可以跳转登录,登录后则显示对应的登录账号用户名,根据账号是否是管理员,显示管理员 admin,不是管理员暂时使用guest

  7. 当前只打算接入文章相关,其他插件不接入,所以只保留post即可,也可以做分类和标签,类似于文件夹,打开后显示对应分类或标签下的文章

当然你觉得你的话术描述的不够直观,可以让ai给你优化一下,但ai有时候会抽风,记得自己做核对

这里为直接使用大白话,看看ai能完成么

错误500

如何修复?

打开docker log,我这里使用的是orbstack,跟docker无异,轻量的,找到报错,复制给ai

2026-01-19T10:13:14.455+08:00 ERROR 7 --- [dedElastic-6189] a.w.r.e.AbstractErrorWebExceptionHandler : [9446c5b6-3672]  500 Server Error for HTTP GET "/page/3"

org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: "" (template: "modules/layout" - line 16, col 111)
	at org.thymeleaf.standard.expression.StandardExpressionParser.parseExpression(StandardExpressionParser.java:131) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
	Suppressed: The stacktrace has been enhanced by Reactor, refer to additional information below: 
Error has been observed at the following site(s):
	*__checkpoint ⇢ Handler run.halo.app.theme.router.factories.IndexRouteFactory$$Lambda/0x00000000b4019348@9bbf399f [DispatcherHandler]
	*__checkpoint ⇢ run.halo.app.security.InitializeRedirectionWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ SecurityWebFilterChainProxy [DefaultWebFilterChain]
	*__checkpoint ⇢ SwitchUserWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ AuthorizationWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ ExceptionTranslationWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ LogoutWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ ServerRequestCacheWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ SecurityWebFilterChainProxy [DefaultWebFilterChain]
	*__checkpoint ⇢ AnonymousAuthenticationWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ SecurityWebFilterChainProxy [DefaultWebFilterChain]
	*__checkpoint ⇢ run.halo.social.login.security.SocialAuthenticatorFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ run.halo.oauth.HaloOAuth2AuthenticationWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ SecurityWebFilterChainProxy [DefaultWebFilterChain]
	*__checkpoint ⇢ AuthenticationWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ AuthenticationWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ AuthenticationWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ MapOAuth2AuthenticationFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ AuthenticationWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ SecurityWebFilterChainProxy [DefaultWebFilterChain]
	*__checkpoint ⇢  [DefaultWebFilterChain]
	*__checkpoint ⇢ run.halo.social.login.security.SocialAuthorizationRequestRedirectWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ run.halo.oauth.HaloOAuth2RedirectWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ SecurityWebFilterChainProxy [DefaultWebFilterChain]
	*__checkpoint ⇢ CaptchaWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ DeviceSessionFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ ReactorContextWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ CsrfWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ CorsWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ HttpHeaderWriterWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ SecurityWebFilterChainProxy [DefaultWebFilterChain]
	*__checkpoint ⇢ ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain]
	*__checkpoint ⇢ run.halo.seo.tools.AdvancedRedirectWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ run.halo.moments.rss.OldRssRouteRedirectionFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ run.halo.comment.widget.captcha.CommentCaptchaFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ run.halo.seo.tools.CrawlRecordFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ run.halo.app.infra.webfilter.AdditionalWebFilterChainProxy [DefaultWebFilterChain]
	*__checkpoint ⇢ org.springframework.web.filter.reactive.ServerWebExchangeContextFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ run.halo.app.infra.webfilter.LocaleChangeWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ org.springframework.web.filter.reactive.UrlHandlerFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ run.halo.app.theme.UserLocaleRequestAttributeWriteFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ HTTP GET "/page/3" [ExceptionHandlingWebHandler]
Original Stack Trace:
		at org.thymeleaf.standard.expression.StandardExpressionParser.parseExpression(StandardExpressionParser.java:131) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.standard.expression.StandardExpressionPreprocessor.preprocess(StandardExpressionPreprocessor.java:86) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.standard.expression.StandardExpressionParser.parseExpression(StandardExpressionParser.java:120) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.standard.expression.StandardExpressionParser.parseExpression(StandardExpressionParser.java:62) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.standard.expression.StandardExpressionParser.parseExpression(StandardExpressionParser.java:44) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.standard.processor.StandardUtextTagProcessor.doProcess(StandardUtextTagProcessor.java:71) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1314) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.engine.Model.process(Model.java:300) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.engine.OpenElementTagModelProcessable.process(OpenElementTagModelProcessable.java:110) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.engine.ProcessorTemplateHandler.queueProcessable(ProcessorTemplateHandler.java:2106) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1559) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.engine.TemplateModel.process(TemplateModel.java:155) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.engine.ThrottledTemplateProcessor.process(ThrottledTemplateProcessor.java:239) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.engine.ThrottledTemplateProcessor.process(ThrottledTemplateProcessor.java:204) ~[thymeleaf-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.spring6.SpringWebFluxTemplateEngine$StreamThrottledTemplateProcessor.process(SpringWebFluxTemplateEngine.java:739) ~[thymeleaf-spring6-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at org.thymeleaf.spring6.SpringWebFluxTemplateEngine.lambda$createChunkedStream$2(SpringWebFluxTemplateEngine.java:269) ~[thymeleaf-spring6-3.1.3.RELEASE.jar:3.1.3.RELEASE]
		at reactor.core.publisher.FluxGenerate$GenerateSubscription.slowPath(FluxGenerate.java:271) ~[reactor-core-3.7.14.jar:3.7.14]
		at reactor.core.publisher.FluxGenerate$GenerateSubscription.request(FluxGenerate.java:213) ~[reactor-core-3.7.14.jar:3.7.14]
		at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.request(FluxContextWrite.java:136) ~[reactor-core-3.7.14.jar:3.7.14]
		at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.request(FluxPeekFuseable.java:144) ~[reactor-core-3.7.14.jar:3.7.14]
		at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.requestUpstream(FluxSubscribeOn.java:131) ~[reactor-core-3.7.14.jar:3.7.14]
		at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onSubscribe(FluxSubscribeOn.java:124) ~[reactor-core-3.7.14.jar:3.7.14]
		at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onSubscribe(FluxPeekFuseable.java:178) ~[reactor-core-3.7.14.jar:3.7.14]
		at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onSubscribe(FluxContextWrite.java:101) ~[reactor-core-3.7.14.jar:3.7.14]
		at reactor.core.publisher.FluxGenerate.subscribe(FluxGenerate.java:85) ~[reactor-core-3.7.14.jar:3.7.14]
		at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:68) ~[reactor-core-3.7.14.jar:3.7.14]
		at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194) ~[reactor-core-3.7.14.jar:3.7.14]
		at reactor.core.scheduler.BoundedElasticThreadPerTaskScheduler$SchedulerTask.run(BoundedElasticThreadPerTaskScheduler.java:1013) ~[reactor-core-3.7.14.jar:3.7.14]
		at java.base/java.lang.VirtualThread.run(Unknown Source) ~[na:na]
2026-01-19T10:13:24.172+08:00  WARN 7 --- [mentReconciler2] r.h.a.c.a.r.AttachmentReconciler         : Failed to get thumbnails for attachment: alist-5noxza3t, consider upgrading storage plugins

还是报错,再次复制,再次发送

反复报错

反复出现报错,看来是trae没有第一选择先去搜索halo官方标签的使用方式,通过网络方式获取解决方式,而是频繁使用各种自己想象的错误标签导致的

根据它所需要的数据,我们可以查阅官方文档,寻找对应的数据,我刚才的条件需要的参数

分别是:首页 分类页 tag页

还有公共的api

如果你可以精准的知道自己的需求,对应使用的哪个文档那是最好了,当然,我主要测试的是怎么傻瓜式开发,我当前可能需要用到的几个文档如下。

https://docs.halo.run/developer-guide/theme/template-variables/index_

https://docs.halo.run/developer-guide/theme/template-variables/tag

https://docs.halo.run/developer-guide/theme/template-variables/categories

https://docs.halo.run/developer-guide/theme/template-variables/category

https://docs.halo.run/developer-guide/theme/finder-apis/category

https://docs.halo.run/developer-guide/theme/finder-apis/tag

https://docs.halo.run/developer-guide/theme/finder-apis/post

https://docs.halo.run/developer-guide/theme/finder-apis/contributor

https://docs.halo.run/developer-guide/theme/finder-apis/menu

https://docs.halo.run/developer-guide/theme/global-variables

我直接发送了文档地址给ai

还是报错,看来trae 对于这种有点后端相关,获取关键信息并不够无脑,但既然都能分辨出问题,会自己debug 会自己找错,那用ai的目的是什么?不就是偷懒?让ai自动干活么,这一点trae的体验感并不舒服好用~

trae它修不明白了

它真的修不明白了

上反重力修看看

还是得claude啊,唉,模型的差距。一次解决,trae差距还是输在模型上

评论交流
1

文章目录