第一個java後端項目總結

1.項目環境

IDEA15 spring4 mybatis3.4 mysql RestLet Client用於發送請求測試前端

2.項目介紹

這是一個商城項目,原本想起名叫SSM項目,發現本身並無用springmvc。
前端還在作,使用nodejs。也是本身第一篇博客,記錄一下本身的學習過程,但願一方面能多作寫項目鍛鍊能力,另外一方面也讓本身在作完以後寫寫博客本身總結反思。

3.功能模塊

  1. 用戶模塊
  2. 管理員模塊(用戶管理和訂單管理)
  3. 商品模塊
  4. 購物車模塊
  5. 訂單管理模塊

文件結構以下

4.部分代碼記錄

  • 規範化返回值

規範化了Controller的返回值,便於前端的使用,定義了統一的json序列化返回值ServiceResponse類
圖片描述java

這樣在controller中的返回值就能夠這樣寫
圖片描述node

這樣,經過前端後端共同約定好一個json格式,能夠大大加快開發的速度。mysql

  • 通用工具類封裝

咱們在開發過程當中常常會遇到配置問價文件的讀取,時間類型字符和字符串之間的轉換,在商業項目中金額的計算的處理等等。尤爲是在計算金額的時候發生精度丟失的問題,例如spring

public void fun()  {
        System.out.println(0.05+0.01);
        System.out.println(1.0-0.42);
        System.out.println(4.012*100);
        System.out.println(3.3/10.0);
    }
0.060000000000000005
0.5800000000000001
401.19999999999993
0.32999999999999996

這種問題就會形成用戶下單時的錯誤,這種錯誤在商家一方必定是沒法承受的。
所幸java給咱們提供了一種解決方案,就是使用String的BigDecimal構造器,必定是使用String類型的,若是使用double類型構造器會形成更大的偏差。BigDecimal在用String作入參的時候,可以正確地把字符串轉化成真正精確的浮點數,若是入參是其餘類型,那麼會調用Object.toString方法進行轉化以後進行輸出。而Double.toString會使用必定的精度來四捨五入double,而後再輸出。sql

public static BigDecimal add(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2);
    }
  • Po和Vo
Po:Persistent Object 持久化對象,能夠理解爲與數據庫字段一一對應的對象
Vo:Value Object 值對象,用於在業務之間傳遞的對象,例如在用戶建立訂單的時候,建立一個OrderVo對象,將訂單信息,購物車信息,收貨地址信息,用戶信息封裝在一塊兒會更方便。若是直接使用Order PO, Cart Po,User Po這些持久對象,在封裝json傳遞給前端會形成不少麻煩。
  • 封裝常量
    將常量封裝起來使用會使整個項目看起來更整潔,提升複用性

對於普一般量:數據庫

public static final String EMAIL = "email";

對於一個對象的多個狀態:json

public interface Cart {
        int CHECKED = 1;//購物車選中
        int UNCHECKED = 0;//
        String LIMIT_NUM_FAIL = "LIMIT NUM FAIL";
        String LIMIT_NUM_SUCCESS = "LIMIT NUM SUCCESS";
    }

對於一個對象某個狀態須要多個字段:後端

public enum OrderStatusEnum {
        CANCELED(0, "取消"),
        NO_PAY(10, "未支付"),
        PAID(20, "已付款"),
        SHIPPED(40, "已發貨"),
        ORDER_SUCCESS(50, "訂單完成"),
        ORDER_CLOSE(60, "訂單關閉");
        public static OrderStatusEnum codeof(int code) {
            for (OrderStatusEnum orderStatusEnum : values()) {
                if (orderStatusEnum.getCode() == code) {
                    return orderStatusEnum;
                }
            }
            throw new RuntimeException("沒有找到對應枚舉");
        }
        OrderStatusEnum(int code, String value) {
            this.code = code;
            this.value = value;
        }
        private String value;
        private int code;
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
        public int getCode() {
            return code;
        }
        public void setCode(int code) {
            this.code = code;
        }
    }

規劃

最後在規劃一下本身接下來的學習路線吧,仍是以java開發爲主,並關注一些node的發展情況。仍是要多作幾個SSM、SSH的項目,看看spring的源碼,而後是springboot,就先這樣吧。springboot

相關文章
相關標籤/搜索