跟着尚硅谷雷神做完了《谷粒商城分布式基礎篇》,由於是基礎篇,還沒涉及一些比較復雜的技術,但有些地方讓我學到了很多,就對項目過程做一個小總結吧。
一、代碼生成器真好用
這個項目使用了「人人開源」的開源項目,給我最大的感受就是:還沒寫兩行代碼呢,后台系統搭好了?方不方便,誰用誰知道
簡介
-
renren-generator:人人開源項目的代碼生成器,可在線生成entity、xml、dao、service、vue、sql代碼,減少70%以上的開發任務。
-
renren-fast:renren-fast是一個輕量級的Spring Boot2.1快速開發平台,其設計目標是開發迅速、學習簡單、輕量級、易擴展;使用Spring Boot、Shiro、MyBatis、Redis、Bootstrap、Vue2.x等框架,包含:管理員列表、角色管理、菜單管理、定時任務、參數管理、代碼生成器、日志管理、雲存儲、API模塊(APP接口開發利器)、前后端分離等。
-
renren-fast-vue::renren-fast-vue基於vue、element-ui構建開發,實現renren-fast后台管理前端功能,提供一套更優的前端解決方案。
使用
renren-generator
它是一個代碼生成器,你只需要設計好數據庫表關系,然后在 renren-generator 的 application.yml 文件里配置數據庫連接信息:url、username、password,並且支持四種數據庫:MySQL、Oracle、SQLServer、PostgreSQL,啟動項目,進入如下界面:
選擇你要使用的表,點擊生成代碼,就會根據你數據庫的設計信息生成一系列代碼,甚至連前端代碼都生成了,基本的 CRUD 不需要自己寫了,可以專注於其他復雜的業務代碼,由此可見,只會基本 CRUD 的程序員已經被淘汰,想要生存下去,就必須學的更深入。
詳細使用可參考官方文檔:https://www.renren.io/guide#coder
renren-fast 和 renren-fast-vue
這兩個項目需要配合使用,一個是后端系統、一個是前端頁面,使用前后端分離的形式開發。
clone renren-fast 的源碼后,創建一個數據庫,將db文件夾下的數據庫文件執行即可。
clone renren-fast-vue 的源碼后,執行以下兩個命令
# 安裝依賴
npm install
# 啟動服務
npm run dev
安裝過程可能會出現一些錯誤,可參考:https://www.cnblogs.com/songjilong/p/12619120.html
二、JSR303 自定義校驗注解
之前只用過 JSR303 自帶的注解,在這個項目中學會了自定義校驗注解
詳見:https://www.cnblogs.com/songjilong/p/12663564.html
三、使用VirtualBox+Vagrant快速搭建Linux環境
之前用的Vmware,先去官網下載對應鏡像,然后安裝、配置等一系列操作,而且啟動很慢,而 Vagrant 創建、啟動、連接虛擬機只需要幾行命令,windows cmd 命令行即可搞定一切。
詳見:https://www.cnblogs.com/songjilong/p/12612383.html
四、各層命名規約
分層領域模型規約
- DO(Data Object):與數據庫表結構一一對應,通過DAO層向上傳輸數據源對象。
- DTO(Data Transfer Object):數據傳輸對象,Service或Manager向外傳輸的對象。
- BO(Business Object):業務對象。由Service層輸出的封裝業務邏輯的對象。
- AO(Application Object):應用對象。在Web層與Service層之間抽象的復用對象模型,極為貼近展示層,復用度不高。
- VO(View Object):顯示層對象,通常是Web向模板渲染引擎層傳輸的對象。
- Query:數據查詢對象,各層接收上層的查詢請求。注意超過2個參數的查詢封裝,禁止使用Map類來傳輸。
領域模型命名規約
- 數據對象:xxxDO,xxx即為數據表名。
- 數據傳輸對象:xxxDTO,xxx為業務領域相關的名稱。
- 展示對象:xxxVO,xxx一般為網頁名稱。
- POJO是DO/DTO/BO/VO的統稱,禁止命名成xxxPOJO。
Service/DAO層方法命名規約
- 獲取單個對象的方法用get做前綴。
- 獲取多個對象的方法用list做前綴,復數形式結尾如:listObjects。
- 獲取統計值的方法用count做前綴。
- 插入的方法用save/insert做前綴。
- 刪除的方法用remove/delete做前綴。
- 修改的方法用update做前綴。
五、全局處理
全局跨域處理
@Configuration
public class GuliMallCorsConfiguration {
@Bean
public CorsWebFilter corsWebFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.addAllowedHeader("*");
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.setAllowCredentials(true);
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
全局異常處理
@Slf4j
@RestControllerAdvice(value = "com.sjl.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {
@ExceptionHandler(MethodArgumentNotValidException.class)
public R handleValidException(MethodArgumentNotValidException e) {
log.error("數據校驗出現問題{},異常類型{}", e.getMessage(), e.getClass());
BindingResult bindingResult = e.getBindingResult();
Map<String, String> map = new HashMap<>();
bindingResult.getFieldErrors().forEach(error -> {
map.put(error.getField(), error.getDefaultMessage());
});
return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(), BizCodeEnum.VALID_EXCEPTION.getMsg()).put("data", map);
}
@ExceptionHandler(Throwable.class)
public R handleException(Throwable t) {
log.error("系統異常" + t);
return R.error(BizCodeEnum.UNKNOW_EXCEPTION.getCode(), BizCodeEnum.UNKNOW_EXCEPTION.getMsg());
}
}
全局業務狀態碼
/**
* 錯誤碼和錯誤信息定義類
* 1.錯誤碼定義規則為5為數字
* 2.前兩位表示業務場景,最后三位表示錯誤碼。例如: 100001 --> 10:通用;001:系統未知異常
* 3.維護錯誤碼后需要維護錯誤描述,將他們定義為枚舉形式
* 錯誤碼列表:
* 10:通用
* 001:參數格式校驗
* 11:商品
* 12:訂單
* 13:購物車
* 14:物流
*/
public enum BizCodeEnum {
UNKNOW_EXCEPTION(10000, "系統未知異常"),
VALID_EXCEPTION(10001, "參數格式校驗失敗"),
;
private int code;
private String msg;
BizCodeEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
全局統一返回
public class R extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
public R() {
put("code", 0);
put("msg", "success");
}
public static R error() {
return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知異常,請聯系管理員");
}
public static R error(String msg) {
return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
}
public static R error(int code, String msg) {
R r = new R();
r.put("code", code);
r.put("msg", msg);
return r;
}
public static R ok(String msg) {
R r = new R();
r.put("msg", msg);
return r;
}
public static R ok(Map<String, Object> map) {
R r = new R();
r.putAll(map);
return r;
}
public static R ok() {
return new R();
}
@Override
public R put(String key, Object value) {
super.put(key, value);
return this;
}
public Integer getCode() {
return (Integer) this.get("code");
}
}
六、其他
開發先從數據庫表結構開始
大中型系統的數據庫設計都很復雜(很佩服設計的人),如果開發業務的時候連數據庫表都沒搞清楚,將會浪費很多時間,而且寫代碼很容易出錯。
花點時間理清楚它們之間的關系及負責的模塊遠比寫代碼重要。
善於解決Bug、學會提問
遇到問題不要急着向別人提問,你可以從以下幾個方面入手,大部分問題都可以自己找到解決辦法
- 嘗試在你准備提問的論壇的舊文章中搜索答案。
- 嘗試上網搜索(先使用Google)以找到答案。
- 嘗試閱讀手冊以找到答案。
- 嘗試閱讀常見問題文件(FAQ)以找到答案。
- 嘗試自己檢查或試驗以找到答案。
- 向你身邊的強者朋友打聽以找到答案。
- 如果你是程序開發者,請嘗試閱讀源代碼以找到答案。
參考:提問的智慧
注意代碼規范
- 阿里巴巴Java開發手冊(詳盡版)https://github.com/alibaba/p3c/blob/master/阿里巴巴Java開發手冊(詳盡版).pdf
- Google Java編程風格指南:http://www.hawstein.com/posts/google-java-style.html
- Effective Java第三版中文版:https://legacy.gitbook.com/book/jiapengcai/effective-java
- 中文文案排版指北:https://github.com/sparanoid/chinese-copywriting-guidelines