1.Tabs 标签页
参考:https://element.eleme.cn/#/zh-CN/component/tabs#tab-pane-attributes
<el-tabs v-model="activeName" type="card" @tab-click="tabsClick" :closable="true" @tab-remove="tabsRemove">
<el-tab-pane v-for="(item,index) in examList" :key="index" :examId="item.id" :name="item.groupName" class="yw-tab" :closable="false">
<el-tooltip slot="label" effect="dark" :content="item.groupName" placement="bottom-start">
<span class="tmp">{{ item.groupName }}</span>
</el-tooltip>
</el-tab-pane>
</el-tabs>
v-model=“activeName”:默认选中值 选中的值等于 :name=“item.groupName”
参考:https://jingyan.baidu.com/article/fb48e8be550e0f2f632e1424.html
:examId=“item.id” :点击切换事件(tabsClick)取值:tabsClick(tab, event){let examId=tab.$attrs.examId;}
el-tooltip:鼠标移入提示内容
//tab切换点击事件
tabsClick(tab, event) {
let value = tab.$attrs.tabValue;
},
//删除部门
tabsRemove(tab){
this.KaTeX parse error: Expected '}', got 'EOF' at end of input: … this.message({
type: ‘success’,
message: ‘删除成功!’
});
this.yearChange();
})
}
})
}).catch(() => {
this.$message({
type: ‘info’,
message: ‘已取消删除’
});
});
},
2.日期控件
年:type=“year”,月:type=“month”,周:type=“week”;value-format日期格式化为string类型,默认是date类型
3.let 定义的变量可以实现同步
4.Java中把一个对象复制给另外一个对象
BeanUtils.copyProperties
org.springframework.beans.BeanUtils.copyProperties(Object source, Object target)
org.apache.commons.beanutils.BeanUtils.copyProperties(Object dest, Object orig)
5.vue splice删除
(1)删除普通数组
let arr = [1,2,3,4,5];
//方法一
let index = arr.indexOf(‘3’);
arr.splice(index, 1)
//打印结果 [1,2,4,5]
//方法二
let index = arr .findIndex(item => {
if (item == ‘3’) {
return true
}
})
arr.splice(index, 1)
//打印结果 [1,2,4,5]
(2)删除数组对象
let arr = [
{
id:1,
name:‘张三’
},
{
id:2,
name:‘李四’
},
{
id:3,
name:‘王二’
},
{
id:4,
name:‘麻子’
},
];
let id1 = arr.findIndex(item => {
if (item.id == ‘3’) {
return true
}
})
arr.splice(id1, 1)
6.动态添加及绑定数据
{{scope.row[i.typeName]}}
return {
typeNames:[
{
typeLabel:“”,
typeName:“”,
},
{
typeLabel:“”,
typeName:“”,
}
],
peopleList:[{
“typeName1”: 0,
“typeName2”: 0,
“typeName3”: 0,
“children”: [{
“children”: [{
“children”: null,
“name”: “人家看”,
“pid”: “1594135395547590658”,
“id”: “1594135487960690690”
}], “name”: “他和他”, “pid”: “1594135349984866306”, “id”: “1594135395547590658”
}],
“typeName0”: 0,
“name”: “环境”,
“id”: “1594135349984866306”
}, {
“typeName1”: 0,
“typeName2”: 0,
“typeName3”: 0,
“children”: [{
“children”: [{
“children”: null,
“name”: “江湖经验”,
“pid”: “1594135583796342786”,
“id”: “1594135678281428993”
}], “name”: “没有很好”, “pid”: “1594135546508980225”, “id”: “1594135583796342786”
}],
“typeName0”: 0,
“name”: “不规范”,
“id”: “1594135546508980225”
}],
}
7.Vue 强制刷新(重新渲染)的方式
https://blog.csdn.net/LonewoIf/article/details/126176039
a.强制刷新整个页面
b.使用v-if
c.使用组件内置的forceUpdate方法
this.$forceUpdate();
d.使用key-changing优化组件
8.vue 异步请求,dataChange()method 下
async dataChange(){
await this.dataJsHx(this.dataForm.peopleList);
await this.dataJsCx(this.dataForm.peopleList,2);
await this.dataJsCx(this.dataForm.peopleList,1);
await this.$forceUpdate();
},
9.elementUI table组件 合计方法
<el-table
show-summary
:summary-method=“getSummaries”
getSummaries(param) {
const { columns, data } = param;
console.log(columns, data, “columns,data”);
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = “总价”;
return;
}
const values = data.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
// sums[index] = values.reduce((prev, curr) => {
sums[2] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
// sums[index] += " 元";
sums[2] += " 元";
} else {
sums[index] = “N/A”;
}
});
return sums;
}
10.setTimeout用法,等待指定秒数再执行
setTimeout(() => {
this.$router.push({path: “/Map_MainPage”}); // 强制切换当前路由 path
loading.close();
}, 8000);
11.Vue判断字符串(或数组)中是否包含某个元素的多种方法
参考: https://www.jb51.net/article/261891.htm
方法一:includes方法(数组,字符串都可以)
var str = “Hello World!”;
if(str.includes(“World”)){
}
let animals = [“cat”, “dog”, “pig”, “deer”]
animals.includes(“deer”) // true
animals.includes(“horse”) // false
方法二:indexOf方法(数组,字符串都可以)
var str = “Hello World!”;
//注意:!=-1即为为真,可以找到得情况
if(str.indexOf(“World”) != -1){
}
let grades = [“A”, “B”, “C”, “D”]
grades.indexOf(“A”) // 0
grades.indexOf(“F”) // -1
12.element ui 嵌套表头固定列处理,嵌套最外层加上 fixed ,最外层的宽度等于内层的宽度之和
13.mybatis级联查询,子级/下级查询
(1)一对一查询(association)
public class Classes{
@TableId
@ApiModelProperty(value="主键")
private Long id;
@ApiModelProperty(value="创建人")
private String name;
@TableField(exist = false)
private Teacher teacher;
}
select * from class SELECT id, name FROM teacher WHERE id=#{tid}(2)一对多查询,column="{tid=teacher_id,cname=name}"多个参数
@TableField(exist = false)
private List teachers;
14.MyBatis之ResultMap的association和collection标签详解
https://baijiahao.baidu.com/s?id=1716816164888664887&wfr=spider&for=pc
15.MyBatis之ResultMap的extends用法
在mybatiss的xml文件中,用< resultMap>指定父类的标签后,要在指定一个子类标签,全部重写一遍太麻烦类,mybatis提供了更简单的做法
使用resulMap的extends
function fun1(){
return new Promise((resolve, reject) => {
/* 你的逻辑代码 /
console.log(“1”);
});
},
function fun2(){
return new Promise((resolve, reject) => {
/ 你的逻辑代码 /
console.log(“2”);
});
},
function fun3(){
return new Promise((resolve, reject) => {
/ 你的逻辑代码 /
console.log(“3”);
});
},
/ 调用 /
function run(){
Promise.all([
this.fun1(),
this.fun2(),
this.fun3()
]).then(res => {
/ 你的逻辑代码 */
console.log(“run”);
})
}
原文链接:https://blog.csdn.net/dylansun/article/details/109225470
17.vue页面引入另一个页面
import infoReport from ‘…/informationbuildreport/index.vue’;
components: {
infoReport
},
18.Vue: 字符串、数组之间的相互转换
(1)数组转字符串 join()
var authority= [‘1’,‘2’];
let permission = authority.join(“,”);
console.log(permission )//1,2
(2)字符串转数组 split()
var a=‘1,2’
a.split(‘,’)
console.log(a)// [“1”, “2”]
19.样式
data(){
return{
CS: {
‘text-align’: ‘center’, //文本居中
‘min-width’: ‘250px’, //最小宽度
‘word-break’: ‘break-all’ //过长时自动换行
},
LS: {
‘color’: ‘#000’,
‘text-align’: ‘center’,
‘font-weight’: ‘600’,
‘height’: ‘40px’,
‘background-color’: ‘rgba(255, 97, 2, 0.1)’,
‘min-width’: ‘110px’,
‘word-break’: ‘keep-all’
}
CS: {
'width': '15%',
'text-align':'center'
},
LS: {
'width': '10%',
'text-align':'center'
},
}
}
20.:show-overflow-tooltip=“true” 样式,scoped无效
.el-tooltip__popper {
max-width: 600px;
}
21.element表单验证如何清除校验提示语
(1). 对字段进行单独校验
this.
r
e
f
s
.
d
a
t
a
F
o
r
m
.
v
a
l
i
d
a
t
e
F
i
e
l
d
(
′
p
r
o
t
o
c
o
l
I
d
′
,
(
v
a
l
i
d
)
=
>
/
/
v
a
l
i
d
返回的是规则集中写的错误提示信息,如果满足条件,返回的就是空
i
f
(
!
v
a
l
i
d
)
r
e
t
u
r
n
)
上面这段代码可以放在确认数据选择的函数中执行,这样就对这一项特殊的内容再次进行了校验,如果符合检验规则,错误提示就是消失了。
(
2
)
.
直接清除表单域下该字段的提示信息
t
h
i
s
.
refs.dataForm.validateField('protocolId', (valid) => { //valid返回的是规则集中写的错误提示信息,如果满足条件,返回的就是空 if(!valid){ return } }) 上面这段代码可以放在确认数据选择的函数中执行,这样就对这一项特殊的内容再次进行了校验,如果符合检验规则,错误提示就是消失了。 (2). 直接清除表单域下该字段的提示信息 this.
refs.dataForm.validateField(′protocolId′,(valid)=>//valid返回的是规则集中写的错误提示信息,如果满足条件,返回的就是空if(!valid)return)上面这段代码可以放在确认数据选择的函数中执行,这样就对这一项特殊的内容再次进行了校验,如果符合检验规则,错误提示就是消失了。(2).直接清除表单域下该字段的提示信息this.refs.dataForm.clearValidate();
this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …() => { this.refs.dataForm.clearValidate();
})
这个方法就是直接清除错误信息,不做任何判断,个人不是太推荐使用
22.elementui的表格在使用v-if之后列的顺序错乱问题
一,原因
出现错乱的条件有两个
1、el-table-column的template中使用 slot-scope=“scope”
2、el-table-column中使用 v-if=“…”
二,解决办法
给每个列增加一个独一无二的key就可以了
23.vue+elementUI项目,父组件向子组件传值,子组件向父组件传值,父子组件互相传值。
https://www.cnblogs.com/hao-1234-1234/p/10157063.html
vue 父组件与子组件相互通信
一、父组件给子组件传值
props 实现父组件向子组件传值。
1父组件里:
msg是绑定的自定义属性,类似我们原生html 给标签自定义属性一样,Widget是传输变量
<script >
import childpack from './childPack.vue' //引用子组件
export default{
name: 'FatherPack',
components: { childpack },
data(){
return(){
myMsg:‘我是父组件参数’
}
},
mothods:{
showMessageFromChild(val){
}
}
}
</script>
2子组件里:
<div>
<span>{{msg}}</span>
</div>
<script>
export default {
name: 'ChildPack',
props:["msg"]
//也可以指定默认类型和默认值
props: {
msg: {
type: Number,
default: 0
}
},
isPublic: {
type: Boolean,
default: undefined //注意!对于布尔类型,默认值不要写成false,否则isPublic永远为false。
}
arr: {
type: [],
default: undefined //数组
}
}
data(){
},
created() {
console.log('child_msg',this.msg)
},
mothods:{
},
}
</script>
二、子组件传值到父组件
this.$emit() 实现子组件向父组件传值。
1在子组件里:
export default{
methods: {
changeFather(){
this.KaTeX parse error: Expected 'EOF', got '}' at position 50: …数"); }̲, //可以传…emit(“listenTochildEvent”,pms);
// },
} }
2在父组件:定义事件listenTochildEvent,并实现showMessageFromChild方法,接收父组件传递来的参数。
<child-pack :msg ="myMsg" v-on:listenTochildEvent="showMessageFromChild"></child-pack>
<script >
import childpack from './childPack.vue' //引用子组件
export default{
name: 'FatherPack',
components: { childpack },
data(){
return(){
myMsg:‘我是父组件参数’
}
},
mothods:{
showMessageFromChild(data){
console.log(data);
}
}
</script>
三、将一、二 一起使用就是可以实现父子组件互相传值。
24.and、or的用法 or查询
// WHERE xxxx!=id And ( xxxx=ANo or xxxx=BNo)
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.ne(Project::getId,project.getId());
queryWrapper.and((wrapper)->{
wrapper.eq(Project::getANo,project.getBillNo())
.or().eq(Project::getBNo,project.getBillNo());
});
25.只能输入正整数
https://www.jb51.net/article/267545.htm
正整数:min=“0” onKeypress=“return (/[\d]/.test(String.fromCharCode(event.keyCode || event.which))) || event.which === 8”
正数:οnkeypress=“return (/[\d.]/.test(String.fromCharCode(event.keyCode || event.which))) || event.which === 8;”
26.el-input__inner样式不生效问题,解决scoped样式不生效问题
https://blog.csdn.net/github_39333092/article/details/124441143
方法1
父组件的 scoped 样式不能穿透到子组件上。
使用 /deep/ 或者 >>> 解决
/deep/.el-input__inner {
color: black;
}
1
2
3
方法2
在vue中,把style的scoped去掉就可以了。跟作用域有关
但这种方法不可取,把scoped去掉,其他页面的有这个类的话,也会跟着改。
方法3
重新定义一个类名,然后再写样式
.inputColorBlack{
.el-input__inner {
color: black;
}
}
26.使用Feign调用服务接口
https://blog.csdn.net/qq_38066812/article/details/112187144
27.mapper.xml多个实体写法
public interface SecrecyTargetMapper extends GheronBaseMapper {
Page<SecrecyTarget> getSecrecyTargetPage(Page<SecrecyTarget> iPage,@Param("secrecyTarget") SecrecyTarget secrecyTarget);
SELECT FROM bgs_secrecy_target a a.del_flag != '1' and a.title like concat('%',#{secrecyTarget.title},'%') order by a.sort ASC
</select>
28.el-tree 默认选中
<el-tree ref=“tree” node-key=“id”
//默认选中
this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …() => { this.refs.tree.setCurrentKey(item.id);
})
参考:https://element.eleme.io/#/zh-CN/component/tree#scoped-slot
29.Mybatis in 条件传参三种实现方法(直接$,List,[])
第一种方法:in 条件为拼接好的字符串
如果直接传入拼接好的where in 条件, 比如(‘111’,‘222’,‘333’),则需要使用${idlist}传参,即绝对引用,而不能使用#
, 如果使用#传参会被mybatis当成字符串再添加一层’'引号,导致错误.
优点:简单方便,高效,缺点:不能防止SQL注入
第二种方法:in 条件为List对象
in条件直接传入List对象,让mybatis再去拼接生成in条件,可以防止SQL注入
第三种方法:in 条件为String[] 数组
in条件直接传入[]数组对象,让mybatis再去拼接生成in条件,可以防止SQL注入
原文链接:https://blog.csdn.net/wh445306/article/details/111056331
(1)int deleteMenuByIdList(@Param(“idlist”)String idlist)
delete from s_menu where menu_id in ${idlist};
update s_menu set sort=sort-#{delcount} where sort >= #{lastsort} and menu_id not in ${idlist};
(2)int deleteMenuByIdList2(@Param(“idlist”)List idlist)
delete from s_menu where menu_id in
#{menu_id}
;update s_menu set sort=sort-#{delcount} where sort >= #{lastsort} and menu_id not in
#{menu_id}
;
(3)int deleteMenuByIdList3(@Param(“idlist”)String[] idlist)
delete from s_menu where menu_id in
#{menu_id}
;update s_menu set sort=sort-#{delcount} where sort >= #{lastsort} and menu_id not in
#{menu_id}
;
30.lt、le、eq、ne、ge、gt符号的含义
lt: less than 小于
le: less than or equal to 小于等于
eq: equal to 等于
ne: not equal to 不等于
ge: greater than or equal to 大于等于
gt: greater than 大于
31.在Vue中为什么v-for一定要加key
https://blog.csdn.net/cmdfas/article/details/121258361
Vue可以通过key这种方式来观察数组或者对象中的数据哪些正发生变化。v-for默认是通过index索引来追踪变化,
所以上面我通过将index作为索引的做法是多余的,尽管它解决了ESLint的错误。通过追踪index索引,Vue观测列表中的项目的顺序变化,
并在顺序发生变化时,就地修改每个项目。Vue文档中指出,“这个默认的模式是高效的”,但也指出并不适合所有的情况。
像Vue文档所说的那样,我们要尽可能使用数据的唯一ID来做每个元素的key,这样 Vue 可以更准确地追踪数组中项目的更改并更新组件状态,
并且能够重用和重新排序现有组件,而不必重新渲染整个循环。
32.element-ui中的input的事件中传递参数,val是输入时的值
@input=“((val)=>{scope.row.ownGrade=scoreChange(val,scope.row.weightGrade)})”
scoreChange(val,weightGrade){
if (val>weightGrade){
return weightGrade;
}
return val;
}
33.Collectors详解
https://blog.csdn.net/qq_37557563/article/details/110131996
https://blog.csdn.net/llianlianpay/article/details/119744393
34.java9的of方法
jdk9的新特性
List接口,Set接口,Map接口:里面增加了一个静态的方法of,可以给集合一次性添加多个元素
使用前提:
当集合中存储的元素个数已经确定了,不再改变时使用。
注意:
1.of方法只适用于List接口,Set接口,Map接口,不适用于接口的实现类
2.of方法的返回值是一个不能改变的集合,集合不能再使用add,put方法添加元素,会抛出异常
3.Set接口和Map接口在调用of方法的时候,不能有重复的元素,否则会抛出异常
示例:
void test25() {
List strlist = List.of(“12”,“34”,“5”,“678”,“9”);
String str = strlist.stream().collect(Collectors.joining());
System.out.println(str);
String str1 = strlist.stream().collect(Collectors.joining(“,”));
System.out.println(str1);
}
35.Arrays.asList数组转集合
注:数组通过Arrays.asList转成集合后,是不能调用集合的add,remove方法的.不然会抛异常UnsupportedOperationException
解决办法:
Integer[] array = {1, 2};
// 通过Arrays转换成的List,保留了原本的类型
List list = Arrays.asList(array);
//list.add(1); 会报异常
System.out.println(list);
List objects = new ArrayList(list);
objects.add(3);
System.out.println(objects);
36.vue中关于切换选项卡渲染表格,导致表格内容错乱或者表格渲染不出来的问题
实例:
<el-table key="0"></el-table>
<el-table key="1"></el-table>
参考:https://www.codenong.com/cs106859848/
37.单独设置样式
<el-date-picker v-model=“dataForm.year” type=“year” @change=“yearChange” value-format=“yyyy” class=“yearClass”/>
.yearClass input.el-input__inner{
text-align: center;
}
参考:https://www.cnblogs.com/ygunoil/p/12364881.html
38.Long.valueof和Parselong的区别
Long.valueof(“12”):的返回类型是Long
Long.parseLong(“12”):的返回类型是long
但是选择Long.parseLong()也可以,因为java实现了自动装箱和拆箱功能,但是从性能上来说,还是比Long.valueof()直接返回Long类型来的慢一些.
39.result中的property可以去掉,对应class类不用写对应属性
<resultMap id="pdm" type="com.ghidri.gheron.zhtb.bgs.utils.PlanningDetailVo">
<result property="deptId" column="dept_id"/>
<result property="deptName" column="dept_name"/>
<result column="planning_work_id" />
<collection property="releaseList" column="{workId=planning_work_id,deptId=dept_id}" select="getByDeptId"/>
</resultMap>
40.MyBatis编写xml获取参数值的方式
MyBatis获取参数值的两种方式:${}和#{}
${}的本质就是字符串拼接,#{}的本质就是占位符赋值
${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
41.Element 表格固定列横向滚动条无法拖动的问题解决
/deep/ .el-table__body-wrapper{
z-index: 2
}
z-index:控制显示层级
参考:https://blog.csdn.net/lwzhang1101/article/details/126383185
<el-table :key="Math.random()"
42.vue element-ui el-table-column配合v-if 数据位置错乱问题 el-table-column 和 fixed搭配使用出现的错乱
问题:当我们对el-table的某一列进行判断显示隐藏时,就会出现列位置和表头样式错乱的问题
情况一:
我们通常的写法(会错乱的写法)
修正后的写法(不会错乱的写法)
虽然仍然会有一瞬间错乱样式,但是已经不影响数据的展示了
情况二:
el-table-column 和 fixed搭配使用出现的错乱的解决办法,在数据渲染完后使用官方提供的doLayout方法
// 在表格上加ref=‘table’
this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …(() => { this.refs.table.doLayout()
})
情况三:
el-tabs 切换导致 el-table-column 和 fixed搭配使用导致高度错乱
el-table-column 列加了fixed="right"操作后,从源码上来看,加入fixed之后这个列的高度是动态计算的,页面加了缓存,再次切换回来就会导致高度没有计算padding值所有会出现高度错乱的问题。
// 覆盖el-table__fixed-right 和 el-table__fixed的css 样式 (我这里是左右两边都固定了,根据实际情况处理即可)
.custom_table ::v-deep .el-table__fixed-right,
.custom_table::v-deep .el-table__fixed {
height: 100% !important;
}
原文链接:https://blog.csdn.net/qq_41287158/article/details/122857711
43.jdk去重
方式一、
List<User> intList = new ArrayList<>();
List<User> collect = intList
.stream()
.distinct().collect(Collectors.toList());
方法二、
List<User> intList = new ArrayList<>();
List<User> collect = userList.stream().collect(
Collectors.collectingAndThen(Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(User::getUserId))), ArrayList::new));
44.泛型传参写法
参考:
Java反射设置/获取对象属性值三种方式
Java反射如何获取字段属性值
(1)接口写法
//请求
List<FinanceDept> list = financeDeptService.selectDeptList(financeId);
List<FinanceDept> deptList =distributeUserService.getDeptList(list, "1000019,1000193,1000311,1000002");
//接口
<T> List<T> getDeptList( List<T> list, String authDept);
//接口实现类
@Override
public <T> List<T> getDeptList( List<T> list, String authDept){
String deptId = getDeptInfo().getDeptId();
if(authDept.contains(deptId)){
return list;
}
List<T> newList = new ArrayList<>();
try {
List<OrgGroupLeader> groupLeaderList =adapterBusAchiClient.getLeaderByUid(SecurityUtils.getUserId()).getData();
for (OrgGroupLeader leader : groupLeaderList) {
for (T t : list) {
//参考:https://m.jb51.net/article/254768.htm
Field field = t.getClass().getDeclaredField("deptId");//获取指定字段
field.setAccessible(true);//设置字段可访问,否则无法访问private修饰的变量值
Object obj = field.get(t);//获取字段值
if (obj.equals(leader.getOrgId())){
newList.add(t);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return newList.stream().distinct().collect(Collectors.toList());//去重
}
(2)方法写法
package com.aibe.util.jce;
import com.aibe.util.StringUtil;
import com.aibe.vo.Dvd;
import com.aibe.vo.NurseryTjVo;
import org.apache.poi.ss.formula.functions.T;
import org.apache.xml.security.utils.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.lang.reflect.Field;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author zw
*/
public class JceUtil {
public static void main(String[] args) {
List<Dvd> list=new ArrayList<>();
Dvd vo1=new Dvd();
vo1.setXzname("李四");
vo1.setContent("ffdd");
vo1.setContentDf("是的");
list.add(vo1);
Dvd vo2=new Dvd();
vo2.setXzname("的身份");
vo2.setContent("2233");
vo2.setContentDf("的食物");
list.add(vo2);
setJm(1,list,"xzname,content,contentDf");
System.out.println(22);
}
/**
* 集合加密解密
* @param type (1.加密,2.解密)
* @param list
* @param filedArr 一个或多个字段,逗号分隔
* @return
*/
public static List<?> setJm(int type, List<?> list, String filedArr){
try {
for (Object t : list) {
String[] arr = filedArr.split(",|,");
for (String fd : arr) {
Field field = t.getClass().getDeclaredField(fd);//获取指定字段
field.setAccessible(true);//设置字段可访问,否则无法访问private修饰的变量值
String content = field.get(t).toString();//获取字段值
field.set(t,"的服务");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
45.mysql查询类型转换问题
mysql存在两个转型的函数
CAST(字段名 as 需要转换的类型 )
CONVERT(字段名,需要转换的类型)。
支持转型的类型:
复制
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED
参考:https://blog.51cto.com/u_15242378/2849572
select * from main_enclosure where typeNumber = 13 and relation = CONVERT(1627584668293230595,char)
<select id="enclosureChild" resultType="com.ghidri.gheron.zhtb.enclosure.entity.Enclosure">
select * from main_enclosure where typeNumber=13 and relation=CONVERT(#{id},char)
</select>
46.校验数据集合是否填写完整
//数据校验--调用
let valid=true;
let taskNode=that.taskNode;
if (taskNode<=4) {
let msg=that.$refs.assignmentRef.dataListValidate(taskNode);
if (msg){
valid=false;
errorMsg='<strong>信息化系统名称:</strong><br/>'+msg+'<br/>';
let hzMsg='';
if (taskNode==0 || taskNode==1){
hzMsg="保全信息不完整,请继续填写完整";
}else if (taskNode==2){
hzMsg="请填写校核意见";
}else if (taskNode==3){
hzMsg="请填写审查意见";
}else{
hzMsg="请填写审批意见";
}
errorMsg+='<span style="color: red">'+hzMsg+'</span>';
}
}
if (!valid) {
that.$alert(errorMsg, '提示', {
dangerouslyUseHTMLString: true
});
}
//数据校验
dataListValidate(taskNode){
let msg="";
function fz(item) {
if (msg) msg += '<br/>';
msg += item.systemName;
}
this.dataList.forEach(item=>{
if (taskNode==0 ||taskNode==1){//任务书拟稿
if (!item.releaseTime
||!item.construction
||!item.manageTask
||!item.progressRequire
||!item.buildMode
||!item.buildContent
||!item.gisCenter
||!item.technicalManager
||!item.approvalResult)
{
fz(item);
}
}else if (taskNode==2){//校核
if (!item.jhOpinion){
fz(item);
}
}else if (taskNode==3){//审查
if (!item.scOpinion){
fz(item);
}
}else {//批准
if (!item.spOpinion){
fz(item);
}
}
})
return msg;
},
47.千分位方法工具类
/**
* 千分位方法
*/
public class MicrometerUtil {
/**
* 千分位方法
* @param obj
* @return
*/
public static Object fmtMicrometer(Object obj) {
if (obj==null || obj.equals("")){
return "";
}
String text=obj.toString();
DecimalFormat df = null;
if (text.indexOf(".") > 0) {
int i = text.length() - text.indexOf(".") - 1;
if (i == 0) {
df = new DecimalFormat("###,##0.");
} else if (i == 1) {
df = new DecimalFormat("###,##0.0");
} else {
df = new DecimalFormat("###,##0.00");
}
} else {
df = new DecimalFormat("###,##0");
}
double number = 0.0;
try {
number = Double.parseDouble(text);
} catch (Exception e) {
number = 0.0;
}
return df.format(number);
}
}
48.java field 赋值及取值
public void setLabels(List<T> list,String setVal,String getVal,String dictType){
List<SysDictItem> dictList = remoteDictService.getDictByType(dictType).getData();
try {
for (T t : list) {
Field field=t.getClass().getDeclaredField(getVal);//获取字典filed
Field field1=t.getClass().getDeclaredField(setVal);
field.setAccessible(true);//设置私有属性可以访问
field1.setAccessible(true);
Object val = field.get(t);//获取值
for (SysDictItem item : dictList) {
if (item.getValue().equals(val)){
//set值,赋值 set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值.
field1.set(t,item.getLabel());
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
注解赋值
@ExcelProperty("编码")
private String code;
@ExcelProperty("名称")
private String name;
//赋值
public void setVal(ManRecordExportVo2 t, String itemName, BigDecimal price){
try {
Field[] fields=t.getClass().getDeclaredFields();//获取字典filed
for (Field field : fields) {
field.setAccessible(true);//设置私有属性可以访问
Annotation[] declaredAnnotations = field.getDeclaredAnnotations();
for (Annotation annotation : declaredAnnotations) {
if(annotation instanceof ExcelProperty){
ExcelProperty myAnnotation = (ExcelProperty) annotation;
String vl = myAnnotation.value()[0];
if (itemName.contains(vl)){//与注解对应的值相等
Object val = field.get(t);//获取值
var je = new BigDecimal(val.toString()).add(price);
field.set(t,je);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
49.@RequiredArgsConstructor注解
一、RequiredArgsConstructor是什么?
Lombok中的一个@RequiredArgsConstructor,简化了一些@Autowired注解,可以减少@Autowired的书写,我们在写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@Autowired注解,代码看起来很繁琐。
二、使用步骤
1.引入依赖
org.projectlombok
lombok
2.使用方式
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/bsccheckassess")
@Api(value = "bsccheckassess", tags = "BSC年度考核-年底考核管理")
public class BscCheckAssessController {
private final BscCheckAssessService bscCheckAssessService;
private final BscCheckDeptService bscCheckDeptService;
}
总结
类上加上@RequiredArgsConstructor,需要注入的类要用final声明,或者使用@NonNull。
原文链接:https://blog.csdn.net/m0_72167535/article/details/128051068
48.前端传一个数组或者集合后台怎么接受
get请求:
对于get方式,前端传数组,后端就只能用数组接收(对象中有这个数组也可以用对象接收),不能直接用list接收(对象中有和前端传递的数组名相同的List,可以用该对象接收)
49.vue数组排序
字符串数组比较时:
const arr = [1,3,9,2,5]
arr.sort((a,b) => {
return b-a // 按降序排
// return a-b // 按升序排
})
常用的是根据对象数组的某个属性比较排序
const arr = [ {id: ‘1’ ,name: ‘张三’,age: 20},
{id: ’2‘, name: ’肖二‘, age:27},
{id: ‘3’, name: ‘李四’, age:19}
]
arr.sort((p1,p2)=>{
return p2.age-p1.age // 按年龄降序排
// return p1.age-p2.age // 按年龄升序排
})
50.多个字符串替换
public static void main(String[] args) {
String input = "神探狄仁&*%$杰\\之四/大[天王@bdfbdbd]fdgds23532";
System.out.println(input);
String reg = "/|\\?|\\*|:|\\\\|\\[|\\]";
System.out.println(input.replaceAll(reg, "")); // 神探狄仁杰之四大天王
}
51.@Accessors(chain=true)链式编程
package com.pollyduan;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain=true)
public class User {
private Integer userId;
private String name;
private Integer age;
public static void main(String[] args) {
//开起chain=true后可以使用链式的set
User user=new User().setAge(27).setName("kevin");//返回对象
System.out.println(user);
}
}
52.vue报错: Avoid mutating a prop directly since the value will be overwritten whenever the paren
原因:(单向数据流)
子组件不能修改props传递的值
解决方法:
子组件再定义一个变量接收值,
监听一下新定义的变量
使用this.$emit(‘zz’,data)
页面上监听一下<my-menu @zz=“nickname = $event”>
53.mapper.xml中判断list/数组长度
list使用 size list.size > 0
数组使用length array.length > 0
例子:
<if test="chktyp!=null and chktyp.size>0">
and chktyp in (#{chktyp})
</if>
<if test="arr!=null and arr.length>0">
and ct_fd in (#{arr})
</if>