1.项目环境

IDEA15 spring4 mybatis3.4 mysql RestLet Client用于发送请求测试

2.项目介绍

这是一个商城项目,本来想起名叫SSM项目,发现自己并没有用springmvc。
前端还在做,使用nodejs。也是自己第一篇博客,记录一下自己的学习过程,希望一方面能多做写项目锻炼能力,另一方面也让自己在做完之后写写博客自己总结反思。   

3.功能模块

  1. 用户模块
  2. 管理员模块(用户管理和订单管理)
  3. 商品模块
  4. 购物车模块
  5. 订单管理模块

文件结构如下

4.部分代码记录

  • 规范化返回值

规范化了Controller的返回值,便于前端的使用,定义了统一的json序列化返回值ServiceResponse类
图片描述

这样在controller中的返回值就可以这样写
图片描述

这样,通过前端后端共同约定好一个json格式,可以大大加快开发的速度。

  • 通用工具类封装

我们在开发过程中经常会遇到配置问价文件的读取,时间类型字符和字符串之间的转换,在商业项目中金额的计算的处理等等。尤其是在计算金额的时候发生精度丢失的问题,例如

    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,然后再输出。

    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";

对于一个对象的多个状态:

    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,就先这样吧。


Charlie
86 声望6 粉丝

身怀利器,杀心自起,慎而重之