zoukankan      html  css  js  c++  java
  • 项目总结

    跟着尚硅谷雷神做完了《谷粒商城分布式基础篇》,由于是基础篇,还没涉及一些比较复杂的技术,但有些地方让我学到了很多,就对项目过程做一个小总结吧。

    一、代码生成器真好用

    这个项目使用了「人人开源」的开源项目,给我最大的感受就是:还没写两行代码呢,后台系统搭好了?方不方便,谁用谁知道

    简介

    • 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. 如果你是程序开发者,请尝试阅读源代码以找到答案。

    参考:提问的智慧

    注意代码规范

  • 相关阅读:
    设计模式总结
    内存模型
    运行时内存
    网络
    iOS安全攻防(十)dump自己的app
    iOS安全攻防(九)使用Theos开发SpringBoard的Tweat
    iOS安全攻防(八)Thoes的Logos简介
    iOS安全攻防(七)使用iOSOpenDev开发SpringBoard的Tweat
    iOS安全攻防(六)使用class-dump导出Frameworks头文件
    iOS安全攻防(五)使用dpkg安装deb到iOS设备
  • 原文地址:https://www.cnblogs.com/songjilong/p/12705040.html
Copyright © 2011-2022 走看看