hashcode和内存地址的区别(误区)
1 | /* |
【Layui】实现跳转到指定tab栏
需求背景:实现页面之间的联动跳转,并跳转到指定tab栏
html代码:
1 | <div class="layui-tab layui-tab-brief" lay-filter="current"> |
lay-filter代表地址栏中参数的名称。
lay-id来作为唯一的匹配索引,以用于外部的定位切换。
JS部分:
1 | <script> |
Layui表格列添加超链接
记录一下,需要用到templet属性,也就是自定义列模板
参考代码:
1 | { field: 'oddNumbers', width: 180, title: '单号', sort: true, fixed: 'left', templet: addLink }, |
addLink是个方法
1 | function addLink(d) { |
layui 2.2.5 开始,templet 开始支持函数形式,函数返回一个参数 d,包含接口返回的所有字段和数据。
参考链接
https://www.layui.com/demo/table/style.html
https://www.layui.com/doc/modules/table.html#templet
一般链接会打开一个tabs或弹窗或者其它,我用的弹窗,监听表格行,获取点击行数据,如下:
1 | //pcList为table的lay-filter值 |
Layui表格table单元格加超链接功能
其中一列:
1 | {field:'companyName', title: '公司名称', align: 'center',minWidth:200,templet:tplCompanyName } |
模板方法:
1 | var tplCompanyName = function (d) { |
事件监听:
1 | table.on('tool(myOrdersListTable)', function(obj){ |
然后定义active.showRec(obj);
1 | var active = { |
springboot通过url访问本地图片
配置文件中:
1 | #用户上传头像时配置的 |
创建配置类:
1 | package com.easyfund.springboot.config; |
上面配置的意思是,将http://localhost:8080/upload/images
请求映射到本地的C:/upload/
上
例如C:/upload/
有一张图片1.png
,那么访问路径是:http://localhost:8080/upload/images/1.png
layui的富文本使用
layui这个框架,总体上感觉样式还可以吧,不过问题挺多的,之前在开发过程中遇到了富文本的问题,因为layui的提交表单大多数都是异步提交,而这个富文本的是他们封装的textarea
这个玩意,他的异步提交数据就是把富文本的数据先同步到textarea
才能提交过去,这个bug一下子让我研究了一个多小时,最终有了解决办法,献给你们!!!
1、首先咱们先把layui给咱们封装好的富文本给显示出来:
1 | <!--一定要加上lay-verify--> |
2、js部分:
1 | <script> |
这样基本上就解决啦。不要慌,咱们在这里说一下富文本里面的导入图片!!!
1 | // 图片接口放到建立编辑器前面,否则无效 |
这段代码呢,不是所有的后台接口都能返回成功的。
根据看了layui的文档说出,返回类型是json 这个是肯定的,但是里面的参数必须跟文档一致:
1 | { |
富文本回显直接使用thymeleaf的标签:th:utext
Java中util.Date和sql.Date的相互转换
Java中Date的两个类
- java.util.Date通常情况下用它获取当前时间或构造时间
- java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分
它们都有getTime方法返回毫秒数,都可以直接构造:
示例:
1 | // util.date转换成sql.date |
另外,不管是util.Date还是sql.Date都可以使用SimpleDateFormat去格式化日期格式。
关于日期格式问题可参考这篇文章:Java日期格式问题
java.util.Date
在jdk1.8之后有新的替代了,具体请参见这篇文章:温顾 Java 8 日期 API
Java中的Date和Calendar的常用用法
在java中用到的最多的时间类莫过于 java.util.Date了,
由于Date类中将getYear(),getMonth()等获取年、月、日的方法都废弃了,
所以要借助于Calendar来获取年、月、日、周等比较常用的日期格式
注意:以下代码均已在jdk1.6中测试通过,其他版本可能使用不同,请注意!
Date与String的互转用法
1 | /** |
Date与Calendar之间的互转
1 | /** |
利用Calendar获取年、月、周、日、小时等时间域
1 | /** |
对时间进行加减
1 | /** |
算出给定日期是属于星期几
1 | Calendarcal = Calendar.getInstance(); |
解决layui富文本编辑器中图片显示过大的问题
在layedit.js
中搜索inline-block
有这么一段:
1 | img{display: inline-block; border: none; vertical-align: middle;} |
在里面添加一条:
1 | img{display: inline-block; border: none; vertical-align: middle;max-width:50%} |
这样图片在富文本编辑器中显示最大宽度只会占富文本编辑器的一半。
layui上传文件
html:
1 | <button type="button" class="layui-btn" id="uploadLawsFile"><i class="layui-icon"></i>上传法律文件</button> |
js:
1 | //上传法律文件 |
后台controller:
1 | /** |
layui实现clipboard.js自动复制
1.引入clipboard.min.js
2.html:
1 | <div class="layui-input-inline"> |
3.js:
1 | var clipboard = new ClipboardJS("#copyBtn") |
FastDFS连接超时(java.net.ConnectException: Connection timed out: connect)解决方案
(1)因为FastDFS服务器搭建在公网上、需要开放如下端口:
1 | 自定义 TCP 22122 fastDFS 修改|删除 |
(2)修改FastDFS服务器上storage.conf文件中tracker_server选项服务器地址为公网IP地址
到此问题解决。
从一个页面的nav跳转到对应页面的tab处
跳转页面:
1 | <!-- 跳转页面 --> |
被跳转页面:
1 | <!-- 被跳转页面 --> |
自己测试可行性!!!!
dubbo用@Reference注入Realm失败
最近做项目用SpringBoot+Dubbo+Shiro做项目框架,在调试shiro自定义Realm权限的时候发现,@Reference注入的dubboService为null;网上查了好多,但都没有完美解决问题,问题的原因是shirofilter加载顺序引起的。
解决问题的方法为:将dubbo bean转为spring bean,再用spring上下(ApplicationContext)转为dubbo bean 就可以了。
原文:代码先锋网
spring上下文转换工具:
1 | package com.easyfund.springboot.util; |
将dubbo bean转为spring bean。先用@Reference引入,再用@Bean转换:
1 | package com.easyfund.springboot.util; |
最后是在Realm中调用。
1 | //定义一个userBiz |
1 | if (this.userBiz == null) { |
这样就解决了!
springboot设置session过期时间
1 | #session过期时间 |
thymeleaf:字符串Strings常见的使用方法
1 | #判断是不是为空:null: |
利用js预览上传的图片
备注:使用form表单进行向后端的提交带文件的数据时,需要指定form表单的提交属性 在form表单中加上enctype属性 enctype=multipart/form-data,同样的使用ajax向后端提交带文件的数据时也需要类似的属性:1.添加两个属性processData:false,contentType:false 2.data必须是FormData()类型
1 | <img id="head_picture" width="110" height="110" th:src="${session.user.headerImage}" |
FormData控制台打印为空及使用方法
之前使用formData都是在network中查看参数,最近在做一个项目,接口还没有,用的假数据做的交互,突发奇想的console.log了 一下,结果是空的。
一开始以为append失效了,经过查证原来:FormData是一种特殊类型的对象,它不可字符串化,不能仅使用console.log打印出来。
如果需要打印可以:
1 | formData.forEach((value, key) => { |
FormData常用方法:
1 | 一.创建一个formData对象实例的方式 |
ajax请求后 出现自动刷新当前页面情况
ajax请求后,返回当前页面success function 函数也执行了
但是就在此时 整个页面自动刷新了
经过我仔细认真的观察与分析后,然而并没有得出什么结果。
最后问了问度娘,他告诉我,button 的 type属性 不能为 submit ,如果为submit 就等同于 form 表单,会提交请求,而我又没有写请求地址,那么请求会提交到本页面,也就有了请求后刷新的现象。
所以,
1 | <button id="sub" type="submit" >请求ajax</button> |
与
1 | <form> //不写action |
这两种情况,都会出现请求。
解决方法:
1.删除button 中的type 属性,利用id 或者 onclick 去触发函数,因为如果不写type属性,那么默认就是button
2.删掉 form 标签,form 标签如果什么内容都没写,会重新提交到本页面
base64,file和blob相互转换
1.第一个:base64转为Blob
1 | function dataURLtoBlob(dataurl) { |
2.第二个:Blob转为base64
1 | function blobToDataURL(blob, callback) { |
3.第三个:base64转换为file
1 | function dataURLtoFile(dataurl, filename) {//将base64转换为文件 |
4.第四个:js图片转换为base64
1 | function getImgToBase64(url,callback){//将图片转换为Base64 |
第五个:在Java中base64和File相互转换
1 | /** |
使用cropper做图片裁剪,web端上传头像,前后台数据传输
首先了解下图像传输的类型,及相互转化,我用的是将裁剪后的base64图片转成file,后台接收file进行存储到本地磁盘。
如果直接存储到数据库,可以用blob类型传输。
https://www.cnblogs.com/whitewen/articles/10456410.html
1、前台HTML页面
这里初始化是挂载到img节点上,然后可以外包一个盒子对他的大小来做限制,onerror为头像加载失败后的默认图片
1
2
3
4
5 <div class="container" id="crop-avatar">
<!-- Current avatar -->
<div class="avatar-view">
<img src="${root}${obj.imgurl}" alt="修改头像" onerror="this.src = '${root}/app/img/main/user.png'"/>
</div>
记得先引入三个文件
1
2
3 <link href="/path/to/cropper.css" rel="stylesheet">
<script src="/path/to/jquery.js"></script>
<script src="/path/to/cropper.js"></script>
2、js裁剪及ajax文件上传
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 this.$img.cropper({
aspectRatio: 1,
preview: this.$avatarPreview.selector,
strict: false,
crop: function (data) {
var json = [
'{"x":' + data.x
'"y":' + data.y,
'"height":' + data.height,
'"width":' + data.width,
'"rotate":' + data.rotate + '}'
].join();
_this.$avatarData.val(json);
}
});
生成裁剪框进行裁剪,获取裁剪后的图片信息,这样拿到的格式是base64,为了方便传输,转成了file,后台接收就可以用普通form提交的方法进行接收处理。
1
2
3
4
5 var imgData = this.$img.cropper('getCroppedCanvas')
var dataurl = imgData.toDataURL('image/jpeg', 0.4); //dataurl便是base64图片,0.4是指图片清晰度
var file = this.dataURLtoFile(dataurl, "tu.jpeg");//将base64图片转化为file文件方法
base64转file的方法
1
2
3
4
5
6
7
8
9 //将base64格式图片转换为文件形式
dataURLtoFile: function (dataurl, filename) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, {type: mime});
},
ajax请求,用formdata进行传输,file为上面由base64转的file。
1
2
3
4
5
6
7
8
9
10
11
12 var formData = new FormData();
formData.append("file", file);
$.ajax(url, {
type: 'post',
data: formData,
dataType: 'json',
processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false, // 告诉jQuery不要去设置Content-Type请求头
success: function (data) {
_this.submitDone(data);
},
});
3、后台接收处理
后台用的Java、ssh。保存到了本地磁盘。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 "/resetPhoto") (value =
module = "设置用户头像", operate = "设置当前用户头像") (
public HashMap setUserProfile(@RequestParam(value = "file", required = true) MultipartFile newProfile, HttpServletRequest request) {
/** 头像保存路径 */
HashMap map = new HashMap();
if (!newProfile.isEmpty()) {
// 当前用户
Users currentUser = (Users) request.getSession().getAttribute("userInfo");
// 默认以原来的头像名称为新头像的名称,这样可以直接替换掉文件夹中对应的旧头像
String profilePathAndNameDB = currentUser.getImgurl();
String rootPath = request.getSession().getServletContext().getRealPath("");//服务器存储的磁盘地址
String id = UUID.randomUUID().toString().substring(0, 32);//防止图片名重复
String last = newProfile.getOriginalFilename().substring(newProfile.getOriginalFilename().lastIndexOf("."));//图片类型.png
String newProfileName = rootPath + profilePathAndNameDB;//图片存储路径
String path = profilePathAndNameDB;//数据库存储路径,返回前台的路径
// 数据库头像地址不存在
if (profilePathAndNameDB == null || "".equals(profilePathAndNameDB)) {
newProfileName = rootPath + "/app/upload/" + id + last;//图片存储路径
path = "/app/upload/" + id + last;//数据库存储路径
currentUser.setImgurl(path);
uService.updateUsers(currentUser);
}
// 磁盘保存
BufferedOutputStream out = null;
try {
File folder = new File(rootPath);
if (!folder.exists())
folder.mkdirs();
out = new BufferedOutputStream(new FileOutputStream(newProfileName));
// 写入新文件
out.write(newProfile.getBytes());
out.flush();
} catch (Exception e) {
e.printStackTrace();
map.put("code", "-1");
return map;
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
map.put("code", "1");
map.put("result", path);
return map;
} else {
map.put("code", "-1");
return map;
}
}
遇到的坑:
1、前后台数据传输的时候,前台要么400要么500,是因为前后台传输和接收的数据类型不一致。所以统一改成了file传输。用base64可以在后台做一下处理。
2、参考的demo比较坑,他将所有变量放在一起,代码的写法也看不懂,还好调试出来了。
3、后台存储的时候,文件路径我本来随便建了一个文件夹,将图片放在里面,可以进行存储,但是页面却读不到,一直报错Not allowed to load local resource ,最终发现是spring配置文件的问题,静态资源必须放在app文件下面
1 | <mvc:resources mapping="/app/**" location="/app/" /> |
4、图片上传成功后,页面不刷新。是因为为了减少图片存储,我查询了一下数据库,如果数据库原来的图片已经定义了,那就用原来图片的名字,直接覆盖,浏览器缓存导致页面路径不变,图片不刷新。解决方法
1 | # 在路径后面加随机数,让浏览器检测到变化,从而绕过缓存读取服务器中的图片。 |
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
1 | /*在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素、或者在iframe框架中使用父窗口的元素 |
layui-table对返回的数据进行转变显示的实例
在使用layui表格时,在ajax请求回来的数据,有时候需要我们处理之后显示
1.比如性别sex这个字段,后台可能返回的是1.或者 2;那我们总不能显示1.和 2,我们需要显示男和女,这里就用到了自定义模板了
1
2
3
4
5
6
7 <script type="text/html" id="barDemo">
{{#if (d.sex == 1) { }}
<span>男</span>
{{# }else if(d.sex == 2){ }}
<span>女</span>
{{# } }}
</script>
layui模板代码中获取表格的列值
1 | {title: '操作', width: 160, align: 'center', toolbar: '#subBtn'} |
1 | <script type="text/html" id="subBtn"> |
快速下载js文件
前提是安装了node环境
1 | # 建一个文件夹,名字是英文的 |
node sass和当前环境不兼容问题
启动报错:Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime (64)
解决办法:
1 | # node sass不支持当前环境,所以可以直接删掉原来不支持本机的node sass,再重新安装支持的就行了 |
用Jedis连接阿里云等服务器上的redis
1、配置redis.conf
设置访问redis的密码:requirepass 要设置密码
注释 bind 127.0.0.1
(重启redis-server服务,进入redis后要先验证密码,用这个命令:auth 密码 ,然后ping一下看有没有配置成功)
1
2
3$> redis-cli -p 6379
127.0.0.1:6379> auth 你的密码
OK
2、 idea访问时添加auth密码
1 | Jedis jedis = new Jedis("服务器的外网ip",6379); |
常用的IDEA快捷键
1 | ctrl+shift+alt:#多行操作 |
Docker 挂载nginx数据卷失败直接关闭问题
问题:
使用docker 挂在nginx配置文件镜像,挂载数据卷失败并且容器直接退出
解决:
这里先说解决办法:
- 首先启动一个nginx容器,然后使用cp命令拷贝一份配置文件到宿主机,然后删除容器。我是整个nginx一起拷贝,也可以拷贝单个配置文件
1 | docker cp 容器id:/etc/nginx /etc/nginx |
- 然后重新启动容器,并挂载镜像
1 | docker run -d -v /etc/nginx/nginx/:/etc/nginx nginx |
- 此时正常启动,nginx正常运行,数据卷也是正常的
原因:
下面说一下原因:开始由于本地宿主机没有配置文件,挂载的时候,直接启动nginx容器,容器会判断配置文件,发现没有conf配置文件,故启动容器失败从而挂载数据卷也失败。
回到docker hub 看nginx有一段:
1 | Complex configuration |
结合实际来看,如果要修改配置,可以先拷贝一份配置到宿主机,然后挂载数据卷实现配置实时共享。
MindManager2018 30天无限试用
打开MindManager2018
此时MindManager2018会弹窗30天试用到期,不用管他按确定退出。
修改文件
打开 C:\Users\xxx\AppData\Roaming\MindManager\MindManager2018.ini
(xxx是你自己的用户名)
[MindManager]InstallTime
=1582085643LastLoading
=1582085835
你会看见上面那样的内容,只需要把 LastLoading
后面的值复制替换
给 InstallTime
(这就是为什么第一步要打开一下软件,因为要更新 LastLoading 最后一次打开的值) ,然后保存退出
再打开就又有30天试用了。