跟着尚硅谷雷神做完了《谷粒商城分布式基础篇》,由于是基础篇,还没涉及一些比较复杂的技术,但有些地方让我学到了很多,就对项目过程做一个小总结吧。
一、代码生成器真好用这个项目使用了「人人开源」的开源项目,给我最大的感受就是:还没写两行代码呢,后台系统搭好了?方不方便,谁用谁知道
简介
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 的程序员已经被淘汰,想要生存下去,就必须学的更深入。
详细使用可参考官方文档:
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
四、各层命名规约参考:阿里巴巴Java开发手册(华山版)
分层领域模型规约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做前缀。
五、全局处理 全局跨域处理 @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、学会提问遇到问题不要急着向别人提问,你可以从以下几个方面入手,大部分问题都可以自己找到解决办法
尝试在你准备提问的论坛的旧文章中搜索答案。
尝试上网搜索(先使用Google)以找到答案。
尝试阅读手册以找到答案。
尝试阅读常见问题文件(FAQ)以找到答案。
尝试自己检查或试验以找到答案。
向你身边的强者朋友打听以找到答案。
如果你是程序开发者,请尝试阅读源代码以找到答案。
参考自:https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md
注意代码规范阿里巴巴Java开发手册(详尽版)https://github.com/alibaba/p3c/blob/master/阿里巴巴Java开发手册(详尽版).pdf
Google Java编程风格指南:
Effective Java第三版中文版:https://legacy.gitbook.com/book/jiapengcai/effective-java
中文文案排版指北:https://github.com/sparanoid/chinese-copywriting-guidelines
七、项目地址前端:https://github.com/songjilong/gulimall-management-page
后端:https://github.com/songjilong/gulimall