三个月重写公司后台的AI提示词和经验分享

注:可能有点标题党了( 开发新系统的时候,公司要求业务需求优先级高于新系统。 所以新系统虽然开发了一年多,但实际有效开发时间很少。 上五休二全力开发,预估仅需三个月。 前言 在昨天我终于完成了公司后台的完全重写,就差测试完成上线部署替换。 这是我人生中最勇敢的一次决定,我终于完成它了! 具体的过程就不写了,很长而且也很

文章 · Angular · 2026/03/13

注:可能有点标题党了(

开发新系统的时候,公司要求业务需求优先级高于新系统。

所以新系统虽然开发了一年多,但实际有效开发时间很少。

上五休二全力开发,预估仅需三个月。

前言

在昨天我终于完成了公司后台的完全重写,就差测试完成上线部署替换。

这是我人生中最勇敢的一次决定,我终于完成它了!

具体的过程就不写了,很长而且也很枯燥,所谓的困难、坎坷都将融入我的大脑,成为我技术中的重要组成部分。

在开发后半段,我对于AI的掌握和使用也愈发精进,在开发期间节省了许多的工作量,所以本文会简单介绍一下系统的重写概况,并分享AI的使用经验(尤其是提示词)

重写概述

被重写的系统情况

技术栈:Angular11+Angular-Material+FuseAnimation+DevUI+NG-ZORRO+若干功能库(例如ngx-markdown、Quill.js)

被重写原因:

1.老板找不到商业闭源组件库FuseAnimation的购买凭证了,FuseAnimation库完全依赖于Angular的版本,导致项目所有框架、库都无法升级。

2.刚进入公司的再花技术理解有限,只会实现业务,而不考虑代码复用性、底层架构优化逻辑,导致屎山堆积

3.因为框架版本限制,塞了各种各样组件库,只为业务服务,但项目性能越来越差

重写后的系统

技术栈:最新版Angular+NG-ZORRO+若干功能库

重写优势:

1.使用单种更符合公司业务逻辑的组件库,样式交互逻辑更优。

2.完善底层逻辑,提升代码复用性,例如公共弹窗(老系统为了某个单独业务创建的弹窗组件估计有20+个)

3.框架可以随时跟着最新版本更新,性能更强、漏洞更少。

4.还有很多……就不进一步描述了

AI提示词

为什么要使用AI

在重写工作方面,因为新系统的底层逻辑和公共组件搭建非常完善。

大部分功能逻辑相似的页面(例如就一个筛选项+表格+分页器),编写的难度极低。

而AI最适合做这类难度偏低信息准确重复枯燥的代码处理

举一些例子:

在老系统中,关于时间段的单个筛选项代码如下:

<mat-form-field appearance="outline" class="purchase_search_long pr-8" fxFlex="33.3">
    <mat-label>下单日期</mat-label>
    <mat-date-range-input [rangePicker]="picker">
        <input matStartDate formControlName="orders_date_purchased_st" placeholder="Start date">
        <input matEndDate formControlName="orders_date_purchased_et" placeholder="End date">
    </mat-date-range-input>
    <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
    <mat-date-range-picker #picker></mat-date-range-picker>
</mat-form-field>

而在我编写的新系统中,单个筛选项代码则是:

<mic-picker formControlName="orders_date_purchased" label="下单日期" [nzAllowClear]="false"></mic-picker>

代码精简了许多并且也非常好理解。

以上是组件的调用方式,再举一个因为Angular框架升级导致的写法差异:

在Angular的html中实现if的方式,在17版本之前是通过*ngIf实现的

<span *ngIf="selectedColor?.palette">{{selectedColor.palette}}</span>

而在新版本的Angular中,则是使用@if实现的

@if(selectedColor?.palette){
<span>{{selectedColor.palette}}</span>
}

告诉AI这些差异,让AI帮忙生成重写后的效果,比自己写要快很多很多(某些页面的筛选项可能高达三十多个)

AI选择

我目前没有为AI付过一分钱,因为20刀一个月的订阅对我来说太过昂贵。

我绝大部分情况下都是使用ChatGPT

但GPT无法发送太多的代码,这种情况下我会选择Claude

在开发和想象力方面(开发新功能、新样式等创造性工作)我会选择Gemini Pro

非开发情况下(例如搜索一些百科知识)会使用DeepSeek,因为DeepSeek的数据源污染很严重,Angular相关的知识竟然还停留在Angular.js阶段(Angular1版本前),完全无法使用

如何向AI提问并获取想要的结果

重写主要分为三种情况:列表详情测试

先说前两种。

因为我们公司的后台系统,绝大部分都是筛选项+表格数据的设计,部分带有操作按钮,进行数据处理跳转详情页面实现复杂功能,所以我专门编写了两套提示词来分别处理列表详情两种页面。

在开发方面,AI对我来说最大的影响就是幻觉

AI总会在信息不确定、未知、有模糊信息的情况下给出完全错误甚至离谱的结果,在代码方面更是如此。

所以我在编写AI提示词的时候,会尽可能的告诉AI,我具体是什么情况我想做什么我想要什么结果,尽可能覆盖所有细节。

就以列表为例,我们开始着手编写提示词:

首先我们需要让AI知道自己的定位,我想让他帮我开发Angular项目相关的东西,所以他应当是一位Angular开发专家。

因为我的代码可能存在隐患,我也可能存在问题,所以AI不应当完全100%按照我给的信息和想法行事(当然你也可以让它这么做),所以提示词的第一段话就是:

现在你是一位会反复检查的Anagular开发专家,你持怀疑态度,而且你会做研究。我并不总是对的,你也不是,但我们都力求准确。

这句话是我之前在小红书刷到的帖子而得的灵感,并非我完全原创,实际证明,加上这句话之后AI提供的答案确实会更准确

接下来我们需要告诉AI,我具体是什么情况我想做什么,越详细越好。

我现在有一个老系统的页面需要写在新系统里,我需要你根据我提供的新系统另一个页面和旧系统需要重构的代码。

但这里不仅仅是重写,即使我给了两段老系统和新系统的代码,我也无法保证AI可以完全按照我想要的细节进行编写,例如:

新老系统使用的调用接口方法是一样的,但是typescript的函数名不一样,大体布局需要按照老系统的设计来,但具体的细节需要按照新系统来……诸如此类繁杂不确定的细节,于是我会添加一句说明:

按照旧系统的逻辑、调用函数,参考新系统的样式、逻辑实现方法写一个新系统的页面,具体写法应当完全按照新系统编写,只是表格具体的字段、整体布局、调用的函数名要参考老系统的。

接下来就是我想要什么结果,是关于技术、代码方面的,这时候我会告诉AI技术方面的更多信息:

其中新系统使用的angular20+ng-zorro,旧系统使用的是angular11+ng-zorro+angular material

开始具体代码细节的说明,因为每个页面分为html+ts两部分,所以需要分开编写:

html部分
1.表头固定为nz-page-header,你只需要修改nzTitle部分,其他则保持一致。
2.数据筛选部分,样式完全按照新系统的代码编写,而具体的字段、下拉框则参考老系统。
……
ts部分
1.具体的字段声明方式请完全按照新系统编写
2.列表页面调用函数传参,如果是get,固定使用this.general.getQueryStringFromFormGroup(this.searchForm),如果是post固定使用this.general.postQueryStringFromFormGroup(this.searchForm),这是我提前写好的公共函数。
……

最后,AI不仅仅是自己生成就可以了,它需要再检查一遍,在这一部分我会把我更多的要求(以及未来更多缺失的要求)填写在这里:

完成的新页面代码需要能够满足以下所有的问题检查机制:
1.新页面是否完整移植了所需要展示的所有数据、字段、以及按钮?
2.从上至下,新页面的样式展示是否符合老页面的样式设计(组件使用优先以新页面为主)
……

加入补充条件,以及对方需要返回什么:

注意,你返回的代码中不需要有任何注释,你最终需要返回我完整的html和ts代码。
以下是完整的四段代码,按照顺序分别为:参考用新系统页面html,参考用新系统页面ts,老系统页面html,老系统页面ts。

有时候会遇到代码太多无法一次性发送的情况,所以加上备注:

如果你只收到了一个页面的两段代码,那是因为单次消息无法发送过多的代码,那我会先将老系统页面html,老系统页面ts发给你,然后你可以回复“接下来请发送新系统页面的html和新系统页面的ts”,我就会将剩下的两段代码发给你。

这样,一篇关于列表方面的AI提示词就写好了,并且可以随着后续的开发不断补足,有哪个点没对,就继续添加,直到AI能够完整的返回你需要的结果。

以下是列表的完整AI提示词,以供参考:

现在你是一位会反复检查的Anagular开发专家,你持怀疑态度,而且你会做研究。我并不总是对的,你也不是,但我们都力求准确。
我现在有一个老系统的页面需要写在新系统里,我需要你根据我提供的新系统另一个页面和旧系统需要重构的代码,按照旧系统的逻辑、调用函数,参考新系统的样式、逻辑实现方法写一个新系统的页面,具体写法应当完全按照新系统编写,只是表格具体的字段、整体布局、调用的函数名要参考老系统的。
其中新系统使用的angular20+ng-zorro,旧系统使用的是angular11+ng-zorro+angular material
具体可以参考以下规则:
html部分
1.表头固定为nz-page-header,你只需要修改nzTitle部分,其他则保持一致。
2.数据筛选部分,样式完全按照新系统的代码编写,而具体的字段、下拉框则参考老系统。
3.其中我提前写好的筛选组件,输入框使用mic-input,下拉框使用mic-select,日期范围选择为mic-picker,日期选择为mic-date
4.表格样式完全按照新系统,具体的表头、字段则参考老系统,每页固定展示30条数据。
5.除非有额外需求,否则分页器一律使用mic-page。
6.所有图片都应当使用nz-image,如果源代码没有设置宽度,则默认[width]="50"
7.所有的接口提示消息,都用这句代码实现:this.confSvc.handleTip(res['msg']);
8.不要使用任何*ngif,*ngfor,*ngswitch用法,如果有,转换为@if、@for、@switch
ts部分
1.具体的字段声明方式请完全按照新系统编写
2.列表页面调用函数传参,如果是get,固定使用this.general.getQueryStringFromFormGroup(this.searchForm),如果是post固定使用this.general.postQueryStringFromFormGroup(this.searchForm),这是我提前写好的公共函数。
3.其余功能函数实现,写法请严格按照新系统,但具体调用函数、传参等功能逻辑参考老系统。
完成的新页面代码需要能够满足以下所有的问题检查机制:
1.新页面是否完整移植了所需要展示的所有数据、字段、以及按钮?
2.从上至下,新页面的样式展示是否符合老页面的样式设计(组件使用优先以新页面为主)
3.新页面是否使用了正确的组件,例如input框、input数字、日期选择、下拉框。
4.新页面是否完整移植了所有的@if逻辑?例如按钮的显示、组件的disabled,各个元素的显示隐藏逻辑
5.新页面是否完整移植了所有的交互逻辑?例如ngmodelchange
6.新页面调用的函数名(通常是 某个service服务中的某个函数名)是否相同(或含义相同)
注意,你返回的代码中不需要有任何注释,你最终需要返回我完整的html和ts代码。
以下是完整的四段代码,按照顺序分别为:参考用新系统页面html,参考用新系统页面ts,老系统页面html,老系统页面ts。
如果你只收到了一个页面的两段代码,那是因为单次消息无法发送过多的代码,那我会先将老系统页面html,老系统页面ts发给你,然后你可以回复“接下来请发送新系统页面的html和新系统页面的ts”,我就会将剩下的两段代码发给你。

详情方面其实和列表差不多,只不过具体写法、样式不同,就不再一步步分解,直接给出全文:

现在你是一位会反复检查的Anagular开发专家,你持怀疑态度,而且你会做研究。我并不总是对的,你也不是,但我们都力求准确。
我现在有一个老系统的页面需要写在新系统里,我需要你根据我提供的新系统另一个页面和旧系统需要重构的代码,按照旧系统的逻辑、调用函数,参考新系统的样式、逻辑实现方法写一个新系统的页面,具体写法应当完全按照新系统编写,只是表格具体的字段、整体布局、调用的函数名要参考老系统的。
其中新系统使用的angular20+ng-zorro,旧系统使用的是angular11+ng-zorro+angular material
具体可以参考以下规则:
html部分
1.表头固定为nz-page-header,你只需要修改nzTitle部分,其他则保持一致。
2.关于本页面的信息部分,使用nz-descriptions进行展示,列数固定为4,nz-descriptions外面还有一层<nz-spin [nzSpinning]="loading">
3.所有的只读信息均使用例如{{ Data.status_cn}},所有有输入信息需求的部分,使用ng-zorro的组件,例如nz-input,nz-select等等
4.如果有表格,表格样式完全按照新系统,具体的表头、字段则参考老系统。
5.不要使用任何*ngif,*ngfor,*ngswitch用法,如果有,转换为@if、@for、@switch
ts部分
1.具体的字段声明方式请完全按照新系统编写
2.存放详情各类字段和数据一定使用Data,并且Data的声明一定是最简单的Data: any = {};。
3.其余功能函数实现,写法请严格按照新系统,但具体调用函数、传参等功能逻辑参考老系统。
4.如果有值得优化的地方,请在确保不会影响功能的情况下可以对代码进行一定优化和简洁
完成的新页面代码需要能够满足以下所有的问题检查机制:
1.新页面是否完整移植了所需要展示的所有数据、字段、以及按钮?
2.从上至下,新页面的样式展示是否符合老页面的样式设计(组件使用优先以新页面为主)
3.新页面是否使用了正确的组件,例如input框、input数字、日期选择、下拉框。
4.新页面是否完整移植了所有的@if逻辑?例如按钮的显示、组件的disabled,各个元素的显示隐藏逻辑
5.新页面是否完整移植了所有的交互逻辑?例如ngmodelchange
6.新页面调用的函数名(通常是 某个service服务中的某个函数名)是否相同(或含义相同)
注意,你返回的代码中不需要有任何注释,你最终需要返回我完整的html和ts代码。
以下是完整的四段代码,按照顺序分别为:参考用新系统页面html,参考用新系统页面ts,老系统页面html,老系统页面ts。
如果你只收到了一个页面的两段代码,那是因为单次消息无法发送过多的代码,那我会先将参考新系统页面的html代码和ts代码发给你,然后你可以回复“接下来请发送老系统页面的html和ts”,我就会将剩下的两段代码发给你。

测试的提示词会更简单,像上面两段提示词一样,告诉对方需要检查的部分(你额外注意的)。

但你无法保证你所列出的点可以覆盖可能出现的BUG,所以你还需要让AI自己检查。

7.另外我没有提到的部分,老页面有但新页面缺失了,你也需要告诉我。

AI在告诉你问题的时候,可能会给出你解决方案,这就会导致AI回复的信息过多,有些错误就不会告诉你,所以它应该只告诉我问题,我自己来判断哪些问题需要修改(有些可能并不是问题,只是AI觉得是问题)

你需要反复并完善的检查两个页面,并列出新页面缺失、错误、遗漏的所有点,但你不需要告诉我如何修改,只需要告诉我具体有哪些即可,我会在下一段对话中选择你提出来的某些点,那个时候你再告诉我选择的点如何修改。

前面我说过,AI是有幻觉的,两篇非常完美的代码,它依旧能强行指出你的问题,所以你需要补充一句,没有问题就是没有问题:

如果真的没有遗漏,那你就告诉我移植的很完美,不需要做修改。同样你也不需要告诉我哪些是已经做对的部分,我只想知道需要修改和完善的部分,如果没有,那就没有。

PS:后来我发现AI会对我的重写进行评分、评价之类的,莫名其妙并且毫无意义,所以我在最后又添加了一句:

最后你不需要对我的行为做出任何评价和评分,只需要提供我所需要的。

AI重写过程分享

提示词写完了,总该需要一些具体的实战记录吧?

所以我分享了最后和AI的一次聊天,用于写完系统剩下的最后几个页面所创建的。

你可以在聊天中看到,我用很完善的提示词第一次发送代码之后,后面甚至都不需要再次发送提示词,发送代码就可以生成我需要的代码,如果有问题我补充即可。

注:代码没有隐私泄露的风险,可放心观看,地址:Angular页面迁移

尾声

AI刚出现的时候我是非常惶恐的,但后续我发现作为一个普通的不能再普通的小卡拉米,时代的洪流中挣扎是毫无意义的行为,学习并拥抱最新的技术才是正确的。

不过总算也是一个人独立完成了一个大型项目从0到1的过程,还是很开心的,而且不说骄傲是不可能的,我真行!

后续除了在公司给自己找事儿做,会分更多精力在博客和AI工具(例如CodeX和Cursor)研究上,我已经在计划编写花墨3.0了。