後端開發規範

SOA服務介面規範

1、SOA介面命名提供出去後不能變更,廢棄介面使用@deprecated進行標記

2、SOA接口出入參定義為一個大物件,且出入參引數不能刪除,只能增加,廢棄欄位使用@deprecated進行標記

一般規範

開發必須會使用樂觀鎖。樂觀鎖不要採用有意義的欄位,考慮用version欄位

設計表結構慎用大欄位。注意控制輸入不要超過欄位長度,或者截段

mysql儘量少用join查詢;分庫的不要用,其他情況酌情處理

分頁頁面展示不超過10。提供介面查詢量大,必須分頁

快取。所有的讀操作,必須考慮快取。 快取key必須是唯一的,快取時間根據實際情況設定,key值要有業務意義;做設計的時候告知需求方,我們使用快取的影響。快取配置要考慮預設值,如取不到資料,使用預設值。且不能影響正常業務;考慮後臺能夠隨時清理快取。redis manage

所有的定時任務考慮是否支援多程序的,是否有補跑機制。 考慮使用多頻率呼叫的方法處理資料。避免集中式爆發;單臺機器多執行緒加上原子控制,叢集指定伺服器ip跑定時任務。

批次操作,一定要使用分批處理。批處理中一定要考慮間隔和上限,1000條做一次

設計表時要加上以下欄位:create_time、creator_id、creator、last_modified、modified_id、modified_by、is_deleted如是日誌表考慮client_ip、server_ip

是否所有頁面上的功能都考慮了多瀏覽器環境支援(必須支援火狐,chrome)

對資料唯一性要求很高的話,考慮唯一索引

介面返回儘量要保證冪等

頁面提交按鈕必須防呆。(如考慮遮罩)

原始檔編碼格式為UTF-8

Long與Ineger大小比較,用equals方法,或者先使用longValue()或intValue()方法來得到他們的基本型別的值然後使用==比較也是可以的。

命名規範

使用駝峰命名法,方法名以動詞開頭;類命名如:HelloWorld。變數命名如:headCount。常量命名應使用CONSTANT_CASE格式(譯註:所有字母大寫,單詞使用下劃線分隔)。(final, static)

controller層以**Controller結尾,Service層以**Service結尾,實現類以**ServiceImpl結尾,Dao層以**Dao結尾,實現類以**DaoImpl結尾

工具類以Utils結尾,並放到單獨的包如:common,utils

方法命名:dao層如果是單條查詢請用get開頭,如:getOperatorById,查詢集合透過find*list開頭,findMerchantListByOperatorId;get單表單條資料;find。。List單表list;query多表物件;query。。List多表list ;新增用insert開頭,更新用update開頭,刪除用delete開頭,Service層方法命名根據具體業務來,見名知意,如取消訂單,cancelOrder。

引數的命名:引數的名字必須和變數的命名規範一致。使用有意義的引數命名,如果可能的話,使用和要賦值的欄位一樣的名字:

sql檔案以*_mapper。xml結尾 ,如order_mapper。xml

jsp與html檔名全部小寫,單詞之間用_隔開,如:order_list。jsp

model層:持久層物件必須和表名一致,表現層物件一律使用 vo(Value Object)結尾。用(request,response)結尾

關於屬性的定義,陣列定義為:xxxs,列表定義為xxxList

編碼原則

所有問題要採用縮排風格編寫,縮排的空格數為4個

不允許把多個短語句寫在一行中,即一行只寫一條語句

相對獨立的程式塊之間、變數說明之後必須加空行

必須要有註釋,源程式註釋量必須在30%以上,註釋可根據需要列出:作者、內容、功能、與其它類的關係等。功能詳細描述部分說明該類或者介面的功能、作 用、使用方法和注意事項,每次修改後增加作者和更新版本號和日期。方法內的單行註釋用//,其他都用/** 。。。*/

不允許提交編譯報錯和帶黃色警告的程式碼。

每個類檔案不能超過2000行,每個方法不能超過150行。程式碼寬度150列。

If-else不應巢狀太多,不能超過三層,如果巢狀太多應該考慮調整你的邏輯了或者換種實現方式巢狀迴圈不能超過三層。

日誌處理,一般的異常情況都需要增加log日誌,儘量不要用“System。out。println()”

程式碼段原則上要放在大括號{}之內,如果只有一行程式碼也必須放在大括號之中,不允許省略,並且大括號不允許與其中的程式碼段在同一行。

不要在controller層做業務邏輯,統一在sevice層處理:controller層所做的事情是獲取入參,做資料有效性校驗。完成後則拼裝DO並傳入service層做業務邏 輯處理。

對外介面異常統一返回異常編碼和異常說明,內部正確使用異常,不要隨意地就丟擲一個異常,特別是Exception異常。但在try-catch時儘量捕獲具體異常,最 好不要catch(Exception)這麼寫。

業務使用手動事務,後臺酌情考慮。不允許有大事務。(事務的傳播性考慮)aop配置事務必須指定到方法

外部介面呼叫需要記錄日誌,資料表記錄等——提供給外部的介面

呼叫介面獲得的返回值需要做物件非空、業務邏輯驗證等操作;呼叫介面的結果物件轉換成本地定義物件,避免介面修改通知不及時引起的系統異常

系統功能及資料有合適的許可權控制(比如選單許可權,水平許可權)

沒有冗餘程式碼(特別是一註釋就註釋一大片的那種);面向介面程式設計

沒有硬編碼(如資料庫源配置、跳轉URL、魔鬼數字、通用錯誤碼、bean初始化)

面向使用者端的介面,必須做安全校驗。

update操作涉及多條或多表資料時,確保併發場景下無死鎖問題,批次更新多表按表名排序,單表按主鍵排序

無SQL注入的漏洞(在編寫mybatis的對映語句時,儘量採用“#{xxx}”這樣的格式。若不得不使用“${xxx}”這樣的引數,要手工地做好過濾工作,來防止sql注入 攻擊);不要用like,用SELECT * from end_user where INSTR(user_name,‘jun。’)

spring。xml 配置bean一定要有id且唯一(考慮jar包衝突)

第三方jar 引入是否exclude了和現在有衝突的版本 spring mybatis log4j等

pom檔案,版本控制放到最上面。

前端

超過100行的js單獨提取成js指令碼

前端的輸入引數,服務端必須校驗(防止js篡改等)

把樣式表放在body頭上

把指令碼檔案放在body底部

引用的第三方js,容錯性需要做好

多瀏覽器環境支援

前端建議:

最小化 JavaScript,考慮CDN

介面提供:

介面可擴充套件(入參xxRequest、出參xxResponse)

是否需要支援可重複呼叫

是否需要提供回滾介面

入參強制校驗

dao層考慮水平和垂直拆分的影響(是否需要路由、聚合函式分頁等如何處理)

重要資料操作,比如金額一定要有流水,不是簡單的日誌記錄(log總是多多益善)

介面層統一返回物件,異常只能在介面內部處理,不能丟擲來。返回物件包含3個基本屬性。1,返回編號 2,返回資料 3,返回訊息

SoaResponse。java

依賴:

必須做異常處理,並區分業務異常和系統異常。

(是否需要重複呼叫第三方介面,呼叫第三方介面執行成功,但是結果超時,返回失敗應該如何處理)