程序员的资源宝库

网站首页 > gitee 正文

项目总结 - 谷粒商城基础篇

sanyeah 2024-04-13 16:08:56 gitee 4 ℃ 0 评论

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

一、代码生成器真好用

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

简介

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

参考:提问的智慧

注意代码规范

  • 阿里巴巴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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表