项目笔记1(djy)

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;

SELECT id, name FROM teacher WHERE id=#{tid}

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

select u.id, u.name, u.role_id, r.name as role_name from user u left join role r on u.role_id = r.id # 16.vue 异步执行 执行顺序问题 执行完一个方法后再执行另一个方法

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值