ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AI写代码关键在提示词:从零搭建订单管理系统的实战复盘

AI写代码关键在提示词:从零搭建订单管理系统的实战复盘 先聊点实际的。作为一个常年折腾开发、又天天跟AI打交道的人我越来越确信一件事情AI确实能写代码但真正拉开差距的是你给它的那份开工指令值不值钱。上个月我用纯AI辅助的方式从零做起了一个订单管理系统前后端、数据库、部署脚本一套全通。这篇先写第一篇我是怎么用一份提示词让AI老老实实从零开工的。很多人以为让AI写代码就是丢一句帮我做个订单系统然后坐等奇迹。我可以负责任地说这么干的人基本都翻车了——不是生成一堆跑不起来的半成品就是代码逻辑混乱到没法维护。我这次思路完全不同把AI当成一个能力很强但完全不懂业务的新人工程师你要做的不是命令它而是给它一份足够清晰的《开工说明书》。这篇文章不扯虚的我把整份提示词的结构、写每段时的真实想法、以及AI拿到提示词后给出的第一版反馈全部摆出来。想用AI正经做项目的人无论你是后端、前端还是全栈这份经验都能直接复用。1. 为什么我选订单管理系统当AI开发的试金石先说项目选型。很多人一上来就让AI写电商网站、写社交App野心很大但基本都会在半路卡死。我这次特意选订单管理系统是有讲究的。订单管理系统是典型的麻雀虽小、五脏俱全业务系统。它包含用户登录、商品管理、订单流转、库存扣减、状态机切换、数据统计这些模块复杂度刚好卡在AI能hold住、又能体现工程价值的区间。再简单一点的TODO应用根本看不出AI的编排能力再复杂到秒杀系统AI的上下文窗口和推理能力又撑不住。我对这一版的核心诉求有三个真能用不是demo水平的假数据糊弄而是能录入真实商品、创建真实订单、库存真实变化。能看懂代码结构要清晰注释要到位因为我后续还要在上面做二次开发和功能迭代。能部署生成的东西不是只能在本地跑着玩而是能扔到服务器上长期稳定运行。这三个诉求直接影响了我后面写提示词的措辞和粒度。如果只想要个学习demo提示词完全可以写得随意得多但既然目标是系统那每一句话都得往工程标准上靠。在开始写提示词之前我花了一个晚上把订单管理系统的业务链路全部梳理清楚。从商品上架、用户下单、支付回调、库存扣减、订单状态流转到售后处理每一个环节会出现什么异常、需要什么数据支撑全部列成了清单。这一步很关键因为你的业务理得越清楚AI生成的代码就越贴近真实场景。2. 动手前先想明白AI开发的优势边界到底在哪在分享提示词内容之前我必须先说清楚一个底层认知。这不是鸡汤而是决定你后面能不能用好AI的关键。我这次实践下来对AI辅助开发的定位就一句话AI负责宽度人负责深度和判断。什么意思AI特别擅长的事情是把已经成熟的技术方案快速铺开。比如你需要一个用户登录模块AI能在30秒内给你生成一套带JWT鉴权、密码加密、会话管理的完整实现这在以前自己手写至少得大半天。它见过足够多类似的代码模式知道标准做法长什么样。但AI不擅长的事情也很明显它不理解你的业务场景。比如订单超时未支付自动取消这个需求AI能写定时任务但它不会主动问你取消订单后库存要不要回补用户有没有收到通知取消操作要不要记录操作日志——这些业务细节它想不周全需要你提前在提示词里定好规矩。所以我的方法论是把AI当成一个代码生成效率放大器而不是业务架构师。业务架构、模块划分、关键流程设计这些深度判断必须由人来完成至少在现阶段是这样。另外不要指望一次对话就能生成一个完美系统。AI开发更像铺水管第一遍铺通主干道第二遍查漏补缺第三遍处理边缘情况。这个过程需要你和AI进行多轮对话每一轮都要给出明确、具体的反馈。这个认知直接决定了提示词的写法我不是让AI自由发挥而是给了它一套完整的约束框架。这里有个使用成本的问题也顺便说一下。AI生成的代码不是零维护成本你需要花时间Review、测试、修补。但相比从零手写整体效率大概能提升3到5倍。如果项目时间紧、需求又相对标准化这个投入产出比相当可观。3. 那一份让AI开工的提示词逐段拆解现在进入正题。下面是我实际使用的提示词主体内容我按逻辑拆成了六个部分每部分后面附上我当时的思考过程。你可以直接复制改写但强烈建议先看完我的注释再动手。角色设定你是一名拥有10年经验的全栈工程师擅长使用Vue 3 Flask MySQL构建中小型业务管理系统。请遵循以下所有要求逐步完成订单管理系统的开发。第一句话就把AI的人设定死。为什么强调10年经验的全栈工程师因为AI在不同人设下生成的代码质量差别很大——给它一个资深工程师的身份它会倾向使用更规范的设计模式代码风格也更工程化。指定技术栈同样重要。如果你不说AI可能会给你整出一套你完全没接触过的框架组合到时候连依赖都装不明白。我用的是Vue 3 Flask MySQL这套组合成熟稳定、前后端边界清晰、部署成本低非常适合中小型业务系统。项目目标构建一个完整的订单管理系统包含以下模块用户认证支持注册、登录、JWT token鉴权商品管理支持商品的增删改查、上下架、库存管理订单管理支持用户创建订单、订单状态流转待支付→已支付→已发货→已完成/已取消、订单查询数据看板展示今日订单数、今日销售额、总商品数等核心指标。这里就是要让AI清楚地知道你要盖一栋什么样的房子。模块划分我在写提示词前就定好了不是AI自己发挥的。明确的功能清单 核心状态定义是防止AI跑偏的第一道保险。关于订单状态流转我特意连待支付→已支付→已发货→已完成/已取消这个箭头都写清楚了。如果不写AI可能会自己发明一套状态机到时候跟前端下拉框都对不上。反正我踩过这个坑写清楚能省掉后续大量沟通成本。数据模型要求数据库包含以下核心表请设计合理的字段和索引users用户表id, username, password_hash, role, created_atproducts商品表id, name, description, price, stock, status, created_atorders订单表id, order_no, user_id, total_amount, status, address, created_atorder_items订单明细表id, order_id, product_id, quantity, price请为orders表的order_no字段建立唯一索引为orders表的status字段建立普通索引。数据模型是很多AI生成项目的重灾区。如果你不指定表结构AI会按它自己的想法建表很可能字段缺失、类型不对、或者关联关系混乱。所以我直接把我需要的核心字段全部列出来让AI照着建。关于索引我特意点名要为order_no建唯一索引、为status建普通索引。这是因为order_no要保证唯一性而status会经常作为查询条件。这些优化点AI不一定会主动想到但你在提示词里提一句它就能做得很好。技术实现约束后端使用Flask SQLAlchemy ORM数据库使用MySQLORM模型必须与上述表结构一一对应后端API统一返回格式{code: 0, data: ..., msg: success}使用蓝图Blueprint来组织路由文件每个模块一个蓝图前端使用Vue 3 Vite Element Plus页面包括登录页、商品管理页、订单管理页、数据看板页前端请求统一封装axios实例携带token并进行错误拦截。这一部分我称之为护栏条款。这些约束不是凭空想出来的而是基于我一个核心判断如果代码结构是乱的后续任何迭代都是灾难。用Blueprint组织路由、用统一返回格式封装API、用axios拦截器统一处理token和错误——这些都是行业标准做法AI完全有能力做到只是需要你点一下。如果你不写这些约束AI生成的代码大概率是所有路由堆在一个文件里或者前端每个页面单独写一套axios请求跑是能跑但维护起来会想哭。功能实现顺序请按以下顺序逐步实现第一步搭建项目结构和数据库初始化脚本第二步实现后端用户认证模块第三步实现商品管理模块第四步实现订单创建和状态流转模块第五步实现前端页面第六步联调测试。这个功能实现顺序是我觉得整份提示词里最值钱的一段。大多数人的做法是让AI一口气全生成结果前后端是出来了但根本对不上接口调不通。让AI逐步实现的核心逻辑是每完成一步我都可以检查、验证、反馈发现问题及时纠正不会把错误累积到最后一并爆发。这就像盖房子地基打完先验收再砌墙而不是一口气盖完再发现地基歪了。实际执行中我确实在第三步发现了问题才及时调整这个后文会详细展开。输出格式要求每实现一个步骤请输出本次实现的文件清单和目录结构关键代码块不能省略运行/启动方式说明测试建议。最后这段是为了让产出物可验收。如果AI只丢给你一堆文件名你还得自己去翻代码效率就低了。要求它输出关键代码块和测试建议等于让AI给自己写的代码做了个简版文档Review起来会顺畅很多。这六段合在一起基本就是一份完整的开工提示词。下面说说AI拿到这份提示词后实际交出的第一版答案长什么样。4. AI开工后的第一轮反馈代码结构复盘AI拿到提示词后按照我设定的顺序一步步实现。这里分享一下它给出的第一版项目结构和后端核心代码方便你直观感受提示词约束得越细产出越规整这件事。第一版目录结构大概是order-system/ ├── backend/ │ ├── app.py # Flask应用入口 │ ├── models.py # SQLAlchemy ORM模型 │ ├── blueprints/ │ │ ├── auth.py # 认证蓝图 │ │ ├── products.py # 商品蓝图 │ │ └── orders.py # 订单蓝图 │ ├── utils.py # 通用工具函数 │ └── requirements.txt ├── frontend/ │ ├── src/ │ │ ├── api/ │ │ │ └── request.js # axios封装 │ │ ├── views/ │ │ │ ├── Login.vue │ │ │ ├── Products.vue │ │ │ ├── Orders.vue │ │ │ └── Dashboard.vue │ │ ├── router/ │ │ └── App.vue │ └── package.json └── README.md看到这个结构的时候我是比较满意的——它严格遵守了Blueprint组织路由、前后端分离、统一目录规范这些约束。没有出现所有Python代码堆在一个文件里这种自走棋写法。再贴一段它生成的后端订单创建核心代码bp.route(/api/orders, methods[POST]) jwt_required() def create_order(): 创建订单 current_user_id get_jwt_identity() data request.get_json() items data.get(items, []) # [{product_id: 1, quantity: 2}, ...] if not items: return jsonify({code: 1, msg: 订单商品列表不能为空, data: None}), 400 total_amount 0 order_items [] # 校验库存并计算总价此处为第一版实现库存扣减未加锁 for item in items: product Product.query.get(item[product_id]) if not product or product.status ! 1: return jsonify({code: 1, msg: f商品不存在或已下架, data: None}), 404 if product.stock item[quantity]: return jsonify({code: 1, msg: f商品【{product.name}】库存不足, data: None}), 400 product.stock - item[quantity] # 直接扣减库存 total_amount product.price * item[quantity] order_items.append({ product_id: product.id, quantity: item[quantity], price: product.price }) # 生成订单号 order_no datetime.now().strftime(%Y%m%d%H%M%S) str(random.randint(1000, 9999)) order Order( order_noorder_no, user_idcurrent_user_id, total_amounttotal_amount, statuspending, addressdata.get(address, ) ) db.session.add(order) db.session.flush() for item in order_items: db.session.add(OrderItem( order_idorder.id, product_iditem[product_id], quantityitem[quantity], priceitem[price] )) db.session.commit() return jsonify({code: 0, msg: 订单创建成功, data: {order_no: order_no}}), 201说实话第一版代码已经达到了可运行、可联调的水平。ES6语法规范、RESTful风格、统一返回格式都做到了。油气业务上能跑通。但这版代码谈不上完美在库存扣减这个环节存在明显的并发风险——多个用户同时下单时直接读库存再扣减会导致超卖。这其实印证了我前面说的观点AI能在短时间内给出70分的代码剩下30分需要人来补。你要做的不是指望AI一步到位而是在它给的基座上继续打磨。这种AI先写、人再改的工作方式绝对比从零手写高效得多。这也正是提示词工程的实际价值——不是一次生成完美系统而是用合理的约束让AI产出的代码足够接近可用状态。5. 项目推进中我做的三个关键决策顺着上面提到的代码问题这轮开发里我做了三个比较关键的决策值得展开说。每个决策背后都是一次踩坑或预判。5.1 库存扣减加行锁第一次Review代码时我就盯着product.stock - item[quantity]这行看了好久。单用户使用没问题一旦有并发超卖几乎是必然的。解决方式也不复杂把查询改成加锁查询即可product Product.query.filter_by(iditem[product_id]).with_for_update().first()这一行with_for_update()就是在数据库层面给商品行加了排他锁确保同一时间只有一个事务能扣减库存。AI没主动写这个是因为它默认你在学习环境运行不会考虑并发场景。但你做的是真实的订单系统并发问题躲不过去。5.2 生成全局唯一订单号订单号那段代码用时间戳加随机数的方式生成在单机低并发下没毛病但存在两个隐患时间精确到秒时重复概率上升随机数范围只有1000到9999同一秒内超过9000个订单就会碰撞。更好的方案是使用UUID或者雪花算法。我最后选择了保留时间戳格式但把随机数换成了UUID片段order_no datetime.now().strftime(%Y%m%d%H%M%S) - uuid.uuid4().hex[:8].upper()这里还要提一个细节订单号不应该只是唯一最好还能承载信息。我的方案里前缀时间戳让订单号可按时间排序后缀UUID保证全局唯一。这是从运维角度的加分项。5.3 主动给AI限制不要做什么在我后续与AI的多轮对话中我加了一条有意思的指令明确告诉它什么不能做。比如不要修改数据库连接配置不要改变订单状态机的定义不要新增未要求的外部依赖。这比单纯告诉它做什么更能控制风险。为什么因为AI有时会自作主张地优化你已有的代码比如把Flask的JWT库换掉、给表加个没必要的字段、引入一个你不熟悉的新库。这些顺手优化在项目管理中就是灾难。给AI划定禁区本质上就是在给它的自由度上锁。这条经验在多人协作时同样适用——你交给实习生一个任务如果只说帮我把登录模块做一下他大概率会顺手重构你的路由结构。你需要在布置任务时把边界划清楚。6. 复盘这套提示词到底改进了什么做完这个项目我回过头来又看了一遍网上各种流传的万能AI写代码提示词发现大多有一个通病只告诉AI要做什么功能没告诉AI怎么组织代码、按什么顺序做、边界在哪里。这就像你给装修工人说给我装个厨房但不告诉他油管怎么走、插座留在哪、台面用什么材质——他确实能装出个厨房但用起来顺不顺手、后期好不好改全凭运气。我这套提示词的本质是把如何组织代码这件事从AI手里拿回来变成人的决策。具体改进体现在三个层面第一在模块划分层面提示词把四个核心模块的功能边界、数据流方向都固定了。AI可以在模块内部自由设计但模块之间的耦合关系由人定义。这对后续的功能迭代有决定性的影响。第二在代码风格层面统一返回格式、Blueprint路由组织、axios拦截器这些约束让AI生成的代码和我后续手写的代码风格保持高度一致。以后无论是人接手还是AI继续开发都不会有风格断裂的感觉。第三在风险控制层面通过不要做什么和分步实现、逐步验收两条指令把AI自作主张引发问题的概率大大降低。一旦AI跨过了边界你可以在每轮验收时及时发现、及时纠正。如果非要用一句话总结我的提示词心得那就是给AI的自由度应该像给新同事的自由度一样——明确目标给出清单划好边界一步一步验收。这不是什么高深的新理论但它在AI开发中的适用性极其精准。现在这一版订单系统已经跑在测试服务器上前后端联调通过库存扣减和订单状态流转都在真实场景下验证过了。下一篇文章打算写如何基于AI生成的第一版代码进一步做功能迭代和性能优化包括引入Redis缓存热点商品、订单超时自动取消的定时任务实现等内容到时候再把过程心得也一并整理出来。最后给个实操建议如果你也想用AI从零做一个自己的项目不一定要复制我的技术栈。但请一定复制角色设定 项目目标 数据约束 实现顺序 禁区边界 分步验收这套框架。把技术栈和需求换成你自己的你会回来感谢这篇文章的。
返回列表