常用的返回体封装工具类
/** * 返回体工具 */public class DtoResult<T> implements Serializable { public static final int STATUS_CODE_SUCCESS = 0; public static final int STATUS_CODE_ERROR = 500; private int code; private String message; private T data; public DtoResult() { this.setCode(0); } public DtoResult(T data) { this(); this.data = data; } public DtoResult(Integer code, String message, T data) { this.setCode(code); this. ...
Date类型
两个日期之间相差的天数,日期为单位(比如相差两秒,可能就相差一天,12:23:59:59 和 13:01:00:00 就相差一天)/** * date2比date1多的天数 * @param date1 * @param date2 * @return */private static int differentDays(Date date1,Date date2) { Calendar cal1 = Calendar.getInstance(); cal1.setTime(date1); Calendar cal2 = Calendar.getInstance(); cal2.setTime(date2); int day1= cal1.get(Calendar.DAY_OF_YEAR); int day2 = cal2.get(Calendar.DAY_OF_YEAR); int year1 = cal1.get(Calendar.YEAR); int year2 = cal2.get(Calendar.YEAR); ...
stream用法整理
stream 流处理将用,拼接的字符串转为 Double 集合// 将用','拼接的字符串转为Double集合List<Double> singlePoint = Arrays.asList(pointStr.split(",")) .stream() .map(str -> Double.parseDouble(str.trim())) .collect(Collectors.toList());
删除文件
删除单个文件/** * 删除单个文件 * * @param fileName 被删除文件的文件名 * @return 单个文件删除成功返回true, 否则返回false */ public static boolean deleteFile(String fileName) { File file = new File(fileName); if (file.isFile() && file.exists()) { file.delete(); System.out.println("删除单个文件" + fileName + "成功!"); return true; } else { System.out.println("删除单个文件" + fileName + "失败!"); return false; } } ...
区段合并算法
需求:将不连续的一维数组整合为多个连续的二维数组示例:
public static void main(String[] args) { Integer[] arr = {1}; // Integer[] arr = {1, 2}; // Integer[] arr = {1, 3}; // Integer[] arr = {1, 2, 4}; // Integer[] arr = {1, 3, 4}; // Integer[] arr = {1, 2, 3}; // Integer[] arr = {1, 2, 4, 5}; // Integer[] arr = {1, 2, 4, 6, 7}; // Integer[] arr = {1, 4, 6, 7}; // Integer[] arr = {1, 2, 4, 5, 7& ...
后台运行jar包与停止运行
将运行的 jar 错误日志信息输出到 log.file 文件中,然后(>&1)就是继续输出到标准输出(前面加的&,是为了让系统识别是标准输出),最后一个&,表示在后台运行。
nohup java -jar 包名.jar > log.file 2>&1 &[1] 669 #669表示运行的pid
区段过滤算法
需求:一个大的区段有小半径曲线段,复合曲线,平曲线和竖曲线各个不同数量不同长度的多个区段这些区段可能覆盖,交叉或完全不重叠
求:不与任意特殊区段有关联的多个直线段
公共方法:
public List<ImportSectionVO> filterQd(List<ImportSectionVO> filterList, List<ImportSectionVO> zxdList, String name) { ImportSectionVO zxd; ImportSectionVO filter; for (int i = 0; i < filterList.size(); i++) { filter = filterList.get(i); for (int j = zxdList.size() - 1; j >= 0; j--) { zxd = zxdList.get(j); if (filter.getEndMile ...
get请求的url经常会过长,导致数据丢失
解决方案:采用 post 请求,来解决该问题,写一个采用 post 请求的函数即可
function sendByPost(url, ids) { var oForm = document.createElement('form') oForm.method = 'post' oForm.action = url var hasitemsids_input = document.createElement('input') hasitemsids_input.type = 'hidden' hasitemsids_input.name = 'ids' hasitemsids_input.value = ids oForm.appendChild(hasitemsids_input) document.body.appendChild(oForm) oForm.submit()}
也可以使用 formData
利用本地的html文件通过ajax访问服务器
在 chrome 的快捷方式上右键属性,选中快捷方式 tab,在目标栏的最后添加以下参数,然后重启 chrome,用来测试的文件就放在下面配置的 data-dir 里
注意:每个—前面都有一个空格
注意:服务器必须开启跨域访问
--user-data-dir="C:\Users\13551\Desktop" --test-type --disable-web-security
isNaN()
sNaN() 函数其实并不能像它的描述中所写的那样,数字值返回 false,其他返回 true。
实际上,它是判断一个值能否被 Number() 合法地转化成数字。
这中间有什么区别呢,主要提现在一些特别的情况如下:
1、数字形式的字符串。例如 “123”、”-3.14”,虽然是字符串型,但被 isNaN() 判为数,返回 false。(”12,345,678”,”1.2.3” 这些返回 true)
2、空值。null、空字符串””、空数组[],都可被 Number()合法的转为 0,于是被 isNaN 认为是数,返回 false。(undefined、空对象{}、空函数等无法转数字,返回 true)
3、布尔值。Number(true)=1,Number(false)=0,所以 isNaN 对布尔值也返回 false。
4、长度为 1 的数组。结果取决于其中元素,即:isNaN([a])=isNaN(a),可递归。例如 isNaN([[“1.5”]])=false。
5、数字特殊形式。例如”0xabc”、”2.5e+7”,这样的十六进制和科学计数法,即使是字符串也能转数字,所以也返 ...
java.lang.UnsupportedOperationException:null 使用List.Add()或List.addALL() 报错
还原现场:
List<Integer> agentTeamIdsList =Arrays.asList(agentIdArray);agentTeamIdsList.add(123011);
将一个 Integer 类型数组转成 List, 上面的 Arrays.asList 是可以转成功的;
然后往转成功的 list 里面继续添加 值;
IDEA 里面并没有检测出错误,实则报错:
java.lang.UnsupportedOperationException: null
原因:
Arrays.asList 转成的 ArrayList 实际上跟往常我们创建的 new ArrayList 是不同的。
这个是 Arrays 的内部类 ArrayList:
而我们往常使用的
解决方案:
List<Integer> agentTeamIdsList =new ArrayList<>(Arrays.asList(agentIdArray));
相同数据整合示例
需求:多个对象,这些对象中的部分某个特定的属性相同。把所有的对象根据这个特定的属性整合成多个分组(或统计其他)
方法示例:
public void demo1(List<Integer> ids) { List<TYwglYsXlfinfo> tYwglYsXlfinfos = new ArrayList<>(); List<WlHzVO> exportList = new ArrayList<>(); if (tYwglYsXlfinfos.size() > 0) { WlHzVO wlHzVO = new WlHzVO(); BeanUtils.copyProperties(tYwglYsXlfinfos.get(0), wlHzVO); for (int i = 0; i < tYwglYsXlfinfos.size(); i++) { TYwglYsXlfinfo tYwglYsXlfinfo = ...
后台接口返回的数据出现了$ref,$data.xxx的字样
分析原因:个人理解是如果后台返回了个 map,map 里面放了两个 key 值,但是这两个 key 所对应的 value 指向的是同一个目标地址,概括为两个 key 所对应的 value 是同一个,或者说一个 value 对象(值相同,地址相同)用 map 的两个 key 值存储,那么返回前台时,第二个 key 的值不会是 value 而是第一个 key 的 value 的地址。
可以简单理解为:map 里面有重复的 value,那么就会出现如标题所示的字样。
常用的区段查询表单验证
1.正整数区段查询支持全不填,全填,和单独填任意一个
html 代码
<div class="layui-input-inline"> <input type="text" id="sjtjStartMile" placeholder="开始里程(m)" autocomplete="off" class="layui-input" /></div><div class="layui-form-mid">-</div><div class="layui-input-inline"> <input type="text" id="sjtjEndMile" placeholder="结束里程(m)" autocomplete="o ...
动态加载上传图片
前端
// 就是获取图片的存储路径,让图片标签的src值指向一个后台写流的方法function showImg(img) { let url = img.url let path = '/uploadFileFile/getBytesByAbsolutePath?imgPath=' + url $('img').attr('src', path)}
后端
/** * @Description: 根据图片的绝对路径返回字节流 */@RequestMapping(value = "/getBytesByAbsolutePath")@ResponseBodypublic void getBytesByAbsolutePath(HttpServletRequest request, HttpServletResponse response) throws Exception{ String imgPath = request.getParameter("imgPath ...
常见的前端手写功能
1、防抖function debounce(fn, delay) { let timer return function (...args) { if (timer) { clearTimeout(timer) } timer = setTimeout(() => { fn.apply(this, args) }, delay) }}// 测试function task() { console.log('run task')}const debounceTask = debounce(task, 1000)window.addEventListener('scroll', debounceTask)
2、节流function throttle(fn, delay) { let last = 0 // 上次触发时间 return function (...args) { ...
某个dom全屏或者整体页面全屏
//如果dom没有就让整个页面全屏const full = document.querySelector('#box') || document.documentElementif (full.RequestFullScreen) { full.RequestFullScreen() //兼容Firefox} else if (full.mozRequestFullScreen) { full.mozRequestFullScreen() //兼容Chrome, Safari and Opera等} else if (full.webkitRequestFullScreen) { full.webkitRequestFullScreen() //兼容IE/Edge} else if (full.msRequestFullscreen) { full.msRequestFullscreen()}
获取时间
var getDate = function getNowFormatDate() { //获取当前时间 var date = new Date() var seperator1 = '-' var seperator2 = ':' var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 var strDate = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + ' ' + date.getHours() + seperator2 + da ...
事件委托
拼接的元素对于 jQ 的 click 无响应,此时就需要事件委托
$('.file_container').on('click', '.file_del', (event) => { // 此时就能获取被点击的子元素,获取不到尝试加个parent()或children()试试 // 如过target里面还有元素,那么点击该元素也会触发,即会有事件冒泡 let dom = $(event.target)})$('.file_container').on('click', '.file_del', function () { // 或者不用event对象,直接用$(this)正常来说也能获取到 let dom = $(this)})
ajax前后台参数传递
contentType 的类型
ajax 的默认 contentType 是:
“application/x-www-form-urlencoded;charset=utf-8”
它是最普通的{key-value,key-value}的格式
无论 get 还是 post,springboot 可以默认封装成一个简单的 bean,此时不用添加任何注解。但是如果 bean 的属性有数组等复杂属性。那么会封装失败
后台也可以用@RequestParam 注解来提取某个简单的参数,如果同名该注解可以省略。但是对于 get 请求。不能提取数组。
想要提取数组。请求方式必须为 post 并且语法如下@RequestParam(“ids[]”)
如果为
contentType:”application/json;charset=utf-8”,
data:JSON.stringfy(data),
此时,请求方式必须为 post,后台用@RequestBody(JavaBean javaBean)
来接收,该方式几乎是除了文件外的万能方式。
如果为 false
那么一般就是上传文件,详见 ssmpj ...
