近期小问题总结 2018/08/19

最近一些小问题的总结

一、bootstrap 多层 modal 关闭后浏览器无法滚动的问题

  •     问题描述:bootstrap 官方文档是说明不支持多层 modal 嵌套的,但是实践证明是可以的,只不过出现了多层嵌套后,当关闭了 modal,浏览器却无法上下滚动。

  •     原因:滚动事件时击穿到 body 层的,当打开 modal 时,body 会增加样式“modal-open”,即将 overflow 变为了 hidden,此时是无法滚动的,而当 modal 被关闭之后,“modal-open”便被移除了。

  •     解决:所以,解决很简单,只需要在 modal 关闭之后,在 body 上增加绑定“modal-open”样式即可。

1
2
3
    $(".myModal").on("hidden.bs.modal",function(){
      $(document.body).addClass("modal-open");
    });



二、quartz 修改执行时间后出现立即执行的问题

  •     问题描述:之前写过一个 quartz 的独立模块,可以进行界面化配置,传送门,但是后来发现了一个问题,即当调整了执行时间,即 cron 表达式之后,任务便立即执行了一遍。

  •     原因:通过查看构件 CronScheduleBuilder 的源码发现,当修改定时任务执行时间的时候,默认是立即执行一次的,所以我们进行相关调整。

  •     解决:其实很简单,只需要增加一项配合即可 .withMisfireHandlingInstructionDoNothing(),可见下图红框

微信图片_20180819194039.png



三、mysql 关于 is not null 的执行效率优化问题

  •     问题描述:很简单,数据库是 mysql,过滤某个字段为空的数据,以前用的是 is not null,但是当数据量到达 20W 以上之后,is not null 的执行效率就会急剧下滑。

  •     原因:该字段为空,即该字段不存在索引,查询效率很低

  •     解决,其实很简单,使用一点点奇淫技巧起即可,即使用 mysql 的 if,如下:if(field, 0, 1)





四、文字过长后缩略显示的问题

  •     问题描述:之前在 table 中的某个列上,增加了样式,即当问题过长之后便显现缩略,即“这是缩略。。。”,然后鼠标放上去之后显示全文,但是后来发现此招仅对汉字等有效,而对于数字,则可以缩略,但是鼠标放上去之后不显示全文。

  •     解决:使用 word-break: break-all; 样式来使连续的英文和数字进行换行显示,如下图

        summarize02.png


五、搬瓦工设置一键ss

  •     问题描述:搬瓦工以前的 vps 是有傻瓜式搭建 ss 服务的前端管理界面,但是最新的 vps 是取消了这一功能的,虽然我们可以在服务器端手动安装 ss 程序,但是管理还是存在不便利性,附上搬瓦工官网:https://www.bwh1.net

  •     解决:很简单,登录后台管理系统之后,访问此链接即可,接下来都是傻瓜式操作:https://kiwivm.64clouds.com/main-exec.php?mode=extras_shadowsocks



六、短链接的生成算法

  •     问题描述:最近短信中需要添加访问连接,长链接不仅长,而且不友好,但是又不想使用外部的服务,于是手动写一套

  •     原理:将长链接通过加密算法生成6位长度的短链接,然后再在 redis 中设置长、短链接的一对一关系,短链接访问时查询长链接然后进行重定向操作。

  •     代码:

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
55
56
57
58
59
60
61
package com.wailian.util;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @Description: 短网址生成器
* 1.  将长网址用md5算法生成32位签名串,分为4段,,每段8个字符。
* 2.  对这4段循环处理,取每段的8个字符, 将他看成16进制字符串与0x3fffffff(30位1)的位与操作,超过30位的忽略处理。多了也没用因为下面要分成6段  嘿嘿正好取整。注意用Long型变量(长度问题  你懂得)
* 3.  将每段得到的30位字符(后台以long十进制显示)又分成6段,通过移位运算将每5位分别与字符数组求与运算(0x0000003D),得到其在字符数组中的索引并取出拼串。
* 4.  这样一个md5字符串可以获得4个6位串,取里面的任意一个就可作为这个长url的短url地址。
* @Author: Jet.Chen
* @Date: 2018/8/14
*/
@Component
public class ShortUrlGenerator {
    public static void main(String[] args) {
        String sLongUrl = "http://192.168.154.77:9090/customized/customerPage?token=8500e409da8542aece6ebc42ca2a6d92";
        String[] aResult = shortUrl (sLongUrl);
        // 打印出结果
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(&nbsp;int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;aResult.&nbsp;length&nbsp;;&nbsp;i++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.&nbsp;out&nbsp;.println(&nbsp;"The&nbsp;string&nbsp;["&nbsp;+&nbsp;i&nbsp;+&nbsp;"]&nbsp;is&nbsp;"&nbsp;+&nbsp;aResult[i]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返回4段
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;String[]&nbsp;shortUrl(String&nbsp;url)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;可以自定义生成&nbsp;MD5&nbsp;加密字符传前的混合&nbsp;KEY
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;"wailianJet"&nbsp;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;要使用生成&nbsp;URL&nbsp;的字符
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;chars&nbsp;=&nbsp;new&nbsp;String[]&nbsp;{&nbsp;"a"&nbsp;,&nbsp;"b"&nbsp;,&nbsp;"c"&nbsp;,&nbsp;"d"&nbsp;,&nbsp;"e"&nbsp;,&nbsp;"f"&nbsp;,&nbsp;"g"&nbsp;,&nbsp;"h"&nbsp;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"i"&nbsp;,&nbsp;"j"&nbsp;,&nbsp;"k"&nbsp;,&nbsp;"l"&nbsp;,&nbsp;"m"&nbsp;,&nbsp;"n"&nbsp;,&nbsp;"o"&nbsp;,&nbsp;"p"&nbsp;,&nbsp;"q"&nbsp;,&nbsp;"r"&nbsp;,&nbsp;"s"&nbsp;,&nbsp;"t"&nbsp;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"u"&nbsp;,&nbsp;"v"&nbsp;,&nbsp;"w"&nbsp;,&nbsp;"x"&nbsp;,&nbsp;"y"&nbsp;,&nbsp;"z"&nbsp;,&nbsp;"0"&nbsp;,&nbsp;"1"&nbsp;,&nbsp;"2"&nbsp;,&nbsp;"3"&nbsp;,&nbsp;"4"&nbsp;,&nbsp;"5"&nbsp;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"6"&nbsp;,&nbsp;"7"&nbsp;,&nbsp;"8"&nbsp;,&nbsp;"9"&nbsp;,&nbsp;"A"&nbsp;,&nbsp;"B"&nbsp;,&nbsp;"C"&nbsp;,&nbsp;"D"&nbsp;,&nbsp;"E"&nbsp;,&nbsp;"F"&nbsp;,&nbsp;"G"&nbsp;,&nbsp;"H"&nbsp;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"I"&nbsp;,&nbsp;"J"&nbsp;,&nbsp;"K"&nbsp;,&nbsp;"L"&nbsp;,&nbsp;"M"&nbsp;,&nbsp;"N"&nbsp;,&nbsp;"O"&nbsp;,&nbsp;"P"&nbsp;,&nbsp;"Q"&nbsp;,&nbsp;"R"&nbsp;,&nbsp;"S"&nbsp;,&nbsp;"T"&nbsp;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"U"&nbsp;,&nbsp;"V"&nbsp;,&nbsp;"W"&nbsp;,&nbsp;"X"&nbsp;,&nbsp;"Y"&nbsp;,&nbsp;"Z"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;对传入网址进行&nbsp;MD5&nbsp;加密
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sMD5EncryptResult&nbsp;=&nbsp;(MD5Util.generateMD5(key&nbsp;+&nbsp;url));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hex&nbsp;=&nbsp;sMD5EncryptResult;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;resUrl&nbsp;=&nbsp;new&nbsp;String[4];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//得到&nbsp;4组短链接字符串
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(&nbsp;int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;4;&nbsp;i++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;把加密字符按照&nbsp;8&nbsp;位一组&nbsp;16&nbsp;进制与&nbsp;0x3FFFFFFF&nbsp;进行位与运算
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sTempSubString&nbsp;=&nbsp;hex.substring(i&nbsp;*&nbsp;8,&nbsp;i&nbsp;*&nbsp;8&nbsp;+&nbsp;8);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;这里需要使用&nbsp;long&nbsp;型来转换,因为&nbsp;Inteper&nbsp;.parseInt()&nbsp;只能处理&nbsp;31&nbsp;位&nbsp;,&nbsp;首位为符号位&nbsp;,&nbsp;如果不用&nbsp;long&nbsp;,则会越界
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;lHexLong&nbsp;=&nbsp;0x3FFFFFFF&nbsp;&&nbsp;Long.parseLong&nbsp;(sTempSubString,&nbsp;16);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;outChars&nbsp;=&nbsp;""&nbsp;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//循环获得每组6位的字符串
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(&nbsp;int&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;6;&nbsp;j++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;把得到的值与&nbsp;0x0000003D&nbsp;进行位与运算,取得字符数组&nbsp;chars&nbsp;索引
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//(具体需要看chars数组的长度&nbsp;&nbsp;&nbsp;以防下标溢出,注意起点为0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;index&nbsp;=&nbsp;0x0000003D&nbsp;&&nbsp;lHexLong;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;把取得的字符相加
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outChars&nbsp;+=&nbsp;chars[(&nbsp;int&nbsp;)&nbsp;index];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;每次循环按位右移&nbsp;5&nbsp;位
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lHexLong&nbsp;=&nbsp;lHexLong&nbsp;>>&nbsp;5;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;把字符串存入对应索引的输出数组
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resUrl[i]&nbsp;=&nbsp;outChars;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;resUrl;
&nbsp;&nbsp;&nbsp;&nbsp;}
}






------ 本文结束 感谢阅读 ------
0%