1 在数据库中增加存储主机公网ip和内网ip对应关系的表
1.1 功能说明
在配置文件的monitorcenter数据库里加一个表,用这个表来存储主机的公网IP和内网IP的对应关系,实现公网IP查内网IP和内网查公网的数据库操作,定义controller实现查询、增加、修改、删除记录的rest api
1.2 数据库操作的配置文件和表中记录
路径位置:\src\main\resources\mappers\IPInfo.xml
数据库monitorcenter中的t_conversion_ip表中一共有三个字段,id(主键)、publicIp和neyworkIp,其中publicIp表示公网ip,networkIp表示内网ip。
1.3 数据库操作
功能 | 操作ID | Sql语句 |
---|---|---|
查询公网IP是否存在 | isPublicIpExists | SELECT COUNT(1) FROM t_conversion_ip where publicIp = #{publicIp}; |
查询内网IP是否存在 | isNetworkIpExists | SELECT COUNT(1) FROM t_conversion_ip where networkIp = #{networkIp}; |
根据内网IP查询公网IP | getPublicIp | SELECT * FROM t_conversion_ip where networkIp = #{networkIp}; |
根据公网IP查新内网IP | getNetworkIp | SELECT * FROM t_conversion_ip where publicIp = #{publicIp}; |
向表中增加IP记录 | addIp | INSERT INTO t_conversion_ip (publicIp,networkIp) VALUES (#{publicIp},#{networkIp}); |
根据内网IP删除表中记录 | deleteIp | DELETE FROM t_conversion_ip WHERE networkIp = #{networkIp}; |
根据内网IP修改公网IP | updateIp | UPDATE t_conversion_ip SET publicIp = #{publicIp} WHERE networkIp = #{networkIp} |
代码示例:
<select id="isPublicIpExists" parameterType="java.lang.String" resultType="java.lang.Boolean">
SELECT COUNT(1) FROM t_conversion_ip where publicIp = #{publicIp};
</select>
<select id="isNetworkIpExists" parameterType="java.lang.String" resultType="java.lang.Boolean">
SELECT COUNT(1) FROM t_conversion_ip where networkIp = #{networkIp};
</select>
<select id="getPublicIp" parameterType="java.lang.String" resultType="com.mobisys.monitorcenter.videoConference.domain.IPInfo">
SELECT * FROM t_conversion_ip where networkIp = #{networkIp};
</select>
<select id="getNetworkIp" parameterType="java.lang.String" resultType="com.mobisys.monitorcenter.videoConference.domain.IPInfo">
SELECT * FROM t_conversion_ip where publicIp = #{publicIp};
</select>
<insert id="addIp" parameterType="com.mobisys.monitorcenter.videoConference.domain.IPInfo">
INSERT INTO t_conversion_ip (publicIp,networkIp) VALUES (#{publicIp},#{networkIp});
</insert>
<delete id="deleteIp" parameterType="java.lang.String">
DELETE FROM t_conversion_ip WHERE networkIp = #{networkIp};
</delete>
<update id="updateIp" parameterType="com.mobisys.monitorcenter.videoConference.domain.IPInfo">
UPDATE t_conversion_ip SET
publicIp = #{publicIp}
WHERE networkIp = #{networkIp}
</update>
1.4 IPInfo类
该类中有私有属性publicIp、networkIp和id,这三个属性的set、get函数以及带参和不带参函数。
该类作用是用于在数据库操作中将公网和内网IP属性封装在一个对象中。
1.5 VideoIpService接口
接口说明:根据上面数据库操作所编写的对应的方法。
函数说明 | 参数说明 | 返回值说明 |
---|---|---|
boolean isPublicIpExists(String publicIp); | publicIp指定公网IP | 存在返回1,反之为0 |
boolean isNetworkIpExists(String networkIp); | networkIp指定内网IP | 灿在返回1,反之为0 |
IPInfo getPublicIp(String networkIp); | networkIp指定内网ip查公网ip | 返回一个IPInfo对象,属性为查询结果 |
IPInfo getNetworkIp(String publicIp); | publicIp指定公网ip查内网ip | 返回一个IPInfo对象,属性为查询结果 |
int addIp(IPInfo ipInfo); | 将IPInfo对象的属性值存入数据库中 | 成功插入返回1,反之为0 |
int deleteIp(String networkIp); | 根据指定networkIp删除记录 | 成功删除返回1,反之为0 |
int updateIp(IPInfo ipInfo); | 根据指定IPInfo对象更新记录 | 成功更新返回1,反之为0 |
1.6VideoIpServiceImpl实现类
根据配置文件中的数据库操作id,实现对数据库的操作。
示例代码:
@Repository
public class VideoIpServiceImpl implements VideoIpService {
@Autowired
private MonitorCenterDBSession monitorCenterDBSession;
@Override
public boolean isPublicIpExists(String publicIp) {
return monitorCenterDBSession.get(this.getClass().getPackage().getName(),
"isPublicIpExists",publicIp);
}
@Override
public boolean isNetworkIpExists(String networkIp) {
return monitorCenterDBSession.get(this.getClass().getPackage().getName(),
"isNetworkIpExists",networkIp);
}
@Override
public IPInfo getPublicIp(String networkIp) {
return monitorCenterDBSession.get(this.getClass().getPackage().getName(),
"getPublicIp",networkIp);
}
@Override
public IPInfo getNetworkIp(String publicIp) {
return monitorCenterDBSession.get(this.getClass().getPackage().getName(),
"getNetworkIp",publicIp);
}
@Override
public int addIp(IPInfo ipInfo) {
return monitorCenterDBSession.insert(this.getClass().getPackage().getName(),
"addIp",ipInfo);
}
@Override
public int deleteIp(String networkIp) {
return monitorCenterDBSession.delete(this.getClass().getPackage().getName(),
"deleteIp",networkIp);
}
@Override
public int updateIp(IPInfo ipInfo) {
return monitorCenterDBSession.update(this.getClass().getPackage().getName(),
"updateIp",ipInfo);
}
}
1.7 IPController
1.7.1 查询公网IP
注解@GetMapping获取网页上获取的内网IP,作为参数传给VideoIpService实现类中的isNetworkIpExists以校验数据库中是否有此条IP,若有则查询该内网IP对应的公网IP,并作为结果返回,没有返回“没有此项IP记录,查询失败”的失败信息。这里使用RespBeanFactory静态方法表示操作的结果。
@ApiOperation(value = "查询公网IP")
@GetMapping(value = "/api/v1/videoConference/IP/getPublicIP/{networkIP}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseRespBean getPublicIP(@PathVariable String networkIP){
if (videoIpService.isNetworkIpExists(networkIP)){
return RespBeanFactory.succeed(videoIpService.getPublicIp(networkIP));
}
return RespBeanFactory.fail("没有此项IP记录,查询失败");
}
1.7.2 查询内网IP
查询内网IP与1.7.1查询公网IP相似。
@ApiOperation(value = "查询内网IP")
@GetMapping(value = "/api/v1/videoConference/IP/getNetworkIP/{publicIP}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseRespBean getNetworkIP(@PathVariable String publicIP){
if (videoIpService.isPublicIpExists(publicIP)){
return RespBeanFactory.succeed(videoIpService.getNetworkIp(publicIP));
}
return RespBeanFactory.fail("没有此项IP记录,查询失败");
}
1.7.3 增加记录
该方法将网页上的信息包装成一个IPInfo对象传给VideoIpService实现类中的insertIP函数,然后检查数据库中是否已存在该IPInfo对象中的数据信息,若存在则返回“IP冲突”的错误信息,不存在,则将该IPInfo对象中的属性插入数据库中。
@ApiOperation(value = "增加记录")
@PutMapping(value = "api/v1/videoConference/IP/insertIP", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseRespBean insertIP(@RequestBody IPInfo ipInfo){
if(videoIpService.isPublicIpExists(ipInfo.getPublicIp()) ||
videoIpService.isNetworkIpExists(ipInfo.getNetworkIp())){
return RespBeanFactory.error(BaseRespBean.CodeHolder.CODE_TENANT_NAME_ALREADY_EXIST,
"IP冲突");
}
int flag = videoIpService.addIp(ipInfo);
if (flag == 1){
return RespBeanFactory.succeed(null);
}else {
return RespBeanFactory.fail("添加IP记录失败");
}
}
1.7.4 更新记录
在网页上获取需要更新的IPInfo对象,先检查该对象的属性是否存在,若不存在,则返回“内网IP不存在”的错误信息,若存在,则根据内网ip更新对应公网ip,最后返回is护具库操作的结果。
@ApiOperation(value = "更新记录")
@PostMapping(value = "api/v1/videoConference/IP/postIP", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseRespBean postIP(@RequestBody IPInfo ipInfo){
if(!videoIpService.isNetworkIpExists(ipInfo.getNetworkIp())){
return RespBeanFactory.error(BaseRespBean.CodeHolder.CODE_TENANT_NAME_ALREADY_EXIST,
"内网IP不存在");
}
int flag = videoIpService.updateIp(ipInfo);
if (flag == 1){
return RespBeanFactory.succeed(null);
}else {
return RespBeanFactory.fail("修改IP记录失败");
}
}
1.7.5 删除记录
获取网页中需要删除的内网IP,首先在数据库中查询是否存在该内网ip,若存在则将内网ip对应的记录从数据库中删除,若不存在,就返回“没有此项IP记录,删除失败”的错误信息。
@ApiOperation(value = "删除记录")
@DeleteMapping(value = "api/v1/videoConference/IP/deleteIP/{networkIp}",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseRespBean deleteIP(@PathVariable String networkIp){
if(videoIpService.isNetworkIpExists(networkIp)){
int flag = videoIpService.deleteIp(networkIp);
if (flag == 1){
return RespBeanFactory.succeed(null);
}
}
return RespBeanFactory.fail("没有此项IP记录,删除失败");
}