顶层结构
-
项目根目录/src/main/java
:放置项目Java源代码 -
项目根目录/src/main/resources
:放置项目静态资源和配置文件 -
项目根目录/src/test/java
:放置项目测试用例代码
一个功能/模块结构
各个目录详细介绍:
|_annotation:放置项目自定义注解
|_aspect:放置切面代码
|_config:放置配置类
|_constant:放置常量、枚举等定义
|__consist:存放常量定义
|__enums:存放枚举定义
|_controller:放置控制器代码
|_filter:放置一些过滤、拦截相关的代码
|_mapper:放置数据访问层代码接口
|_model:放置数据模型代码
|__entity:放置数据库实体对象定义
|__dto:存放数据传输对象定义
|__vo:存放显示层对象定义
|_service:放置具体的业务逻辑代码(接口和实现分离)
|__intf:存放业务逻辑接口定义
|__impl:存放业务逻辑实际实现
|_utils:放置工具类和辅助代码
然后接下来/src/main/resources
目录,里面主要存放静态配置文件和页面静态资源等东西:
|_mapper:存放mybatis的XML映射文件(如果是mybatis项目)
|_static:存放网页静态资源,比如下面的js/css/img
|__js:
|__css:
|__img:
|__font:
|__等等
|_template:存放网页模板,比如thymeleaf/freemarker模板等
|__header
|__sidebar
|__bottom
|__XXX.html等等
|_application.yml 基本配置文件
|_application-dev.yml 开发环境配置文件
|_application-test.yml 测试环境配置文件
|_application-prod.yml 生产环境配置文件
DTO/VO/DO
等数据模型定义的区分
-
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类来传输。
项目结构划分总结
Controller
BaseController
所有controller都继承BaseController
public class BaseController {
/**
* 获取成功返回结果
*
* @param data
* @return
*/
public ResponseObject getSuccessResult(Object data) {
return new ResponseObject(FrameworkConstants.HTTP_RESPONSE_CODE_SUCCESS, "操作成功", data);
}
/**
* 获取成功返回结果
*
* @param message
* @param data
* @return
*/
public ResponseObject getSuccessResult(String message, Object data) {
return new ResponseObject(FrameworkConstants.HTTP_RESPONSE_CODE_SUCCESS, message, data);
}
/**
* 获取成功返回结果
*
* @param code
* @param message
* @param data
* @return
*/
public ResponseObject getSuccessResult(int code, String message, Object data) {
return new ResponseObject(code, message, data);
}
/**
* 获取错返回结果(无参数替换)
*
* @param errorCode
* @return
*/
public ResponseObject getFailureResult(int errorCode) {
return new ResponseObject(errorCode, PropertiesUtil.getResponseErrorMessageByCode(errorCode), null);
}
/**
* 获取错返回结果(带参数替换)
*
* @param errorCode
* @param message
* @return
*/
public ResponseObject getFailureResult(int errorCode, String message) {
return new ResponseObject(errorCode, message, null);
}
/**
* 获取错返回结果(带参数替换)
*
* @param errorCode
* @param message
* @return
*/
public ResponseObject getFailureResult(int errorCode, String message, Object data) {
return new ResponseObject(errorCode, message, data);
}
}
具体业务Controller
/**
* 获取订单列表
*/
@RequestMapping(value = "/list", method = RequestMethod.GET)
@CrossOrigin
public ResponseObject list(HttpServletRequest request, @RequestParam Map<String, Object> param) throws BusinessCheckException {
String token = request.getHeader("Access-Token");
UserInfo userInfo = TokenUtil.getUserInfoByToken(token);
if (userInfo == null) {
return getFailureResult(1001, "用户未登录");
}
param.put("userId", userInfo.getId());
ResponseObject orderData = refundService.getUserRefundList(param);
return getSuccessResult(orderData.getData());
}
返回数据结构
public class ResponseObject {
private int code;
private String message;
private Object data;
public ResponseObject(int code, String message, Object data) {
this.code = code;
this.message = message;
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String msg) {
this.message = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("ResponseObject{");
sb.append("code=").append(code);
sb.append(", message='").append(message).append('\'');
sb.append(", data=").append(data);
sb.append('}');
return sb.toString();
}
}
总结
最后推荐按业务分模块,每个模块下面都包含一样的目录(controller,service...)