BO
类我这次设计的非常统一,都是用一个外层类包裹一个PO
,外加与Journal
类一样的字段名称,看两个例子就明白了:
ContractData
类
这是Contract
类对应的BO
,用于向前端返回一个合同经过计算后的完整信息,如下:
public class ContractData {
private Contract contract;
// 资产-货币资金
private BigDecimal cash = new BigDecimal("0.00");
// 资产-开发成本
private BigDecimal developmentCost = new BigDecimal("0.00");
// 资产-预付账款
private BigDecimal prepaid = new BigDecimal("0.00");
// 资产-进项税金
private BigDecimal inputVAT = new BigDecimal("0.00");
// 资产-其他资产
private BigDecimal otherAsset = new BigDecimal("0.00");
// 负债-应付账款
private BigDecimal accountPayable = new BigDecimal("0.00");
// 负债-其他应付款
private BigDecimal otherPayable = new BigDecimal("0.00");
// 负债-其他负债
private BigDecimal otherLiability = new BigDecimal("0.00");
// 损益-其他损益
private BigDecimal otherPL = new BigDecimal("0.00");
public ContractData(Contract contract) {
this.contract = contract;
}
}
getter
和setter
方法依然省略。这个类就有一个Contract
,然后让业务层,将合并计算后的结果设置在这个BO
类上,返回前端去渲染。
SubjectData
类
这个类也是如法炮制:
public class SubjectData {
private Subject subject;
// 资产-货币资金
private BigDecimal cash = new BigDecimal("0.00");
// 资产-开发成本
private BigDecimal developmentCost = new BigDecimal("0.00");
// 资产-预付账款
private BigDecimal prepaid = new BigDecimal("0.00");
// 资产-进项税金
private BigDecimal inputVAT = new BigDecimal("0.00");
// 资产-其他资产
private BigDecimal otherAsset = new BigDecimal("0.00");
// 负债-应付账款
private BigDecimal accountPayable = new BigDecimal("0.00");
// 负债-其他应付款
private BigDecimal otherPayable = new BigDecimal("0.00");
// 负债-其他负债
private BigDecimal otherLiability = new BigDecimal("0.00");
// 损益-其他损益
private BigDecimal otherPL = new BigDecimal("0.00");
public SubjectData(Subject subject) {
this.subject = subject;
}
}
就不作解释了。
ProjectData
类
依然是同样的套路。
public class ProjectData {
private Project project;
// 资产-货币资金
private BigDecimal cash = new BigDecimal("0.00");
// 资产-开发成本
private BigDecimal developmentCost = new BigDecimal("0.00");
// 资产-预付账款
private BigDecimal prepaid = new BigDecimal("0.00");
// 资产-进项税金
private BigDecimal inputVAT = new BigDecimal("0.00");
// 资产-其他资产
private BigDecimal otherAsset = new BigDecimal("0.00");
// 负债-应付账款
private BigDecimal accountPayable = new BigDecimal("0.00");
// 负债-其他应付款
private BigDecimal otherPayable = new BigDecimal("0.00");
// 负债-其他负债
private BigDecimal otherLiability = new BigDecimal("0.00");
// 损益-其他损益
private BigDecimal otherPL = new BigDecimal("0.00");
public ProjectData(Project project) {
this.project = project;
}
}
BO
类也设置好以后,就可以来一点一点编写具体的控制器,业务层和持久层了。
在此之前,先设计一下URL
。
URL
设计
我们的基本逻辑没有变,还是需要先添加项目,然后选择项目添加类别,选择类别添加合同,选择合同添加明细记录。
所以除了项目之外,只需要知道当前操作的是什么对象,进行什么操作,对于修改和添加来说,只需要知道上一层关联的对象的id
即可,所以最基础的URL
设计如下:
PMS
功能的前缀URL
,依然是/pms
- 具体某个模块的基础
URL
,采用类名接在/pms
- 新增数据,除了
Project
直接使用/project/add
之外,其他的一律使用/className/上一层id/add
- 修改数据,一律使用
id
,不允许修改其上层关联数据,采用/className/edit/id
- 删除数据,这个需要发
POST
请求,所以统一使用/className/delete
即可 - 查询,采用
/className/detail/id
。
所有的数据,在输入的时候严格按照在上层数据下边添加下层数据,不允许通过修改数据改来改去,设计好的URL
如下
数据类型 | 动作 | URL |
---|---|---|
Proejct | 新增 | /pms/project/add |
Proejct | 删除 | /pms/project/delete |
Proejct | 修改 | /pms/project/edit/id |
Proejct | 详情 | /pms/project/detail/id |
Proejct | 列表 | /pms/project/list |
Subject | 新增 | /pms/subject/pid/add |
Subject | 删除 | /pms/subject/delete |
Subject | 修改 | /pms/subject/edit/id |
Subject | 详情 | /pms/subject/detail/id |
Subject | 列表 | /pms/subject/pid/list |
Contract | 新增 | /pms/contract/sid/add |
Contract | 删除 | /pms/contract/delete |
Contract | 修改 | /pms/contract/edit/id |
Contract | 详情 | /pms/contract/detail/id |
Contract | 列表 | /pms/contract/sid/list |
Journal | 新增 | /pms/journal/cid/add |
Journal | 删除 | /pms/journal/delete |
Journal | 修改 | /pms/journal/edit/id |
Journal | 详情 | /pms/journal/detail/id |
Journal | 列表 | /pms/journal/cid/list |
有了这些之后,我们就可以根据一定的规则来生成URL
,这个时候可以把这些生成URL
的方法补充到PO
里去,也可以写一个方法,通过URL
可以发现,只需要把数据类型,动作和所需要的id
传给一个方法,就可以返回一个拼接好的URL
或者说一个集合。因此我打算写一个业务层用来提供URL
服务,可以通过提供上述三个数据来返回一个数据对象对应的四种URL
集合,再把这个URL
集合设置到数据对象上即可。
这里我懒得写,还是把方法都加到了PO
上去,方法名称这次也都规范化了,以Project
类为例:
// URL方法
public String addURL() {
return "/pms/project/add";
}
public String deleteURL() {
return "/pms/project/delete";
}
public String editURL() {
return "/pms/project/edit/" + id;
}
public String detailURL() {
return "/pms/project/detail/" + id;
}
public String addSubjectURL() {
return "/pms/subject/" + id + "/add";
}
可以看到这里是把添加合同类别的东西放到了Project
类中,也符合在页面中需要为此项目添加合同类别的需求。
再举一个有关联对象的Subject
类的例子:
// URL方法
public String addContractURL() {
return "/pms/contract/" + id + "/add";
}
public String deleteURL() {
return "/pms/subject/delete";
}
public String editURL() {
return "/pms/subject/edit/" + id;
}
public String detailURL() {
return "/pms/subject/detail/" + id;
}
其他的就很类似了,如下:
// URL方法
public String addJournalURL() {
return "/pms/journal/" + id + "/add";
}
public String deleteURL() {
return "/pms/contract/delete";
}
public String editURL() {
return "/pms/contract/edit/" + id;
}
public String detailURL() {
return "/pms/contract/detail/" + id;
}
你能猜到上边和下边的各是哪个类吗?
public String deleteURL() {
return "/pms/journal/delete";
}
public String editURL() {
return "/pms/journal/edit/" + id;
}
public String detailURL() {
return "/pms/journal/detail/" + id;
}
这里都设计好之后,剩下的就是来编写业务层和DAO
了,最后只要把以前编写过的前端页面改改就行了。