项目心得(六)

版本更新,这是我最近反复遇到的问题。今天又一次遇到了需要照顾版本的问题。在这里记录一下。

问题描述

添加新的菜单,存在老版本,需要照顾老版本。

解决过程

1.直接添加菜单

最开始没有考虑到版本的问题,所以直接添加了一个菜单。

1
2
3
4
5
6
7
8
9
10
11
12
// 人员资质
protected void addWebAppMenusPersonnel() {
...
WebAppMenu personnelSuperviseFileMenu = new WebAppMenu();
personnelSuperviseFileMenu.setRouteName("personnelSuperviseFile");
personnelSuperviseFileMenu.setParentRouteWebAppMenu(personnelMenu);
personnelSuperviseFileMenu.setParentWebAppMenu(personnelMenu);
personnelSuperviseFileMenu.setName("监督抽查人员档案");
personnelSuperviseFileMenu.setWeight(300);
personnelSuperviseFileMenu.setDescription("人员资质管理监督抽查人员档案");
webAppMenus.add(personnelSuperviseFileMenu);
}

但是,很明显这种方法有问题。

2.使用版本号进行控制

参考了一下以前的解决办法,生成一个随机的版本号,然后在执行初始化的时候判断一下有没有这个版本,如果没有,将版本号存进数据库,然后添加新的菜单;如果有,直接跳过。

上面的代码没有变,在开始的时候添加一个版本判断:

1
2
3
4
5
6
7
8
9
10
String batch3 = "M0xOM80H0UWKVvE5GpVUiAg1b1cnAw5j";
if (null == migrationService.findByBatch(batch3)) {
isAdd = true; // 有新数据需要添加
logger.info("维护版本信息");
migrationService.saveByBatch(batch3);
logger.info("人员资质功能新增");
this.addWebAppMenusPersonnel();
}

这样会出现问题,在进行测试的时候,本应该出现一百多条的数据,只出现了几十条。原因是什么呢?

因为我们在这里使用的还是addWebAppMenusPersonnel()这个方法,但是这个方法中的菜单我们已经在前面统一添加的时候添加过了一次,现在再添加一次,那么就会产生重复。初始化执行到这里发现有问题,就停止执行了,所以测试就会出现问题。

3.最终解决

既然不能重复添加,那我们就要将新添加的菜单放在另一个函数中来单独添加。

首先将定义一个全局变量:personnelMenu。这是由于这是个父类的菜单,他会在两个函数中被调用。

1
private WebAppMenu personnelMenu;

然后定义一个函数,用来单独添加新的菜单,同时要删除原来人员资质中的相应菜单部分:

1
2
3
4
5
6
7
8
9
10
11
12
// 人员资质功能新增
private void addPersonnelFunction() {
logger.info("为原有人员资质管理添加监督抽查人员档案");
WebAppMenu personnelSuperviseFileMenu = new WebAppMenu();
personnelSuperviseFileMenu.setRouteName("personnelSuperviseFile");
personnelSuperviseFileMenu.setParentRouteWebAppMenu(personnelMenu);
personnelSuperviseFileMenu.setParentWebAppMenu(personnelMenu);
personnelSuperviseFileMenu.setName("监督抽查人员档案");
personnelSuperviseFileMenu.setWeight(300);
personnelSuperviseFileMenu.setDescription("人员资质管理监督抽查人员档案(适用于管理部门)");
webAppMenus.add(personnelSuperviseFileMenu);
}

最后调用新建的函数:

1
2
3
4
5
6
7
8
9
10
String batch3 = "M0xOM80H0UWKVvE5GpVUiAg1b1cnAw5j";
if (null == migrationService.findByBatch(batch3)) {
isAdd = true; // 有新数据需要添加
logger.info("维护版本信息");
migrationService.saveByBatch(batch3);
logger.info("人员资质功能新增");
this.addPersonnelFunction();
}

这样问题就解决了。

总结

随着系统的完善,我们肯定会对系统升级多次,对数据的维护就显得至关重要。很多时候我们不能手动取操作数据表来维护数据,所以维护数据的代码就少不了了。这就是我们要实现的自动维护:程序一启动,完全不用考虑数据的问题。这才是我们想要的效果。

坚持原创技术分享,您的支持将鼓励我继续创作!