让AI写出符合团队规范的代码,我靠一段System Prompt搞定
让AI写出符合团队规范的代码我靠一段System Prompt搞定一个PR的修改意见从15条降到2条代码风格从四个人的写法变成同一个人写的一、一个PR改了三次全是因为风格问题上个月组里来了个新项目四个前端各自负责一个模块都用AI辅助开发。结果Review的时候发现四个人的代码风格完全不统一A的代码用interfaceB用type。C的组件用script setupD的用export default。有人用const声明函数有人用function。引入Element Plus的写法能搞出三种版本。每次Review都要重复提同样的意见“这里改成interface”“这里用setup语法”“这里不要用default export”。一个PR来回改三次才能合并。后来想了个办法写一段System Prompt把团队的代码规范全塞进去所有AI生成代码之前先喂这段。一个月之后再看同一个项目的代码看起来像同一个人写的。PR的平均修改意见从15条降到了2条剩下的基本都是逻辑问题不再有风格问题。二、System Prompt长什么样这段Prompt我维护在团队仓库的.cursor/rules.md里每次让AI写代码之前先发这一段。你是一个Vue 3 TypeScript专家请严格遵循以下规范生成代码 ## 技术栈 - Vue 3Composition API script setup - TypeScript严格模式 - Element Plus按需导入 - Pinia状态管理 - Vite构建工具 ## 代码规范 - 组件名PascalCaseUserProfile.vue - 文件名kebab-caseuser-profile.vue - 变量/函数camelCase - 类型/接口PascalCase - 常量UPPER_SNAKE_CASE - 使用interface定义对象类型type用于联合类型和工具类型 - 函数优先使用箭头函数需要提升时用function ## Vue规范 - 必须使用script setup语法 - Props用definePropsT()带完整类型 - Emits用defineEmitsT()带完整类型 - 所有props标注required和默认值 - 组件样式使用scoped - v-for必须绑定key优先使用唯一id ## API调用规范 - 统一使用项目封装的request实例 - 所有请求包含loading状态 - 错误统一用ElMessage.error展示 - 接口地址以/开头的绝对路径 ## 约束条件 - 不要使用any类型 - 不要使用var - 不要使用console.log用项目封装的logger - 不要修改项目已有的全局配置 - 生成的组件必须能直接运行不需要额外配置这段规则根据项目情况持续迭代每个新成员加入时也直接发给他。AI知道该用什么、不该用什么生成出来的代码基本不用改风格。三、使用前的对话之前让AI写一个用户列表组件生成一个用户列表组件包含表格、搜索、分页AI给了这段template div el-input v-modelsearch placeholder搜索 inputhandleSearch / el-table :datauserList stylewidth: 100% el-table-column propname label姓名 / el-table-column propemail label邮箱 / el-table-column label操作 template slot-scopescope el-button clickeditUser(scope.row)编辑/el-button /template /el-table-column /el-table /div /template script export default { data() { return { search: , userList: [] } }, methods: { handleSearch() { // 搜索逻辑 }, editUser(user) { // 编辑逻辑 } } } /script问题一堆Options API项目用的是Composition APIslot-scope项目用的是#default写法没有TypeScript类型没有loading状态userList没有初始类型Review时提了8条修改意见改了两轮才过。四、使用后的对话先发送System Prompt再说需求[System Prompt 贴在这里] 生成一个用户列表组件包含表格、搜索、分页AI给了这段template div classuser-list div classsearch-bar el-input v-modelsearchKeyword placeholder搜索用户 clearable inputhandleSearch / el-button typeprimary clickfetchData查询/el-button /div el-table v-loadingloading :datatableData stripe sort-changehandleSortChange el-table-column propname label姓名 sortablecustom / el-table-column propemail label邮箱 / el-table-column proprole label角色 / el-table-column propstatus label状态 template #default{ row } el-tag :typerow.status active ? success : info {{ row.status }} /el-tag /template /el-table-column el-table-column label操作 width160 template #default{ row } el-button typetext clickhandleEdit(row)编辑/el-button el-button typetext clickhandleDelete(row)删除/el-button /template /el-table-column /el-table el-pagination v-model:current-pagecurrentPage v-model:page-sizepageSize :totaltotal :page-sizes[10, 20, 50] layouttotal, sizes, prev, pager, next size-changefetchData current-changefetchData / el-dialog v-modeldialogVisible title编辑用户 el-form :modeleditForm label-width80px el-form-item label姓名 el-input v-modeleditForm.name / /el-form-item el-form-item label邮箱 el-input v-modeleditForm.email / /el-form-item /el-form template #footer el-button clickdialogVisible false取消/el-button el-button typeprimary :loadingsubmitLoading clickhandleSubmit 保存 /el-button /template /el-dialog /div /template script setup langts import { ref, onMounted } from vue import { ElMessage, ElMessageBox } from element-plus import { getUserList, deleteUser, updateUser } from /api/user import type { User, UserQueryParams } from /types/user const loading ref(false) const submitLoading ref(false) const tableData refUser[]([]) const total ref(0) const currentPage ref(1) const pageSize ref(10) const searchKeyword ref() const sortField ref() const sortOrder refascending | descending(ascending) const dialogVisible ref(false) const editForm refPartialUser({}) const fetchData async () { loading.value true try { const params: UserQueryParams { page: currentPage.value, size: pageSize.value, keyword: searchKeyword.value, sortField: sortField.value, sortOrder: sortOrder.value } const res await getUserList(params) tableData.value res.data total.value res.total } catch (error) { ElMessage.error(加载失败请稍后重试) } finally { loading.value false } } const handleSearch () { currentPage.value 1 fetchData() } const handleSortChange ({ prop, order }: { prop: string; order: string | null }) { sortField.value prop sortOrder.value order ascending ? ascending : descending fetchData() } const handleEdit (row: User) { editForm.value { ...row } dialogVisible.value true } const handleDelete (row: User) { ElMessageBox.confirm(确认删除该用户吗, 提示, { confirmButtonText: 确认, cancelButtonText: 取消, type: warning }).then(async () { await deleteUser(row.id) ElMessage.success(删除成功) fetchData() }).catch(() {}) } const handleSubmit async () { submitLoading.value true try { await updateUser(editForm.value.id!, editForm.value) ElMessage.success(保存成功) dialogVisible.value false fetchData() } catch (error) { ElMessage.error(保存失败) } finally { submitLoading.value false } } onMounted(fetchData) /script style scoped .user-list { padding: 20px; } .search-bar { display: flex; gap: 12px; margin-bottom: 16px; } /styleReview时只提了2条修改意见都是业务逻辑问题风格方面的修改意见为0。合进去的时候一次过。五、System Prompt如何迭代的这个规则文件放在项目根目录的.cursor/rules.md里跟着代码一起维护。每次遇到风格问题或者团队规范调整就更新这个文件。第一次迭代发现命名不统一有人在用camelCase有人在用snake_case。更新规则文件加了变量/函数用camelCase这一条。第二次迭代发现TypeScript类型经常缺失AI经常忘记加类型或者直接用any。更新规则文件加了所有参数和返回值必须标注类型“禁止使用any”。第三次迭代发现接口地址写法不统一有人用相对路径/api/users有人在前面加了baseURL重复拼了两次。更新规则文件明确了接口地址统一用/api开头baseURL在request里已配置。第四次迭代发现Element Plus版本写法问题项目用的是按需导入AI生成时有时会写import { ElButton } from element-plus有时会写ElButton直接使用。更新规则文件加了Element Plus组件无需单独导入直接在模板中使用。每次迭代都把问题解决在源头。当AI生成的代码本身就符合规范时Review者的精力可以放在逻辑和设计上而不是格式和风格上。六、团队如何统一维护目前这个规则文件在团队里这样用每位开发者在IDE里配置.cursor项目里创建rules.mdCursor会自动识别并作为System Prompt的一部分。新人入职直接复制新同事加入时先把规则文件发给他让他的AI助手也按这套规范生成代码。迭代有记录规则文件的每次改动都走PR流程有讨论、有决策、有记录。不会出现某人私自加了一条规则但别人不知道的情况。定期同步每周团队周会上花5分钟过一下规则文件有没有需要更新的地方保持规范和实际需求同步。大家写代码都用同一套规范Review的效率自然就上去了。七、几个关键点第一System Prompt要放在项目仓库里跟着代码走不要放在个人笔记里不要放在微信群里。放在代码仓库里所有人拿到的版本是一致的。更新了规则全团队共享。第二规则要有可检查性代码风格要统一是废话。组件用PascalCase命名是可检查的。每一条规则都应该是看到代码能判断对不对的标准。第三规则要有优先级哪些是必须遵守的编译级别的哪些是建议遵守的风格层面的。System Prompt里只放必须遵守的建议级别的别往里塞不然Prompt太长AI反而不敏感了。第四定期清理过时规则技术栈升级了某些规则可能不再适用。定期Review一下规则文件把过时的删掉保持精简。第五规则文件本身也是代码像管理代码一样管理规则文件。有注释、有分类、有版本记录。别的团队参考的时候也能理解每一条规则为什么存在。

相关新闻

S905L3B 刷机指南:把 1GB 内存的 Armbian 机顶盒改造成微型服务器

S905L3B 刷机指南:把 1GB 内存的 Armbian 机顶盒改造成微型服务器

S905L3B 刷机指南:把 1GB 内存的 Armbian 机顶盒改造成微型服务器 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905…

2026/10/18 1:47:51 阅读更多 →
gitlab-ci-local:一条命令在本地跑通 GitLab CI,改完配置再也不用推送等结果

gitlab-ci-local:一条命令在本地跑通 GitLab CI,改完配置再也不用推送等结果

gitlab-ci-local:一条命令在本地跑通 GitLab CI,改完配置再也不用推送等结果 【免费下载链接】gitlab-ci-local Tired of pushing to test your .gitlab-ci.yml? 项目地址: https://gitcode.com/GitHub_Trending/gi/gitlab-ci-local 开场&#x…

2026/10/18 1:47:51 阅读更多 →
MySQL单表操作实战:从建表到增删改查的完整指南

MySQL单表操作实战:从建表到增删改查的完整指南

1. 为什么从单表开始:一张"小名著"人物表能解决所有入门问题1.1 单表操作是所有SQL语句的地基前阵子一位刚开始学数据库的朋友跟我诉苦:看教程看到联表查询就彻底懵了。我直接跟他说,你急什么,多表查询是后面的事&#…

2026/10/18 1:46:50 阅读更多 →

最新新闻

基于5777张图片的垃圾检测数据集实战:六大场景与模型训练指南

基于5777张图片的垃圾检测数据集实战:六大场景与模型训练指南

垃圾检测在计算机视觉里是个看着简单、做起来相当磨人的细分方向。说它简单,是因为目标就是“找出画面里的垃圾”;说它磨人,是因为垃圾这东西没有固定形状、没有统一颜色、尺度跨度极大——一个矿泉水瓶和一个建筑垃圾堆,在特征层…

2026/10/18 2:39:02 阅读更多 →
Unity 性能优化:减少透明物体带来的开销

Unity 性能优化:减少透明物体带来的开销

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 2:39:02 阅读更多 →
Unity Timeline检视面板完全指南:轨道、剪辑与混合技巧详解

Unity Timeline检视面板完全指南:轨道、剪辑与混合技巧详解

做Timeline内容这几年,如果让我选一个“最容易被新手忽略、却又最值得花时间研究”的地方,我一定选检视面板。前面几篇讲了Timeline怎么建、轨道怎么摆、素材怎么拖,很多同学以为会这些就够用了,可一旦开始调细节,比如…

2026/10/18 2:39:02 阅读更多 →
UE5 C++实现自动开关门:委托绑定与TimeLine驱动全解析

UE5 C++实现自动开关门:委托绑定与TimeLine驱动全解析

做UE项目时接了个开关门的功能,需求本身不复杂:玩家走到门口,门自动打开,离开后自动关闭。但就是这么一个“看起来不难”的功能,在C里却牵扯出两个容易卡壳的点——一个是TimeLine组件的驱动方式,另一个是盒…

2026/10/18 2:39:02 阅读更多 →
纯CSS打造黑胶唱片机:材质、动画与性能优化全攻略

纯CSS打造黑胶唱片机:材质、动画与性能优化全攻略

1. 为什么说CSS不是“改样式”的活,而是视觉魔法早些年我刚入行的时候,团队里流行一句话:“CSS不就是调调颜色、改改间距吗?”说这话的人,后来基本都在某个深夜被一段CSS动画折磨到怀疑人生。这个被无数人低估的语言&a…

2026/10/18 2:39:02 阅读更多 →
Deep Agents框架:AI代理核心任务规划与分解实战解析

Deep Agents框架:AI代理核心任务规划与分解实战解析

先聊个我最近遇到的典型场景。某次我给一个自己搭的Agent下达任务:“帮我整理本周行业资讯,输出一份简报”。结果它整整回复了八百字,格式工整、措辞得体,可仔细一看,全是通用建议——没有真正的资讯来源,没…

2026/10/18 2:38:02 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →