0%

前言

最近在改一个老项目的时候遇到了一个问题,有一个页面需要多选,点击某按钮时需要获取到表格中多选的行,配置都正常,但是始终只能获取到一行数据,下面记录下问题解决过程

解决

首先table如果需要多选,需要配置singleSelect: false,多选属性,还有一个idField 属性,至少需要这两个属性

获取多选数据方法

1
$('#product_table').datagrid('getSelections');

getSelections是固定的,#product_table是table的ID,我检查了下这些都是正常的,多选后打印了以上数据,返回的只有1行数据,所以感觉还是哪配置的问题

关键

查了一通后,发现idField这个属性配置的有误,因为是从其他页面拷过来的,这个接口中没有这个属性!

这个属性的意思是用来标识一行的唯一ID值,所以要多选的话,列表数据中一定要有唯一ID,**idField也一定要配置正确**,否则就是给自己挖坑,这个错误真的很难找

前言

项目中很多时候会遇到需要组装树形,便于前端展示,比如部门人员树,空间设备树等等,我们如果自己写的话比较麻烦,还容易出问题,所以我一般使用hutool工具中的一个treeutil工具类

问题

这个工具类比较好用,但是使用时一定要注意,ID绝对不能重复,否则就会遇到明明我写的没问题,但是返回的树中就是没有这条数据

不过ID重复的情况一般出现在需要两个表中的数据来组装树,这样如果你的主键是自增的,就肯定会出现ID重复的问题,如果组装数据只需要一个表,那就没啥问题

比如部门表中有ID为1的数据,人员表中又有ID为1的数据,如果这样塞到TreeUtil中去,你会发现没有ID为1的部门,这个问题我遇到了好几次,但是间隔比较久,所以解决一次后,后面再遇到的时候发现又忘了,又想了很久,各种断点查看数据,查了好久才发现是ID重复,是个比较坑的一点,也是非常不容易找到的问题

结果

所以一定要注意,如果从两个表中取数据组装树,ID千万不能重复, ID千万不能重复, ID千万不能重复,重要的事情说三表

前言

​ 公司的业务方向是智慧园区,园区内有很多很多的底层系统,所以我们要做的大部分事情就是系统集成,在系统集成的过程中遇到了一些比较有意思的事情,下面记录一下

经验

一般像安防这样大厂家系统技术都比较新,对外提供的接口比较完善,比如安防中的海康、商汤等,但是一些比较小的厂家或者更偏底层的厂家,比如集控、消防、BA、门禁等系统,一般用的技术比较老套,可能是.net、C等底层语言,对外提供的接口也没有那么的完善,所以调试过程中遇到了一些奇怪的问题

问题

1、传参格式一定要对,比如对方文档中写的参数格式是int数组就一定要传int数组,千万不要传string数组

​ 在对接某个厂商的门禁系统时,对方提供的是http协议的接口,参数中有一个数组参数,比如授权的接口中,参数中有个门禁ID列表,一般我们传参就是这样的[1,2,3]或者['1', '2', '3'],因为设备我们是同步过来的,所以库中设计的这个ID字段是字符类型,所以传参时也自然用了后面这种字符数组的形式,然后奇怪的问题就来了,对方的授权接口提示成功,但是始终查不到这个人的授权,因为接口中不止这一个参数,还有三五个其他参数,都按着文档对了一遍,发现确实没有问题啊!所以一度以为是对方系统的接口有问题,所以找了下厂商,厂商提供了他们的一个测试软件,能测试他们的接口,在软件中也能看到传参和返回参数,试了一下之后,我挨着对照参数,返现参数名、参数个数是一致的,所以又对了一下value,因为授权的同一个人和同一个门,所以传参应该是一致的,最终发现门禁ID列表传参格式不一致,他们的软件里是用的第一种,int型的数组,而我用的是字符数组,按照我们java中,其实无论你怎么传,后面系统会自动转换为你要的类型,但是一些底层语言没有那么强大,会严格校验类型,所以改为int数组后发现一切正常!

所以一定要注意这点,参数格式一定要正确

前言

最近用tomcat部署一个老项目(前后端不分离的那种)时,遇到了一个跨域问题,项目部署在外网服务器,有一个功能需要调用本地访问电脑的一个服务接口,所以触发了tomcat的同源策略

解决

1、需要两个jar包,将两个jar包放到tomcat文件夹下的lib文件夹里

2、在web.xmlweb-app节点下加入如下配置

1
2
3
4
5
6
7
8
9
10
11
12
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

完事了,重启下tomcat试试吧

前言

最近在折腾一个网关,系统是国产龙芯系统,但是也是基于linux系统的,最终使用时需要设置双IP,说实话还真是头一次听说单网卡能设置双IP,是我孤陋寡闻了,下面具体记录一下吧

过程

一开始用的ifconfig命令配置的多IP,命令如下

1
ifconfig eth0:0 192.168.1.1 netmask 255.255.255.0 # eth:0 可以单网卡配置多IP

但是这个命令在系统重启后就会失效,所以这个命令临时测试用一下可以,上生产不太行,所以继续研究下改配置文件

配置文件在这vim /etc/network/interfaces,具体命令如下

1
2
3
4
5
6
7
8
9
auto eth0:1
iface eth0:1 inet static
address 192.168.7.20
netmask 255.255.255.0

auto eth0:2
iface eth0:2 inet static
address 10.10.15.1
netmask 255.255.255.0

更多的IP的话就是类似的在后面加,完整的配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
source /etc/network/interfaces.d/*
# Network is managed by Network manager
auto eth0

#iface eth0 inet dhcp

iface eth0 inet static
address 192.168.6.22
netmask 255.255.255.0

auto eth0:1
iface eth0:1 inet static
address 192.168.7.20
netmask 255.255.255.0

auto eth0:2
iface eth0:2 inet static
address 10.10.15.1
netmask 255.255.255.0


auto lo
iface lo inet loopback

配置完成后,重启reboot使其生效

前言

最近写项目时遇到一个需求,就是定时任务能不能改成可配置的,只是简单的一个定时任务,不想用xxljob、quartz等这些定时任务框架,没有这个必要,所以取舍下,只要能从配置文件读取就行了

实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
@Component()

//假如项目已经引入的配置文件, 则不需要@PropertySource注解配置
//@PropertySource(value = "classpath:application.yml")
public class MyJob {

//如果获取不到, 取冒号后面的默认值
@Scheduled(cron = "${jobs.sendGasJob.corn:0/10 * * * * ?}")
public void execute() {

}

}

application.yml

1
2
3
jobs:
sendGasJob:
corn: "0/15 * * * * ?"

看起来是不是很简单

前言

最近在学习vue3的东西,需要从子组件传递内容到父组件,了解到了emit,和v2稍微有点区别,所以下面记录下

学习

父组件中

①定义函数
②使用子组件时使用该函数

1
2
3
const fatherFn = (参数:接收子组件传递的数据) =>{
函数体...
}
1
<Child @fatherFn ="fatherFn" />

子组件

①子组件引入defineEmits
②赋值给emit
③触发

1
2
3
4
import {  defineEmits} from 'vue';
const emit = defineEmits(['fatherFn']);
//触发
emit('fatherFn ', {参数:传递给父组件的数据});

vue3中去掉了this,所以稍微和vue2有点区别,我使用<script setup>这种语法

前言

最近在维护老项目的过程中,遇到了个问题,前端使用的easy-ui的组件,需要使用一个输入库可以下拉,可以搜索的功能,所以使用了combobox这个组件,但是使用过程中发了个问题,就是我输入的字它居然当成了一个选项,导致出现各种问题

了解combobox

组合框(combobox)显示一个可编辑的文本框和下拉列表,用户可以从下拉列表中选择一个或多个值。用户可以直接输入文本到列表的顶部,或者从列表中选择一个或多个现成的值,具体使用方式参考

参考了官方的demo,发现官方demo也存在一样的问题,看来只能自己动手解决了,解决之前先来简单了解下combobox这个组件的常用方法和事件

setValues
1
$("#type").combobox('setValues', [1,2])

其中’setValues’是方法名,第二个是数组参数。还有单数形式的setValue,是设置单个值的,我们这里是多选,所以这个不赘述

getValues

获取当前选中的所有项,返回是个id的数组

1
$("#type").combobox("getValues")
getData

获取当前下拉框中的所有项

1
$("#type").combobox("getData")
onSelect()

选中事件,只有下拉框中选中某项时,才会触发

1
2
3
4
5
$("#iUserNameTree").combobox({
onSelect: function (n) {
...
}
});

n是当前选中的那一项,是个object的,其中有id,有value

需要注意的是,只是选中,反选不是用这个,反选用unselect,还有就是在事件里如果调用 getValues的话,是获取不到本次选中的那条的,因为select事件是选中的那瞬间调用的

onChange()

改变事件,下拉框选中后触发事件,特别注意,输入框中输入的文字也会触发该事件,使用方式如下

1
2
3
4
5
$("#iUserNameTree").combobox({
onChange: function (newValue, oldValue) {
...
}
});

其中newValue是选中或输入后最新的数组,oldValue是上次的数组,这里的数组里仅仅是ID的数组,且这个事件是在改变后调用的,所以如果在这个事件里调用gatData是可以获取到最新的选中的数组的

思路

我试下下setvalues方法,可以改变输入框里的选项,可以把输入的那个替换掉!所以我的思路时,比如我输入了一个王,搜索到我要的数据后,选中了其中一个,这时首先会调用select事件,其次调用change事件,我需要在选中后的change事件里做下处理,判断下oldValue数组中最后一个是我输入的还是选中的,如果是输入的,就把它删掉,重新setvalues一下,就可以了

结语

这样可能还是有点问题的,因为我判断是输入的还是选中的,仅仅是查询data中是否包含这个id,所以如果输入数字查询,正好又包含这个,那就无法去除了,但是一般情况够用了,不过现在这个时代了,这种项目其实早应该淘汰了,别太纠结,一句话,能用就行

前言

缓存在项目上特别常见,但是一定要正确使用,否则不但不省事,还会制造一堆的麻烦,下面记录下我在Android上一次问题

详细

很久之前接手的一个Android项目,每次每个接口请求都需要上传本机的mac地址,可能是之前的开发者觉得每次都是现获取mac地址会比较费时,所以首次获取到后缓存到了sp文件里,之后每次都是从sp文件中读取!

之前的mac地址获取的是wifi的mac地址,但是现场用的是网线,一开始并没有太关注这个事情,因为mac地址也只是用来后台校验是否存在这台设备,但是因为客户是银行方,所以任何接入网络的设备都要报备mac地址,一开始我也没有在意,因为我想mac地址就只有这一个吧,所以把wifi的这个地址报上去了,但是一直无法连接网络,那边运维的人查出来这个mac地址和报备的并不一样!

后来我才知道用的是网口,所以是另一个mac地址,需要获取eh0的mac地址,但是之前获取wifi的mac地址的方式已经安装到现场了,后面虽然更新了获取mac地址的方式,但是因为更新程序的时候并没有卸载,直接安装的,所以导致之前的mac地址一直被缓存在机器上,用的也一直是错误的mac地址!

后来过了N久,程序要更新,但是这次被卸载了更新的,所以导致mac地址变了真实的,还好还在测试中,并没有直接使用,否则又是一件严重的事故

后记

所以缓存一定要谨慎使用,像上面的问题解决方案也很多,比如更新版本后,做个版本缓存的检测,发现更新后,看看哪些数据需要清空重新获取,其实像上面的获取mac地址并不需要缓存,这个也不是耗时操作,还是直接获取的妥当

前言

如题所示,sqlserver在进行sum运算时发生了这个错误,因为是在程序里运行的,一开始以为是实体类里字段是int类型的问题,但是改为Long型后还是一样的问题,后来直接执行sql语句发现是一样的报错,下面记录下解决方案

解决

sql语句如下

1
select sum(a) as a from user group by a

a是int类型,一般情况下int是够了,但是数据量较大时,会超过int的最大值,所以如果没法改表中字段的类型的话,那就再sql里直接cast转换

1
select sum(cast(a as bigint)) as a from user group by a

如上,cast转换为bigint即可