背景
基于ruoyi前后端不分离项目进行二开的所使用到的小白知识点回顾
内容
js基于后台内容动态生成复选框
for (let index in v_tmp) {
if (v_tmp[index] != "")
v_html += '<input type="checkbox" name="area" value="' + v_tmp[index] + '" required="">' + v_tmp[index];
}
$("#all-area ").html(v_html)
java List转为Map
map 为k-v 结构。这里的问题主要看,v是list中的整个Object VS Object中的一个属性。
- 整个Object
rsp.stream().collect(Collectors.groupingBy(DecryptInfosItem::getAuthId));
- Object中的一个属性
sysDictData.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));
java 流求和
BigDecimal:
BigDecimal bb =list.stream().map(Plan::getAmount).reduce(BigDecimal.ZERO,BigDecimal::add);
int、double、long:
double max = list.stream().mapToDouble(User::getHeight).sum();
js数组相关操作
- 是否存在 indexOf() 、find、 some 、 includes
// js检查数组中是否包含某个元素
// 法一 indexOf
var arr = [100,20,50,58,6,69,36,45,78,66,45]
if(arr.indexOf(66)==-1){
console.log("不存在")
}else{
console.log("存在,索引是:",arr.indexOf(66))
}
参看 https://blog.csdn.net/qq_41579104/article/details/120972171
- 分割字符串为数组
str.split()
Thymeleaf中通过strings字符串拆分的灵性操作,正确使用自带功能函数
在使用thymeleaf模板时, 需要在html中操作字符串或是数组时,需要使用thymeleaf中的函数 。
如下面字符串按’,'拆分字符串后对数组进行存在操作
<div class="col-sm-8" th:with="type=${@dict.getType('sys_product_code')}">
<input name="supportProduct" type="checkbox" th:each="dict : ${type}" th:value="${dict.dictLabel}"
th:text="${dict.dictLabel}"
th:checked="${ #arrays.contains(#strings.arraySplit(tblOperateSupplier.supportProduct,','),dict.dictLabel) }" required>
<!-- th:checked="${ tblOperateSupplier.supportProduct.contains(dict.dictLabel)}" required>-->
</div>
//用于检测字符串是否以指定的前缀开始。返回布尔类型
${#strings.startsWith(name,'o')}
//用于测试字符串是否以指定的后缀结束。
${#strings.endsWith(name, 'o')}
${#strings.indexOf(name,frag)}// 下标
${#strings.substring(name,3,5)}// 截取
${#strings.substringAfter(name,prefix)}// 从 prefix之后的一位开始截取到最后,比如 (ywj,y) = wj, 如果是(abccdefg,c) = cdefg//里面有2个c,取的是第一个c
${#strings.substringBefore(name,suffix)}// 同上,不过是往前截取
${#strings.replace(name,'las','ler')}// 替换
${#strings.prepend(str,prefix)}// 拼字字符串在str前面
${#strings.append(str,suffix)}// 和上面相反,接在后面
${#strings.toUpperCase(name)} //将所有字符转换成大写
${#strings.toLowerCase(name)} //将所有字符转换成小写
${#strings.trim(str)} //去掉前后空格
${#strings.length(str)} //返回字符长度
${#strings.abbreviate(str,10)}// 我的理解是 str截取0-10位,后面的全部用…这个点代替,注意,最小是3位
参看 :
https://blog.csdn.net/weixin_49610478/article/details/108980765
https://blog.csdn.net/Burnup_110/article/details/105899636
https://blog.csdn.net/feyehong/article/details/128809420
ruoyi导出子对象,当第一条数中的子对象为null时会出现数据bug
官方文档http://doc.ruoyi.vip/ruoyi/document/htsc.html#%E5%AF%BC%E5%87%BA%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%AD%90%E5%88%97%E8%A1%A8
此时需要针对子对象为null 情况的写一个空对象进去
// 切换需要导出数据
final List<StatFinanceDayExpExcelDto> collect = list.stream().map(e -> {
final StatFinanceDayExpExcelDto dto = BeanUtil.copyProperties(e, StatFinanceDayExpExcelDto.class);
final List<TblStatFinanceDayDetail> detail = tblStatFinanceDayDetailService.list(
Wrappers.lambdaQuery(TblStatFinanceDayDetail.class).eq(TblStatFinanceDayDetail::getFinanceDayId, e.getId()));
if (detail.isEmpty()) {
// 针对 没有 明细时,导出数据格式出错问题,没有明细时,自定义一个初始化数据
StatFinanceDayDetailExpExcelDto aaaa = new StatFinanceDayDetailExpExcelDto();
List<StatFinanceDayDetailExpExcelDto> ddddd = new LinkedList<>();
ddddd.add(aaaa);
dto.setDetailList(ddddd);
return dto;
}