項目總結 - 谷粒商城基礎篇


跟着尚硅谷雷神做完了《谷粒商城分布式基礎篇》,由於是基礎篇,還沒涉及一些比較復雜的技術,但有些地方讓我學到了很多,就對項目過程做一個小總結吧。

一、代碼生成器真好用

這個項目使用了「人人開源」的開源項目,給我最大的感受就是:還沒寫兩行代碼呢,后台系統搭好了?方不方便,誰用誰知道

簡介

  • 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做前綴。

參考:阿里巴巴Java開發手冊(華山版)

五、全局處理

全局跨域處理

@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、學會提問

遇到問題不要急着向別人提問,你可以從以下幾個方面入手,大部分問題都可以自己找到解決辦法

  1. 嘗試在你准備提問的論壇的舊文章中搜索答案。
  2. 嘗試上網搜索(先使用Google)以找到答案。
  3. 嘗試閱讀手冊以找到答案。
  4. 嘗試閱讀常見問題文件(FAQ)以找到答案。
  5. 嘗試自己檢查或試驗以找到答案。
  6. 向你身邊的強者朋友打聽以找到答案。
  7. 如果你是程序開發者,請嘗試閱讀源代碼以找到答案。

參考:提問的智慧

注意代碼規范


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM