
引言綜述
效率提升一直是開發者的不懈追求。大語言模型被世人熟知以來,AI程式設計逐步進入人們的視野。從程式碼垂域模型到與IDE的工程應用結合,從GitHub Copilot到Cursor,AI對研發流程的滲透在不斷深入,對於開發者也從淺嘗輒止的新奇物變為了不可或缺的助手。Cursor就是在本次大模型浪潮中立於潮頭的“AI原生化”程式設計工具。
Cursor簡介
Cursor 是一款面向開發者的智慧程式碼編輯器。它基於強大的 VS Code,更深度集成了AI模型。開發者可以直接用自然語言讓它幫你編寫新程式碼、解釋複雜邏輯、重構現有程式碼、查詢 Bug。它理解專案上下文,像一個在 IDE 裡隨時待命的超級程式設計助手,旨在大幅提升開發效率和探索速度。
Cursor的能力與侷限
Cursor提供三種內建模式:Agent、Ask 和 Manual。Agent模式是預設模式,可以自主學習和探索程式碼庫,能夠進行跨檔案的大範圍修改和重構。Ask模式專注於程式碼理解和問題解答,不會對程式碼進行修改。Manual 模式是 Cursor 的精準編輯工具,只依賴使用者提供的具體指令和上下文,不會自動探索程式碼庫或執行命令。同時,Cursor已經支援自定義模式,允許我們為特定的工作流程建立更適合自己的模式。
上述這些模式反映了它與傳統Copilot等程式碼提示工具的核心超越之處,如:
-
產品形態更原生。獨立的程式碼編輯器而非外掛,編輯區即對話介面。透過自然語言可以實現幾乎所有需要的能力,如命令執行、編譯執行等。
-
開發能力更強大。可以主動學習程式碼庫,直接生成跨檔案的完整邏輯,並擁有主動重構能力。從而實現“模組級”任務開發,而非僅有行級或單檔案級。
-
參與週期更深度。不止在於程式碼開發階段,更深入到前期方案設計、後期測試CR等階段,都可以使用Cursor一站式解決或輔助解決。
但是,Cursor並不是“銀彈”。它也有很多並不“得心應手”的地方,如:
-
Cursor依賴於底層模型的能力,大模型本身當前無法解決的問題在它身上都會體現。比如不論是學習程式碼和文件的讀需求,還是單次產出程式碼的寫能力,都是有限的。如果超出“記憶能力”限制,會引發極大的不穩定。
-
當前Cursor對於跨應用的支援並不好,無法解決跨應用更勿論跨團隊分工的複雜需求。
-
Cursor在各個研發環節的支援能力不盡相同,且需要很多工程方面的限制來達到開發者的預期目標,杜絕天馬行空。
系列內容概述
綜上所述,一個“能力超強”但是“有稜有角”的工具,就更加考驗使用者的經驗和技巧。生產工具的升級必定引發生產流程的改進,以何種思路、方法、正規化,去最大化Cursor帶來的效率提升,並最小化其薄弱之處和引入風險,是當前在團隊中最需要思考的問題。
本系列將從一個普通開發者的視角及一個團隊推動者的視角,淺談如何將Cursor真正落地於業務需求開發。
-
本篇作為第一篇是筆者個人在複雜重構類需求中全流程使用Cursor的過程,總結單點經驗教訓。
-
第二篇是在團隊中推進Cursor覆蓋提效的正規化生成與落地經驗。
-
後續可能涉及Cursor及Agent本身的原理性探究,幫助大家更好地使用。
對於結合業務功能要求的重構類需求,由於歷史邏輯錯綜複雜、新功能迭代週期要求快速,一般很難高質量完成。本篇是筆者在明確業務需求後,結合當前團隊的技術重構目標,並結合Cursor的長項評估,決定以此需求作為第一個全程使用Cursor的試驗。最終效果非常好,在此分享使用路徑及“踩坑填坑”經驗。
需求背景
業務背景
1.整體業務背景:高德商家平臺經營成長業務,包含店鋪裝修相關功能。B端商家生產內容,如官方相簿、品牌故事、特色推薦等模組,作為店鋪裝修的一部分,提供給C端使用者消費。
2.本期需求背景:需要新增一個“找路指引”模組,商家在B端上傳圖文影片等模態的內容,指導C端使用者如何從附近地標到達店鋪,“打通最後100米”。
技術背景
1.歷史技術問題:
a.資料模型設計過於複雜,且由於命名不規範等導致理解成本過高。
b.由於資料模型複雜,介面的出入參特別複雜,且存在多級巢狀情況,造成理解維護困難。
c.內部呼叫鏈路過於複雜,存在很多handler分支邏輯,難以梳理呼叫鏈路。且應用內歷史模組和業務邏輯半數以上不再使用。
2.整體技術架構:
a.由於本文主要為了說明Cursor使用,具體店鋪裝修域的技術架構並非本文重點,不在此詳細介紹。讀者可以簡單理解為將裝修內容劃分為“內容元素”和“元素與店鋪的繫結關係”兩個領域實體,圍繞這兩個領域展開內容相關的增刪改、稽核、下游互動等一系列鏈路。
3.本期技術目標:
a.由於新增業務模組,故本次同時對歷史技術鏈路進行重構,後續逐步將歷史業務模組遷移。
b.重構目標包括:
i.簡化資料模型,降低理解和維護成本;
ii.最佳化介面設計,降低介面複雜度並解決多級巢狀問題;
iii.清晰呼叫鏈路,減少複雜的handler邏輯,提高程式碼可維護性;
實現過程
下面按照實際做需求的順序分享本次實現過程。篇幅限制,將挑選重點鏈路,體現與Cursor互動過程。本次實踐主要體現在方案設計階段和程式碼開發階段,整體流程摘要如下:

歷史邏輯梳理
由於是重構類需求,首先要將歷史業務邏輯全部梳理清楚,剔除廢棄的業務邏輯,重新規劃組織。沉澱領域能力,並實現清晰的業務編排。
整體應用框架梳理
目標是讓Cursor輔助梳理整體應用概況,實現對應用的全域性性掌握。但是本應用由於之前做過人工的梳理,故本步驟跳過。如果需要,也可以使用Rules對Cursor進行要求和指導。
具體介面流程梳理
重構涉及到的介面都要進行全流程業務邏輯Review,本文挑選較為複雜的“儲存元素並繫結關係”介面,進行歷史邏輯梳理展示。
由於是跨應用介面,介面入口及部分業務編排在A應用,底層業務能力在B應用。我嘗試過將兩個應用放在同一個Cursor工作空間中同時操作,最終Cursor會詳細給出A應用的業務流程,其中對B應用的呼叫僅用“B應用的處理流程”一句話帶過。即使後續與Cursor對話調整也無法做到預期的顆粒度。故對於多個應用需要分別梳理,然後讓Cursor進行拼接。
為了使Cursor的梳理顆粒度、關注點及輸出方式等能夠達到預期,我們使用Rules規範介面梳理過程:
歷史介面邏輯梳理Rules
---
description: 此規則為分析軟體介面提供全面指南,確保充分理解和文件化複雜介面的業務邏輯和技術實現。當開發人員需要理解現有介面、重構介面實現或建立技術文件時應用此規則。它幫助分析人員系統性地探索原始碼,從入口到資料庫操作全面跟蹤呼叫鏈,併產出足夠詳細的流程描述以支援直接開發和重構。該規則適用於微服務、分散式系統和複雜業務場景,特別適合需要深入理解介面工作原理而無需反覆查閱原始碼的情況。
globs:
alwaysApply: false
---
# 介面邏輯分析與文件生成規則
## 關鍵規則
- 分析介面時必須先透過原始碼搜尋工具明確定位入口點,從Controller或HSF入口處入手
- 必須完整追蹤呼叫鏈路,跟蹤從入口到持久層及外部系統呼叫的完整路徑
- 必須識別並解釋所有條件分支和判斷邏輯,包括每個分支的觸發條件
- 必須詳細分析介面中的資料校驗規則、轉換邏輯和持久化操作
- 必須識別並解釋併發控制機制,如分散式鎖、事務等的使用場景和作用範圍
- 必須分析所有業務規則實現,包括權益/許可權檢查和特殊業務場景處理
- 必須分析配置驅動的處理邏輯和動態載入的處理器鏈
- 必須分析非同步處理環節,包括訊息傳送、事件釋出和稽核流程
- 必須提供按執行順序的步驟式流程描述,每個步驟包含具體處理邏輯
- 必須使用mermaid語法建立詳細流程圖,展示主流程和所有重要分支
- 必須明確標識同步/非同步操作,及其觸發條件和處理路徑
- 必須描述資料模型和關鍵業務實體,包括主要屬性和業務含義
- 必須提供足夠的細節,使開發人員能直接基於分析結果進行開發,無需再次查閱原始碼
## 原始碼探索方法
1.**介面入口確定**
- 使用檔案搜尋和程式碼搜尋工具定位介面入口
- 優先識別Controller類中的目標方法,關注RequestMapping等註解
- 確認HTTP請求型別、路徑和接受的引數格式
- 如果沒有Controller中的目標方法,也可能是HSF呼叫,可以尋找相關的HsfService
2.**呼叫鏈路跟蹤**
- 從入口方法開始,逐層跟蹤方法呼叫關係
- 重點關注Service層的實現類和方法
- 注意分析AOP切面和攔截器對介面的影響
- 追蹤到最底層的資料庫操作和外部系統呼叫
3.**配置分析**
- 檢查application.yml/properties等配置檔案
- 特別關注與目標介面相關的配置項
- 分析基於配置的條件處理和動態載入邏輯
4.**元件與中介軟體識別**
- 識別介面涉及的所有服務和元件
- 確定使用的中介軟體型別和用途
- 分析元件之間的互動方式
## 輸出組織
1.**文字流程描述**
- 提供按執行順序的步驟式描述
- 每個步驟包含具體的處理邏輯和條件判斷
- 使用縮排表示邏輯層級關係
- 明確標識同步/非同步操作
2.**流程圖**
- 使用mermaid語法建立詳細流程圖
- 清晰劃分系統和元件邊界
- 整體使用一張圖
- 透過不同線型區分同步和非同步流程
3.**資料模型**
- 描述關鍵業務實體及其關係
- 列出主要屬性及其業務含義
- 說明表間的關聯關係
4.**關鍵程式碼分析**
- 重點解釋複雜演算法和資料處理邏輯
- 說明特定業務規則的實現方式
- 分析效能最佳化手段
## 示例
<example>
使用者: 請分析/api/orders/create介面的實現邏輯。
AI: 我將對/api/orders/create介面進行全面分析。首先我需要定位入口點並追蹤完整呼叫鏈路。
[使用程式碼搜尋工具定位入口點]
找到了入口點: OrderController.createOrder(@RequestBody OrderCreateRequest request)方法。
詳細分析流程:
# /api/orders/create介面完整實現分析
## 1. 入口處理 - OrderController.createOrder
- 接收OrderCreateRequest物件,包含userId, items[], paymentMethod等欄位
- 資料校驗: 檢查userId不為空,items不為空且至少有一項,paymentMethod在支援列表內
- 建立OrderContext物件,儲存請求引數和處理狀態
- 呼叫orderService.createOrder(OrderContext)處理業務邏輯
## 2. 業務處理 - OrderServiceImpl.createOrder
- 分散式鎖控制: 加鎖key=order:create:{userId},防止同一使用者併發下單
- 使用者校驗: 呼叫userService.validateUser(userId)驗證使用者狀態和許可權
- 商品處理:
- 遍歷items列表,呼叫productService.getProductDetails獲取最新價格和庫存
- 檢查庫存是否充足,不足則丟擲InsufficientStockException
- 計算訂單總價並與請求中價格比對,差異超過閾值丟擲PriceChangedException
- 優惠處理:
- 如存在優惠券,呼叫promotionService.applyPromotion計算折扣
- 根據使用者等級應用會員折扣
- 支付預處理:
- 建立支付單,呼叫paymentService.preparePayment
- 獲取支付連結或支付引數
- 訂單建立:
- 生成訂單號: 呼叫idGenerator.generateOrderId()
- 建立OrderEntity,設定狀態為CREATED
- 呼叫orderRepository.save(orderEntity)儲存訂單
- 建立OrderItemEntity列表並儲存
- 鎖定庫存:
- 呼叫inventoryService.lockStock(items)鎖定庫存
- 設定庫存鎖定過期時間為30分鐘
- 傳送訊息:
- 透過MQ傳送ORDER_CREATED事件
- 事件包含訂單基本資訊,不包含敏感支付資料
- 返回結果:
- 構建OrderCreateResponse,包含orderId和paymentInfo
- 解鎖分散式鎖
- 返回響應結果
## 3. 非同步處理流程
- 庫存鎖定超時處理:
- 定時任務每5分鐘檢查過期庫存鎖定
- 對超過30分鐘未支付的訂單,釋放庫存鎖定
- 更新訂單狀態為CANCELLED
- 訂單建立事件處理:
- 物流系統訂閱ORDER_CREATED事件準備配送資訊
- 資料分析系統訂閱事件更新銷售統計
- 使用者中心訂閱事件更新使用者行為畫像
## 資料操作詳情
- orders表:
- 插入新記錄: id, user_id, total_amount, status='CREATED', created_at, payment_method
- order_items表:
- 批次插入: order_id, product_id, quantity, unit_price, subtotal
- inventory_locks表:
- 批次插入: product_id, quantity, order_id, expire_at=now()+30min
## 異常處理
- 庫存不足: 返回HTTP 400,錯誤碼10001,提示具體缺貨商品
- 價格變動: 返回HTTP 409,錯誤碼10002,提示重新下單
- 使用者無效: 返回HTTP 403,錯誤碼10003
- 支付渠道異常: 返回HTTP 503,錯誤碼20001,觸發重試機制
- 資料庫異常: 回滾事務,返回HTTP 500,記錄詳細錯誤日誌
[這裡還有詳細的mermaid流程圖和資料模型分析...]
</example>
<exampletype="invalid">
使用者: 分析使用者登入介面
AI: 使用者登入介面的分析:
登入介面負責驗證使用者憑證並返回訪問令牌。入口是AuthController中的login方法,該方法:
1. 接收使用者名稱和密碼
2. 驗證使用者資訊
3. 建立JWT令牌
4. 返回給使用者
使用者提交憑證後,系統會查詢資料庫驗證身份,然後建立一個包含使用者ID和角色的令牌。
這個分析存在以下問題:
- 沒有完整跟蹤呼叫鏈路
- 沒有分析校驗規則和處理邏輯
- 沒有提供實際的方法名和引數
- 沒有說明使用了什麼元件和中介軟體
- 缺少具體的資料操作說明
- 沒有分析異常處理路徑
- 過於簡略,無法用於開發
- 沒有提供流程圖
</example>
分別在AB兩個應用使用該Rules進行梳理,然後給Cursor指明拼接位點,Cursor進行邏輯拼接彙總,成果如下:

流程重新編排
此過程必須人工實現,Cursor無法感知哪些功能是正在使用的,及業務應該以何種角度去梳理整合。與Cursor關聯較小,故細節不在本文章體現。
技術方案設計
前期準備
1.明確當前應用的開發規約,並形成Rules用於後續方案設計和程式碼開發。否則Cursor在開發時會胡亂建立包路徑和檔案,程式碼編寫也毫無章法,極大增加Review和修改的複雜度和成本。針對本應用生成的Rules如下,其中包含應用框架規範、檔案目錄規則、命名規則、程式碼風格規約等,及具體的示例:
---
description:
globs: **/*.java
alwaysApply: false
---
# mall-pink-dolphin 微服務專案結構規範
## 關鍵規則
-**所有程式碼必須按照模組化架構放置在正確的位置**,詳見下方模組職責說明
-**列舉和常量優先使用公共模組**:
- 公共列舉必須放在 `new-b-dolphin-common` 模組的 `com.amap.mp.dolphin.common.enums` 包下
- 公共常量必須放在 `new-b-dolphin-common` 模組的 `com.amap.mp.dolphin.common.constants` 包下
- 僅當列舉或常量是模組特定的,才可放在對應模組中
-**介面定義必須先於實現**,使用介面和實現分離的方式
-**嚴格遵循分層架構,禁止跨層呼叫**,必須透過合適的介面呼叫
-**資料物件(DO)必須放在正確的位置**,詳見下方DO規範說明
-**單元測試必須放在mall-pink-dolphin-start模組中**,確保測試環境的一致性
- 公用的方法,必須先寫interface再寫實現。每個interface有Base類實現,每個模組可以在Base類實現的基礎上進行自己的override方式
## 模組職責
### 1. new-b-dolphin-app (業務服務層)
- 路徑: `com.amap.mp.dolphin`
- 責任: 實現業務邏輯,業務編排,呼叫領域層
- 包含:
- `service`: 核心業務服務介面和實現類
- `dto`: 返回值傳輸物件,及資料結構轉換類
- `executor`: 入參傳輸物件,及資料結構轉換類
### 2. new-b-dolphin-client (客戶端層)
- 路徑: `com.amap.mp.dolphin`
- 責任: 定義對外暴露的介面和處理外部請求
- 包含:
- `consumer`: 訊息佇列消費者客戶端實現
- `controller`: Web控制器,處理HTTP請求
- `hsf`: HSF服務介面定義和實現
### 3. new-b-dolphin-domain (領域層)
- 路徑: `com.amap.mp.dolphin`
- 責任: 定義領域模型和領域邏輯
- 包含:
- `model`: 領域模型,封裝業務實體和規則
- `enums`: 領域特定的列舉型別
- `transfer`: 領域物件轉換器
- `domainservice`: 領域服務,封裝特定領域的業務邏輯
### 4. new-b-dolphin-infrastructure (基礎設施層)
- 路徑: `com.amap.mp.dolphin`
- 責任: 實現資料訪問、外部服務呼叫等基礎設施
- 包含:
- `mapper`: MyBatis資料庫對映介面
- `dataobject`: 資料物件(DO),用於資料庫訪問
- `gatewayimpl`: 閘道器介面實現,封裝外部服務呼叫
- `diamond`: Diamond配置中心相關實現
- `config`: 配置類
- `acl`: 防腐層,隔離外部系統變化
### 5. new-b-dolphin-common (公共層)
- 路徑: `com.amap.mp.dolphin.common`
- 責任: 提供通用工具類、常量、列舉等
- 包含:
- `utils`: 通用工具類
- `constants`: 公共常量(**優先在此定義常量**)
- `enums`: 公共列舉(**優先在此定義列舉**)
- `exception`: 異常類
## 資料物件(DO)規範
### DO物件存放位置
**關鍵規則**: 資料物件(DO)必須放在new-b-dolphin-infrastructure模組的dataobject包中,嚴格遵循以下位置規範:
1. **資料訪問物件**:
- 位置: `new-b-dolphin-infrastructure/src/main/java/com/amap/mp/dolphin/dataobject/`
- 命名規範: 使用業務實體名加DO字尾,如`OrderDO.java`
- 使用場景: 用於資料庫表對映的物件,通常與資料庫表結構一一對應
### DO物件編寫規範
1. **註解規範**:
- 必須使用` `或手動實現getter/setter方法
- 推薦使用` `、` `、` `等Lombok註解減少樣板程式碼
-MyBatis對映物件必須新增` ("表名")`註解
2. **屬性規範**:
- 必須註釋說明每個欄位的業務含義
- 欄位命名必須使用駝峰式,與資料庫欄位命名保持對應關係
- 日期型別優先使用`java.util.Date`型別
3. **類註釋規範**:
- 必須包含類級別JavaDoc註釋,說明該DO物件的業務用途
- 註釋格式必須包含"資料物件"說明和對應的資料表說明
### 使用DO物件的程式碼規範
1. **Mapper介面定義**:
-Mapper介面必須指定對應的DO型別
- 示例: `public interface OrderMapper extends BaseMapper<OrderDO>`
2. **DO物件轉換**:
-DO物件到領域物件的轉換應在Repository實現類中進行
- 禁止在Service層直接使用DO物件
- 必須透過Repository介面間接訪問DO物件
## 單元測試結構
- 所有單元測試必須在 `mall-pink-dolphin-start/src/test/java/com/amap/mp/dolohin/newbdolphin/` 目錄下
- 測試類命名必須符合被測試類名+Test的格式,如`OrderServiceTest`
- 測試方法命名應清晰表明測試的功能和預期結果
## 開發新功能流程規範
1. **定義領域模型**: 在new-b-dolphin-domain中定義領域模型和服務
2. **實現資料訪問**: 在new-b-dolphin-infrastructure中實現資料物件和資料訪問
3. **實現業務邏輯**: 在new-b-dolphin-app中實現業務服務
4. **實現介面層**: 在new-b-dolphin-client中實現對外介面
5. **編寫單元測試**: 在mall-pink-dolphin-start中編寫單元測試
## 列舉和常量規範
**關鍵規則**: 儘可能使用公共列舉和常量,僅當列舉/常量是高度模組特定的才進行本地定義
### 列舉定義位置:
1. **第一優先順序**: `new-b-dolphin-common.enums` 包 - 用於跨模組共享的列舉
2. **第二優先順序**: `new-b-dolphin-domain.enums` 包 - 用於領域特定的列舉
3. **最後選擇**: 模組內部特定包 - 僅用於模組內部使用的列舉
### 常量定義位置:
1. **第一優先順序**: `new-b-dolphin-common.constants` 包 - 用於跨模組共享的常量
2. **第二優先順序**: `new-b-dolphin-domain.constants` 包 - 用於領域特定的常量
3. **最後選擇**: 模組內部特定包 - 僅用於模組內部使用的常量
## 示例
<example>
// 正確地定義列舉和常量
// 1. 公共列舉 - 定義在new-b-dolphin-common中
package com.amap.mp.dolphin.common.enums;
publicenumOrderStatus {
CREATED("已建立"),
PAID("已支付"),
DELIVERED("已發貨"),
COMPLETED("已完成"),
CANCELLED("已取消");
privatefinalString desc;
OrderStatus(String desc) {
this.desc = desc;
}
publicString getDesc() {
return desc;
}
}
// 2. 公共常量 - 定義在new-b-dolphin-common中
package com.amap.mp.dolphin.common.constants;
publicclassOrderConstants {
publicstaticfinalStringORDER_PREFIX="ORD";
publicstaticfinal int DEFAULT_PAGE_SIZE=20;
publicstaticfinal long ORDER_EXPIRE_TIME=30*60* 1000L; // 30分鐘
}
// 3. 正確的介面定義和實現
// 介面定義在new-b-dolphin-client
package com.amap.mp.dolphin.hsf;
public interface OrderService {
ResultDTO<OrderDTO> createOrder(OrderCreateRequest request);
}
// 實現在new-b-dolphin-app
package com.amap.mp.dolphin.service.impl;
publicclassOrderServiceImplimplementsOrderService {
privateOrderDomainService orderDomainService;
publicResultDTO<OrderDTO> createOrder(OrderCreateRequest request) {
try {
OrderModel orderModel = orderDomainService.createOrder(request);
returnResultDTO.success(orderConverter.toDTO(orderModel));
} catch (Exception e) {
returnResultDTO.error("建立訂單失敗");
}
}
}
// 4. 正確的DO物件定義
// 資料物件 - 定義在infrastructure.dataobject包中
package com.amap.mp.dolphin.dataobject;
import lombok.Data;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableName;
/**
* 訂單資料物件
* 對應表:t_order
*/
"t_order") (
publicclassOrderDO {
/**
* 主鍵
*/
privateLong id;
/**
* 建立時間
*/
privateDate gmtCreate;
/**
* 訂單編號
*/
privateString orderNo;
/**
* 訂單狀態
*/
privateInteger status;
// 其他屬性...
}
</example>
<example type="invalid">
// 錯誤的程式碼結構示例
// 1. 錯誤:在錯誤的模組中定義列舉
package com.amap.mp.dolphin.service.enums; // 錯誤:應該放在common.enums包下
publicenumPaymentType { // 這是一個應該在公共模組的列舉
ALIPAY, WECHAT, CREDIT_CARD, CASH;
}
// 2. 錯誤:跨層呼叫
package com.amap.mp.dolphin.service;
publicclassOrderServiceImplimplementsOrderService {
privateOrderMapper orderMapper; // 錯誤:直接呼叫基礎設施層,應該透過repository介面
publicOrderDTO createOrder(OrderCreateRequest request){
OrderDO orderDO = new OrderDO();
// 設定DO屬性...
orderMapper.insert(orderDO); // 錯誤的直接呼叫
return convert(orderDO);
}
}
// 3. 錯誤:DO物件放在錯誤的位置
package com.amap.mp.dolphin.model; // 錯誤:DO應該放在infrastructure.dataobject包中
import lombok.Data;
/**
* 訂單資料物件
*/
publicclassOrderDO { // 錯誤:應該放在infrastructure.dataobject包中
privateLong id;
privateString orderNo;
// 其他屬性...
}
// 4. 錯誤:使用未經轉換的DO物件返回給外部
package com.amap.mp.dolphin.controller;
publicclassOrderController {
privateOrderService orderService;
"/orders/{id}") (
publicOrderDO getOrder(Long id){ // 錯誤:直接返回DO物件
return orderService.getOrderDO(id); // 錯誤:應該轉換為DTO再返回
}
}
</example>
概要設計
人類開發者在開發程式碼之前,需要對需求文件進行理解轉化,並對應當前應用已有的實現現狀,明確需要新增和修改的部分,之後再進行具體程式碼開發。而Cursor在開發之前,並不一定能完全理解需求文件的意圖,轉化成預期的技術方案。這依賴於其一是需求的複雜程度,其二是當前應用的知識背景是否全面充足。
所以為了提高準確性,引入了概要設計的環節,由人類幫助Cursor完成上述步驟,並直接讓Cursor根據人類的概要技術方案,產出詳細的程式碼實現設計。這裡將概要設計的重點部分展示如下:

詳細設計
概要設計是人類編寫的,精確到了介面、資料結構、業務流程層面。但對於讓Cursor開發複雜型別需求還不夠具體,故需要Cursor生成詳細設計,精確到每一層的方法、出入參、虛擬碼層面,對抗Cursor的不確定性。本文摘錄當時部分詳細設計展示如下:

程式碼編寫
在詳細設計中,大部分程式碼實現已經基本定型。在程式碼編寫階段要引用詳細設計文件,不斷和Cursor對話互動,讓Cursor生成程式碼並人工Review,以此往復。
實現步驟拆解
雖然已經有詳細設計,但如何轉化為真正的程式碼卻不能心急。我曾嘗試一次性讓Cursor生成整個詳細設計中的內容,由於文件和程式碼量過大,Cursor無法處理這麼多上下文,造成生成的程式碼會錯亂(詳細設計中不同介面的邏輯跳躍性地生成在同一個介面程式碼中)。
所以我將整個程式碼編寫環節拆分為多個步驟,拆分標準先按業務邏輯,再按技術分層。目標就是將任務顆粒度拆解到Cursor單次能完成得很好的程度。這裡給出原則,具體程式碼不在文章中體現。
1.首先按照邏輯拆分步驟,比如先寫基本的資料庫讀寫實現,再加資料校驗,再加稽核,再加狀態機。這樣更有利於方法的複用,也有利於Cursor注意力集中在一個具體功能上。
2.對於複雜的業務,需要分層架構去生成程式碼。個人推薦自底向上,從DO開始,到domain層的model、converter、gateway定義,再到具體mapper的SQL實現。然後domainService,app層,client層。
提示詞結構化
提示詞的目的是讓Cursor更清晰地理解單次對話的目的,最有效的方式就是將其結構化。對於不同複雜度的需求、不同的已有背景知識完整程度,提示詞的精細程度都可以不同。在此我舉兩個例子說明:
詳細設計中已體現的程式碼生成
# 目標
在建立元素和關係的時候,需要對元素做資料校驗,對關係做數量校驗。校驗可以劃分為一個單獨的領域,每個模組有不同的校驗規則。我們現在要實現校驗領域的設計和程式碼。
# 業務規則
參考 @詳細設計系分文件.md 中“6.1 資料校驗”部分
# 核心任務
按照詳細設計生成具體程式碼
詳細設計中未體現的程式碼生成
目標
在建立元素、修改元素後,所有新增的元素資訊都要透過統一的稽核系統。其中包括兩個步驟:提交稽核和接收稽核迴流資訊。我們現在要將稽核系統接入現有裝修元素相關的流程中。
# 業務規則
# 1. 提交稽核規則
1.1 在建立元素、修改元素時,採用執行緒池非同步提交稽核
1.2 提交稽核的方式需要匹配稽核系統的互動規則
1.3 提交稽核時,需要的欄位準備如下:
```
eventCode,每個模組一個,採用列舉形式儲存。到店指引是“STORE_GUIDE”
requestParam.channel是常量,“store_decoration”,儲存在yml檔案中
requestParam.uniqueBizId,採用elementId拼接當前時間戳
requestParam.bizId,採用元素ID
requestParam.baseinfo.uid,採用operator欄位
requestParam.bizData,是具體的送審資料,採用map的格式。對於到店指引,就是元素data中的資訊。
```
1.4 提交稽核後,需要將元素狀態更改為“待稽核”,並更新元素表
## 2. 稽核迴流規則
2.1 稽核迴流資訊透過metaQ接入,詳細互動定義見稽核互動規則。具體metaQ的接入方式,參考當前程式碼庫的com.amap.mall.content.infrastructure.repository.metaq.update.comid.correct.PushDseListener。注意Consumer類、配置檔案都要進行修改。同時新增一個HSF後門方法,直接呼叫Consumer的handle方法,可以提供給測試時期呼叫。
2.2 稽核迴流之後,要將稽核結果同步到元素表。當稽核PASS時,元素表狀態改為稽核透過。當稽核REJECT時,元素表狀態改為稽核駁回。
同時要將稽核結果資訊儲存到audit_info欄位中。
2.3 整體處理就成可以參考《audit.java》
# 現有知識背景
1. 已經將稽核系統的互動規則整理為《稽核互動規則.md》放在.cursor/docs目錄下。提交稽核我們採用“2.1 HSF請求方式”進行。當前JDK版本為1.8
2. 現有程式碼已經實現了建立元素、修改元素等流程。
3. 稽核迴流的處理框架流程可以參考別的工程的Consumer,《audit.java》放在.cursor/docs目錄下。但是要對其進行重構精簡。
# 核心要求
送審是所有模組通用的能力,請儘量可通用。對於不同模組區分的內容(主要是提審欄位準備),採用策略模式進行,不同模組的子類重寫父類方法。
# 核心任務
# 1. 仔細閱讀上述知識背景文件,仔細閱讀現有new-b-dolphin-*的程式碼實現。
# 2. 根據上述規則和現有new-b-dolphin-*的程式碼實現,將你對這部分的詳細設計輸出到文件。注意,至少要精確到類和方法的定義,所有圖都使用mermaid格式。
# 3. 文件輸出後,等待人類確認。確認該文件技術方案可行後,生成具體程式碼到對應檔案。
踩坑及應對方案
上述實現過程只是最終的實現,真實過程中經歷了非常多踩坑的情況。將其整理下來,並提出我自己的解決方案:

提效總結
過程指標
-
行數統計(Cursor完成)
-
新增程式碼總行數: 10894 (80.54%)
-
新增文件總行數: 2632 (19.45%)
-
採納率 & AI程式碼生成率
-
對話輪次的Accept比例幾乎達到100%
-
由於有部分人工修改,具體程式碼行數的AI生成比例在95%以上
結果指標
-
排期對比
-
未考慮Cursor參與的需求排期:16人天,其中方案設計階段4人天,開發12人天。
-
實際Cursor參與的需求用時:8人天,其中設計階段4人天,開發4人天。
-
除此之外,用於專案初次搭建Cursor使用環境及Rules,2人天。但專案初次搭建的成本只需要一次,且後續正規化形成後非常快捷,故不算入總消耗。
-
提效率結論
-
整體來看,本需求AI提效率為 8 / 16 = 50%
-
其中,方案設計階段由於Cursor對方案的要求更為細緻,抵消了部分Cursor編寫方案文件的提效時間。但是生成方案後,由於本需求程式碼量巨大,且流程性重複程式碼較多,實際編碼階段的提效率非常高。
-
後續展望
-
本次是筆者首次對Cursor的全流程實踐。在下一篇中,經過多次實踐和團隊溝通,形成了統一的開發正規化,對最終的提效結果有非常大的幫助。
與 AI 智慧體進行即時音視訊通話
AI 即時音影片互動是一種旨在幫助企業快速構建 AI 與使用者之間的影片或語音通話應用的解決方案。使用者只需透過白屏化的介面操作,即可快速構建一個專屬的AI智慧體,並透過影片雲 ARTC 網路與終端使用者進行即時互動。
點選閱讀原文檢視詳情。