1、详情页加载,下拉列表框for循环, 选中下拉框,单独的。
3者之间不要来往。
2、LayUI+JFinal,CRUD 代码自动生成+权限。
后台,目前还没用模版自动生成代码的方式,尽可能维护可复用的类、模块,方便维护一些。
约定优于配置。
JS。前端引入,完整一套,已经开始维护jtn-common-jquery等各种js了。
任重而道远。
3、#include("/_view/common/resource/header.html")
#include("/_view/common/resource/js.html")
js放在前面引入。
如果放在后面引入,layui有个渲染的过程,用户会有0.5秒的渲染过程。
有明显的视觉差异。
4、短信验证码按钮,必须用 button,a标签没有disabled属性。
禁止再次点击,不太方便。
目前防止“重复点击”,已经有了解决方案。
后端暂时没有引入Redis“中央单点锁”,所谓的“分布式锁”。
5、部署之前,要clean一次,防止和上次代码冲突
6、登录backendUser类型变了,从long变为int
redis必须重启,登录key保存时间1天导致
7、JFinal封装了各种基础方法。
但是,性能存在潜在问题。
fillModelList方法,会填充1个实体中的所有关联字段,但有的时候不需要,有的地方只需要1个字段,却查询了所有关联字段,
造成极大的浪费。
通过CostTimeInterceptor,大于0.5秒的,后续就单独优化下。
/**
* 通过id查找
*/
public <K> Map<K, T> findByIdListAsMap(@Nullable List<?> idList) {
logger.info("BaseService->findByIdListAsMap,idList={}", idList);
// 主键默认为"id"
String primaryKey = getPrimaryKeyName();
return findByIdListAsMap(primaryKey, idList);
}
8、养成习惯,检查一遍
从内部类中访问本地变量userModel; 需要被声明为最终类型。
Eclipse编译的时候,没有自动提示,Maven打包的时候,才提示。
9、Redis重启?
停止
redis-cli -h 127.0.0.1 -p 6379 shutdown
10、上线
先将之前的重命名,放到1个单独的目录,再用新的包部署,方便回滚
11、costTime拦截器,大于500ms 记录error日志。
12、jQuery和vue一起使用的时候,先后顺序的问题。
jQuery初始化之后,才会初始化config的API_URL变量。
但是,vue可能在这之前,就使用了config的变量,这个时候API_URL可能还没有初始化。
因此,为了统一,不人工去解决先后顺序问题,统一让jQuery初始化之后,再让vue发送请求,
并且config这种基础配置,放在业务代码的前面。
var API_URL = "";
var ossDomain = "";
$(function(){
API_URL = $("#backendDomain").val()+"/admin/";
ossDomain = $("#ossDomain").val();
console.log("API_URL:"+API_URL);
console.log("ossDomain:"+ossDomain);
});
var config = {
idcardListData : API_URL + "idcard/listData",
}
mounted(){
console.log("mounted");
//vue必须在jQuery之后执行
$(function(){
this.getData();
});
}
13、HTML5的input[type=number],最小值是1,只能是整数。
充值金额如果支持小数,比如1.23,就不能用这个type。
14、HTML标题的优先级
<title>首页-${siteName}</title>
<#include "/common/css_js.html" />(<title>${siteName}</title>)
先引入的标题生效了。
通用页里维护 通用的标题,具体页面里,如果需要覆盖标题,再单独定义title。
15、js long丢失
vue用了key限制,2个id相同的只会展示1个。
后端bigint的long,在js由于精读丢失,2个id一样,10条数据,只展示了7条。
<tr v-for="(item,index) in page.list" :key="item.id">
<td>{{item.id}}</td>
</tr>
16、layui的图标字体,不需要引入。
css使用样式的时候,根据相对路径,自动引入了。
<!-- <link rel="stylesheet" type="text/css"
href="/static/framework/layui/font/iconfont.ttf"> -->
17、三要素认证(实名)
根据【手机号、姓名、身份证号码】来校验三者是否一致。支持移动、联通、电信。
https://market.aliyun.com/products/57000002/cmapi026061.html?spm=a2c4e.11153940.blogcont552767.17.4dad1e0eeL3R7z#sku=yuncode2006100000
四要素认证(绑定银行卡)
https://market.aliyun.com/products/57000002/cmapi021096.html?spm=a2c4e.11153940.blogcont629430.18.117e2803ccA9BV#sku=yuncode1509600000
根据【银行卡号、身份证号码、开户名、手机号】四个元素进行校验信息是否匹配一致。
18、用户投标回款的钱,项目还款的钱,差1分钱。
rid 659,repay_amount和return_amount差1分钱?精确度?
loan_repay需要还的金额,100元,以100总数计算。
投标(50,35,15)分3个值分别计算利息,3次利息之和 不等于100一次性的利息之和。
严谨的做法,项目回款的钱 等于 用户回款的钱之和。
这种设计,能适应更多需求场景。
比如,某几个用户有加息。
19、数据库DDL添加字段
一次添加多个
alter table recommend add(
extral_url varchar(1000) DEFAULT NULL COMMENT "跳转页面的url",
extral_url2 varchar(1000) DEFAULT NULL COMMENT "跳转页面的url"
);
公司内部SQL校验,不支持这种。
一次添加1个
alter table recommend add
column extral_url varchar(1000) DEFAULT NULL COMMENT "跳转页面的url"
;
20、一个奇怪的bug
layui admin框架,网上下载了个2017年6月版本。
正常在tab之间切换,没问题。
但是,有一个tab名字叫做“会员等级”,就不能正常切换。
改成“会员等级列表”就行,其它的“项目列表”也正常。
jtnTabChange(configTab.userLevelListName);
找不出问题原因。
21、axios发送的请求不带“XMLHttpRequest”,不带清楚原因
后端总是返回false
public static boolean isAjaxRequest(HttpServletRequest request) {
String requestedWith = request.getHeader("x-requested-with");
if (StringUtils.isEmpty(requestedWith)) {
return false;
} else if (StringUtils.isNotEmpty(requestedWith) && requestedWith.equals("XMLHttpRequest")) {
return true;
}
return false;
}
必须手动加上,坑爹
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
22、从数据库统计的数据,一定要判断null。
sum等。
23、开发环境,一直用Chrome。
自测的时候,可以偶尔换换浏览器。
像上传图片等,不能总是长传同1张图片,不同的图片都试试。
多测试几种场景,可能会有新发现。
24、HTML5,doctype很关键,对布局样式有影响。
图片对齐遇到过bug。
用<!DOCTYPE html>
<html>
不再用老家伙啦
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
25、导出按钮等增加防止重复点击
function jtnDownload(btnId,formId, url) {
disableOne(btnId);
enableOneLater(3000);
var form = $("#" + formId);
var formOriginalUrl = form.attr("url");
form.attr("action", url);
form.submit();
form.attr("action", formOriginalUrl);
}
26、JFinal重定向
response.sendRedirect虽然可以,但是会打印错误,页面找不到,换一种方式
public void intercept(Invocation inv) {
Controller c = inv.getController();
//response.sendRedirect(BackendLoginInterceptor.loginUrl);
c.redirect(BackendLoginInterceptor.loginUrl);
}
27、vue下,才能使用axios,后台数据在res.data里
28、修改表的自增起始值
alter table withdraw auto_increment = 10000;
29、Eclipse里Git总是无法提交,提示内部错误啥的。
D:\GitRepos\jtn\jtnabc\.git
看到提交失败,就试试“add index”添加到索引也还是不行,然后根据提示去目录里看了看,发现一个“index.lock”文件。
删除之后,就好了。
这应该是git维护的文件锁,还好懂点,多学点东西还是有用的,不知道哪天就用上了。
30、Tomcat 启动时 SecureRandom 非常慢解决办法
2018-12-17 22:50:35.735 INFO [localhost-startStop-1] (ContextLoader.java:325) - Root WebApplicationContext: initialization completed in 950 ms
Dec 17, 2018 10:57:25 PM org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
WARNING: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [409,543] milliseconds.
直接改的jre。因为1个机器上JDK只有1个,而Tomcat可能有多个。
已验证。
解决办法:
a. 在Tomcat环境中解决:
可以通过配置 JRE 使用非阻塞的 Entropy Source:
在 catalina.sh 中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。
b. 在 JVM 环境中解决:
打开 $JAVA_PATH/jre/lib/security/java.security 这个文件,找到下面的内容:
securerandom.source=file:/dev/random
替换成:
securerandom.source=file:/dev/./urandom
https://www.jb51.net/article/117086.htm