Fms-Java版开发实录:35 BO类的编写与URL设计

Fms-Java版开发实录:35 BO类的编写与URL设计

设计先行,还是老套路。

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;
    }
}

gettersetter方法依然省略。这个类就有一个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设计如下:

  1. PMS功能的前缀URL,依然是/pms
  2. 具体某个模块的基础URL,采用类名接在/pms
  3. 新增数据,除了Project直接使用/project/add之外,其他的一律使用/className/上一层id/add
  4. 修改数据,一律使用id,不允许修改其上层关联数据,采用/className/edit/id
  5. 删除数据,这个需要发POST请求,所以统一使用/className/delete即可
  6. 查询,采用/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了,最后只要把以前编写过的前端页面改改就行了。

LICENSED UNDER CC BY-NC-SA 4.0
Comment