首先
近段时间自己做了一个电商的项目练练手,现在得闲把他的项目架构和一些知识点总结一下。项目的Gitee地址我先放在这,有需要可以自取:
电商系统:https://gitee.com/phil0326/mall 支付系统:https://gitee.com/phil0326/pay
架构总结
包的存放格式及命名
一般以
com.cjhstdy.mall
(com.公司名字.项目名称)
其中:
-
config
: 配置文件的存放位置 XxxxConfig
需要用 @Configuration 注明才能被加载到AOP容器中
consts
: 项目定义的常量文件位置,建议一般在项目中常量不写死,把他抽出来写到这个文件中 XxxConst
一般把他定义为静态的FINAL类,不能修改,在后期更改可以做到统一更改
-
controller
: 控制层,用来放控制层用于向外提供接口 XxxxController 因为我们要向外提供访问的接口那么我们就要注明
: @RestController @Autowired 是自动装配GetMapping()
:用于获取信息并可以携带参数,但是在方法中一定要对携带的参数进行校验 @PathVariablePostMapping()
: 用于表单的提交,携带的表单必须要进行校验操作,@Vaild @RequestBody
PutMapping()
: 一般用于修改/更新数据库中数据DeleteMapping()
:用于对数据的信息的删除操作
dao/mapper
: 操作数据库的方法 XxxMapper接口类型 Interface
- 记得带上 @Component 注解,不然在别的自动装配的时候会报红,虽然不影响但是还是很碍眼!!
-
enums
: 枚举存放的位置 XxxXxxEnum枚举类型 Enum - 要标注好Get方便后面的使用的时候调用,@Getter
exception
: 异常文处理文件存放位置 XxxException
- 一般我们用这个来做统一的异常处理,或者对某一个异常的捕获 ,一定要标注好 @ControllerAdvice
- 对应的方法上要标注好 :@ExceptionHandler(RuntimeException.class)@ResponseBody
-
form
: 表单提交的规范要求字段 XxxXxxForm@Data - 我们在做表单提交的操作的时候,有时候并不需要全部的信息,只需要个别重要的字段即可,例如登录的用户名和密码两个字段。那么这个使用我们就用这个表单去定义我们要提交表单的信息即可!
- 注意这个必须要对表单做非空校验工作!
- @NotBlank : 用于String类型的校验
- @NotEmpty : 用于集合判断
- @NotNull: 用于 Integer 的校验
interceptor
: 拦截器的文件存放位置,一般项目中肯定要做一些安全的访问措施,那么这时候就会用到拦截器,拦截器一般有两个文件 XxxInterceptorInterceptorConfig , 做统一的访问拦截
listener
: 这个一般是用来存放 RabbitMQ 的监听器的,监听 RabbitMQ 消息队列中的信息
- 首先要先加上注解 @Component@RabbitListener(queues = “xxxxx队列名称”)
- 在方法上标注好 @RabbitHandler
-
pojo(Plain Ordinary Java Object)
: 对应数据库的实体类字段, java 对象其实就是javaBean
- 一般我们会是使用 lombok 的注解 @Data@AllArgsConstructor@NoArgsConstructor 简化开发
service
: 用来装 操作的接口方法
service/impl
:用来装实现 service 接口的实现类 ,记得标注好注解 @Service
vo
: 一般用来装返回给前端的一些基本信息,因为我们正在开发时前端并不需要全部的字段,只需要部分,那么我们一般不会给他全部只会给他他所需要的对应信息字段,也是为了数据安全 。实体类必须加上 @Data
resource/mappers
: 这个就是用来存放操作数据库的 SQL语句 的 xml 文件, 属于 mybatis
操作数据库的一个文件。 这个可以直接用 mybatis 的反向生成把基本需要的生成出来!具体操作看 generactorConfig.xml
在终端使用代码进行反向生成:
mvn mybatis-generator:generate
static
: 用户存放静态资源的地方,如 html
等文件
templates
: 用户存放动态资源的地方,如动态生成二维码的文件 .ftl
applacation.yaml
: 这就是配置信息的文件了,所有的配置信息都可以在这里配置,有两种形式 application.yamlapplication.propertiesbootstrap.yamlbootstrap.properties , 项目推荐使用 application.yaml
banner.txt
: 配置你项目启动的动画而已!!!玩玩
generactorConfig.xml
:mybatis 反向生成器的配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- windows下路径, D:\downloads\xxx.jar-->
<!--这里需要引入 jar包-->
<classPathEntry location="C:\Java\jar\mysql-connector-java-5.1.6.jar"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--不再追加xml内容-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 配置数据的基本信息-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/mall?characterEncoding=utf-8"
userId="root"
password="123456">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--生成实体类,配置对应的包的信息位置-->
<javaModelGenerator targetPackage="com.cjhstudy.mall.pojo" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--生成dao层,配置报的位置信息-->
<sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--生成 .xml文件得生成位置信息-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.cjhstudy.mall.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<table tableName="mall_order_item" domainObjectName="OrderItem" enableCountByExample="false"
enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"/>
</context>
</generatorConfiguration>
log4j.properties
: 日志输出的基本配置信息
test
: 用于装单测文件的包
target
: 这个是我们在打包好项目后的包位置
pom.xml
: 这个就是 maven 项目依赖的配置位置
MD5摘要-----加密
我们在将密码写入数据库的时候都会进行对密码的加密,这种加密我们一般就会选择 MD5
加密了
user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes(StandardCharsets.UTF_8)));
开发的时候我们在判断条件的时候尽量取反把不符合的提出来,这样可提高代码的阅读性!!!
再判断符合那一类不符合那一类的时候我们只对确定的信息进行判断
PageHelper 分页的应用
//插入分页控制
PageHelper.startPage(pageNum,pageSize);
List<Product> productList = productMapper.selectByCategoryIdSet(categoryIdSet);
List<ProductVo> productVoList = productList.stream()
.map(e -> {
ProductVo productVo = new ProductVo();
BeanUtils.copyProperties(e, productVo);
return productVo;
})
.collect(Collectors.toList());
PageInfo pageInfo = new PageInfo<>(productList);
pageInfo.setList(productVoList);//按规定的list形式返回
return ResponseVo.success(pageInfo);
对数据库的更新修改(update)、删除(delete)、添加(insert)时会返回该行的行号,那么我们可以通过判断返回的行号来确定是否操作成功!如果返回的是
0
的话那么就是说对数据的操作是失败的。
int row = shippingMapper.deleteByIdAndUid(uid, shippingId);
if (row == 0){
return ResponseVo.error(ResponseEnum.DELETE_SHIPPING_FAIL);
}
有时候我们在开发过程中,我们插入一条信息数据库中会自动增加他的id,但是有些时候我们有需要获得这个插入的id值,那么这个时候我们就需要在 mapper.xml 文件中添加 useGeneratedKeys=“true” keyProperty=“id”
<insert id="insertSelective" parameterType="com.cjhstudy.mall.pojo.Shipping" useGeneratedKeys="true" keyProperty="id">
.....
</insert>
结语
好了,总结就差不多写到这。基本上就是我们在做后端开发的时候每一个地方需要做的一些规范。由于做的项目较为简单所以可能不能涵盖到全部的内容,但是后期笔者接触到更多的规范会及时的跟进更新。希望对刚开始做项目的同学有一定的帮助。
收工~