(1)
全局搜索快捷键
Ctrl+Shift+F
(2)
通过后台全部查询,再交由前端进行筛选记录
(3)
使用F12的好处可以直接获得请求与相应,F5开始记录
然后选择NetWork ->>XHR。这种方式比直接找页面然后再找
按钮方便多了,而且很清晰的看到前后端传递的数据。如果是修改
页面样式,直接对比即可
(4)
后台获取数据后,前端进行筛选 ,但怎么知道是哪个js在起作用
很简单,在NetWork查看Initlator可以知道这个页面那个js在用
(5)
如果是页面布局改了还是不行,那就改一下版本号
(6)
Mysql将查询的数据按照首字母进行排序
https://blog.csdn.net/qasxcvgh/article/details/54946632
(7)
两种获取MySql数据库中所有表的主键和外键约束信息的Sql语句
https://www.cnblogs.com/PatrickLiu/p/6269145.html
(8)
对于添加“请选择”下拉框,很可能是在js那里又重复使用了pageHolder参数,将它注释掉即可
(9)
使用Alt+ctrl+H可以查看当前方法被哪些控制层所调用,再决定是否需要另写一个方法
(10)
对于sql排序,可能一个字段有重复,可以用多个字段来联合排序。如果能直接使用现成的字段,就不需要在实体中加入新的字段了
(11)
对于F12,如果是href,那么跳转的就是jsp.如果是network,那么就是controller路径
(12)
左下角的Version Control可以有回退或者对比改之前的代码,非常便捷。如果不需要提交的
代码可以另存到一个文件夹里面即可
(13)
对于同一个方法,很可能是不同的service在进行调用,所以最为保险的方法就是
先进入service层里面详细查看,然后再找对应的Dao层,再查看对应的xml文件。其他同理
因为大项目很多会选择继承基类,然后再重写里面的方法,这样可以节省很多空间
(14)
如果在version Control里面提交不了,只需要在项目文件夹进行update+clean up操作即可提交
(15)
对于修改获取的数据,只需要在js修改名称即可。关键是要查看响应到哪些参数
(16)limit是mysql的语法
select * from table limit m,n
其中m是指记录开始的index,从0开始,表示第一条记录
n是指从第m+1条开始,取n条。
select * from tablename limit 2,4
即取出第3条至第6条,4条记录
这个limit和Page
是一样功能的,所以在mybaties不需要在sql加上limit
(17)
在button后面加入display:inline,可以使属性内联。即按钮间可以
在同一行
(18)
怎么样在第一次初始化页面的时候就触发JS中函数
body οnlοad="javascript:XXX()" XXX是你的函数名称
(19)
如果觉得哪部分查找起来很麻烦,可以使用全局变量来查找当前页面的特征关键字,很方便
(20)
function initData(){
var getAllOrgUrl = global.rootPath + '/auth/system/sysOrg/usedOrg';
global.asyncGet(getAllOrgUrl, function(res){
var orgData = $.map(res, function (obj) {
obj.text = obj.text || obj.name;
return obj;
});
$("#serach_usedUnit").select2({
data: orgData,
//placeholder: '请选择',
width: '100%'
});
});
}
添加请选择按钮需要两个要素:第一个是获取下拉列表名称,还有一个就是响应的url路径
整个过程就是:保存数据在一个ajax中,然后传到一个URL里面,再通过controller里面进行查询
(21)
对于某些请选择比较复杂,可以用如下代码来进行消除。类似层叠消融的原理
$("#cnvcaddress").select2({
placeholder: '请选择',
width: '100%'
});
也可以直接在对应的jsp页面删除option
(22)
如果前端请求的数据需要从数据库获取,那么通过ajax发送。如果不需要
,直接是option列举出来即可
(23)
idea里面的maven可以快速整合tomcat服务器,只需要点击maven project->plugins->tomcat7即可
(24)
debug主要是F7,F8用的比较多。F7是单步调试,如果有方法,就会进入。F8也是单步调试,不会进入所在行的方法
(25)
按一下F12,你的浏览器底部将会显示这个窗口 请选择console,这里是控制台输出窗口,在这里你可以直接写JS代码,然后回车,你的代码会马上执行
(26)
有时候改需求,很可能在业务层稍微改动就可以把问题解决
(27)
数据库中as关键字,前面是当前字段,后面是显示的名称
choose是列表中选择其中一项
左联,新增的数据在左表,on后面填的是两表关联的字段。
SELECT
a.id AS "id",
a.name AS "name",
a.enname AS "enname",
a.belongcity AS "belongcity",
a.provilegecities AS "provilegecities",
a.comments AS "comments",
a.type AS "type",
a.parentId AS "parentId",
city.cnvcCityCode
FROM sys_org a
left JOIN base_city city ON a.belongCity = city.id
-- WHERE a.type != '1'
ORDER BY a.id
(28)
$('#payment').not('#666').modal('show'); jquery加个not可以排除某个元素
(29)
mybatis是可以返回map的,关键返回的类型由谁存储,一般交由list存储
(30)
debug模式下,选中某个部分,按F8+ALT,可以查看当前变量
(31)
List可以装Map集合
(32)
String str=StringUtils.join(baseCityDao.getCityCode(),",");
可以将List集合里面的内容全部转为字符串
(33)
搜技术性问题,先百度,如果查不到,再进行谷歌搜索
(34)
在Mybatis里面的sql语句如果涉及到参数,需要进行debug模式,将参数一一代入
(35)
如果sql里面的参数涉及日期类和字符串,或者遇到不能查同一天的时间段时,很可能是日期格式不对,需要对传入的参数和数据库本身的数据进行
数据格式处理,例子如下
AND date_format(a.writeOffDate,'%Y-%m-%d') >= date_format(#{writeOffStartDate},'%Y-%m-%d')
AND date_format(a.writeOffDate,'%Y-%m-%d') <= date_format(#{writeOffEndDate},'%Y-%m-%d')
(36)
Navicat里面的美化sql很好用
(37)
sql里面的记录是有分页的,找不到的数据可能在下一页
(38)
顺着debug往下走,理清每个值,传递的参数分别是什么,答案就很简单了
(39)
如果一个值需要匹配另外一个值,可以将list进行遍历,然后
将List的各个值存到map中,然后再进行比对
(40)
jQuery removeAttr() ,removeAttr() 方法从被选元素移除一个或多个属性。
用法如下:
$("button").click(function(){
$("p").removeAttr("style");
});
那么JQuery attr就和上面的方法相反了,attr()是增加一个属性,例子如下
$("#comm").attr("required", "required");
(41)
Jquery里的html方法,是为文本写进内容,例子如下
$("#write").html("本次分配票数 加 代理库存票数大于 协议票数"+temp+"票");
(42)
http://www.ip138.com/ 可以查看目前ip地址所在区域
(43)
siCarrierAccountingCollectSearchDTOList = baseAgentService.getSiCarrierAccountingCollectSearchDTOPage(vo);
List
HashMap
for(int i=0;i map.put(sysOrgList.get(i).getId(),sysOrgList.get(i).getCnvcCityCode()); } for(int i=0;i for(int j=0;j if (siCarrierAccountingCollectSearchDTOList.get(i).getSysOrgId() == sysOrgList.get(j).getId()) siCarrierAccountingCollectSearchDTOList.get(i).setSysOrgName(sysOrgList.get(j).getCnvcCityCode()); } } 这是我自己写的代码,两点很关键,第一是要学会利用list,map集合应用到项目当中去。第二点是算法逻辑要清晰 (44) 前端调试的方法:在js页面处写上“debugger”,然后按F12,然后F10单步调试即可。只要鼠标 方法放到对应位置,就能对应查看数据的值 (45) "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { debugger if(iDisplayIndex == 0){ $(".dataTables_scrollFoot #sumamount").html(aData.amount); }else { var currentAmount = Number($("#sumamount").text()); $(".dataTables_scrollFoot #sumamount").html(currentAmount + Number(aData.amount)); } return nRow; 用作统计作用 (46) AND a.status = 0 OR a.status = 1 AND a.status = 1 AND a.status = 0 当需要对某个变量进行多种情况选择时,可以采用 需要注意的是,when 里面的不是sql语句,所以等于是==,而不是像sql语句的= 还有一点是字符串不仅仅是''加上就可以了,还需要toString() (47) PageHelper.offsetPage(impulseInfo.getStart(), impulseInfo.getLength()); 这个分页插件是mybatis自带的,非常方便。是在该条语句的之后的第一条sql语句(起作用)给予limit 10 (48) 一般是先分好页,再进行查询筛选好的数据放入该分好页内,而不是 先查全部数据再进行分页,这样一旦数据过于庞大,会造成不必要的浪费 (49) 如果sql需要某个对象的值,需要在前面对该属性进行Get,set赋值。然后sql就能进行调用了 对于集合要定义好泛型,不然不知道是哪个函数 就近修改原则,数据库优先原则 如果返回的是一个值,那么用对象将它保存起来就可以了;反之用集合进行保存 (50) IDEA总是提示Cannot resolve symbol解决方法 1.File->Invalidate Caches/Restart 清除缓存重启 2.maven -> Reinport、 3.电脑重启 (51) SiImpulseInfo excludeLine = dao.findExcludeLine(serachInfo); List excludeLineList=new ArrayList(); if(excludeLine!=null) { String[] excludeLineArray = excludeLine.getExcludeLine().split(",");//将集合中的排除航线进行切割存在数组中 for (int i = 0; i < excludeLineArray.length; i++) { if (excludeLineArray[i] != null && excludeLineArray[i] != "") { excludeLineList.add(excludeLineArray[i].split("-")[1]); } } serachInfo.setExcludeLineList(excludeLineList); } if(b==true) { PageHelper.offsetPage(impulseInfo.getStart(), impulseInfo.getLength()); List return list; } else { List return list; } SELECT FROM cargo_info a AND a.international = '1' AND a.impulseDflag = '1' AND a.ibillflag = '0' AND a.agentUser = #{agentId}
AND a.flightTime >= #{aviStartDate} ]]>
AND a.flightTime <= #{aviEndDate} ]]> AND FIND_IN_SET(a.flightNo,#{flightNo}) AND FIND_IN_SET(a.commodityType,#{commodityType}) AND a.startStation = #{startStation} AND a.endStation = #{endStation} AND a.endStation NOT IN #{excludeLine} 总结如下 split切割之后会自动分好组 可以先定义一个集合,进行存值,然后再将这个集合set进对象里面去 对于分页操作,默认执行第一条sql,可以根据逻辑来进行更改,利用boolean来进行判断 对于sql里面的foreach遍历,第一个collection是集合参数的名称,item随便命名,separator是切割的标志,open.close是开始和结束的标志 (52) SELECT COUNT(0)AS "awbNum", SUM(a.roughweight) AS "roughweight", SUM(a.feeweight) AS "feeweight", (SUM(a.transfeekz) * 0.945) AS "receivableAmount" FROM si_post_acct_carrier a AND a.orderid = #{orderid} AND a.startstation = #{startstation} AND a.deststation = #{deststation} AND a.flightdate >= #{queryStartTime} AND a.flightdate <= #{queryEndTime} AND a.status = 1 AND a.status = 0 总结:(1)当不执行if里面的条件时,默认是全部执行,就不会去判断一些筛选的条件了 (2)在判断条件的sql语句中,在sql语句里面加入括号可有效的的确保该条件是判断的唯一条件而不是两个条件 如 AND a.status = 1 or a.status=0 和 And (a.status = 1 or a.status=0) (53) 如果前端某些插件出错,可以去官网参照一下官网的写法。看看是写法错了还是js版本错了 排错的过程要么是后端出错,要么是前端出错。知道错在哪部分,就全神贯注去那里查看 前端出错很有可能方法没被调用,或者格式写错了 排错法宝:大胆假设,小心求证 (54) if ((data.totalNumber + data.agentStockCount) > data.agentContractCount) { $("#warning").removeAttr("hidden"); $("#write").html("本次分配票数 加 代理库存票数大于 协议票数"+temp+"票"); $("#comm").attr("required", "required"); } if ((data.totalNumber + data.agentStockCount) <= data.agentContractCount) { $("#warning").attr("hidden",true); $("#comm").attr("required", false); } 激活属性是attr,然后设置为true 取消属性是removeAttr (55) input="number"是H5的写法,在低版本不支持H5,所以出现了被遮挡的情况。 可以考虑用input="text",然后利用 正则来限制只能数字输入
οnkeyup="this.value=this.value.replace(/[^\d]/g,'') " onafterpaste="this.value=this.value.replace(/[^\d]/g,'') " name="f_order" value="1"/> 可以使得文本框输入的格式只能为数字 (56) 下载模板其实很简单,只需要用location.href指定路径即可 // 下载模板 function downloadTemplate() { var url = global.rootPath + '/static/Excel/进港班均货量协议价格模板.xlsx'; location.href = url; } (57) mysql里面使用单行注释 -- 然后带上注释,注意有空格 如果是多行注释,就用ctrl+/ (58) SELECT bcarr.prefix FROM base_carrier bcarr GROUP BY bcarr.prefix HAVING COUNT(bcarr.prefix) > 1) 用来查询重复记录 (59) 在进行左连接的时候,使用的关键字最好是唯一的。如果不是唯一的,那么 查出来的结果很有可能会重复。这时候可以采用distinct来对所有记录进行去重 例子如下: SELECT DISTINCT a.*,g.cnvcName AS "commodityTypeName", g.cnvcShortName AS "infoCnvcShortName", ba.cnvcName AS "agentUserName", c.uname AS "operUserName", bsd.slabel AS "saleTypeName", IF(cca.ccaCount>0,cca.ccaCount,0) AS "ccaCount" FROM cargo_info a LEFT JOIN base_goods_type g ON a.commodityType=g.cnvcShortName AND g.cnbIsDeleted='0' AND g.cniNationTypeID = a.international LEFT JOIN base_agent ba ON ba.id=a.agentUser LEFT JOIN sys_users c ON c.id = a.operUser LEFT JOIN base_static_data bsd ON bsd.value=a.saleType AND bsd.typeCode='SaleType' AND bsd.cnbIsDeleted='0' LEFT JOIN cargo_info_cca cca ON a.prefix = cca.prefix AND a.tNo = cca.tNo AND a.agentUser = cca.agentFiscalCode LEFT JOIN base_carrier bcarr ON bcarr.prefix = a.prefix OR bcarr.mailPrefix = a.prefix a.deleteflag=0 AND a.calflag = #{calflag} AND a.startStation=#{startStation} AND a.endStation=#{endStation} AND a.arriveStation1 != "" and a.arriveStation2 != "" and ( (a.arriveStation3 = "" and a.arriveStation1 = #{arriveStation}) or (a.arriveStation3 != "" and (a.arriveStation1 = #{arriveStation} or a.arriveStation2 = #{arriveStation})) ) AND a.flightNo like CONCAT(#{flightNo},'%') AND a.prefix=#{prefix} AND a.tno like CONCAT('%',#{tno},'%') AND a.international=#{international} AND a.commodityType=#{commodityType} AND (a.auditStatus is null OR a.auditStatus = 0) AND a.auditStatus=1 AND a.saleType=#{saleType} AND a.agentUser=#{agentUser} AND a.flightTime >= #{queryStartTime} AND a.flightTime <= #{queryEndTime} AND ba.belongorg = #{belongorg} AND a.flightTime >= #{flightTime} AND a.flightTime <= #{flightTimeEnd} AND bcarr.twoCode = #{baseAirways} (60) cargoInfoImport.setNumbers(cargoInfoImport.getNumber()==null?"0":cargoInfoImport.getNumber() + ""); cargoInfoImport.setWeights(cargoInfoImport.getWeight()==null?"0.00":cargoInfoImport.getWeight() + ""); cargoInfoImport.setCostWeights(cargoInfoImport.getCostWeight()==null?"0.00":cargoInfoImport.getCostWeight() + ""); 总结:(1)用三目表达式替代if,else要好得多 (2)对于要转换为String类型,可以采用+“”来拼接一个空字符串来变成String,也可以采用.toString()这个方法 (61) 对于要统计去掉重复之后的数据,关键点在于先把去掉重复之后的数据单独作为一张表,然后对该表进行统计即可 SELECT count(0) AS "count", SUM(s.weight) AS "weight", SUM(s.costWeight) AS "costWeight", SUM(s.skyCost) AS "skyCost", SUM(s.fuelCost) AS "fuelCost", ( SUM(s.com1Cost) + SUM(s.com2Cost) + SUM(s.otherCost) ) AS "otherTotal", SUM(s.totalFee) AS "totalFee" FROM ( SELECT DISTINCT a.weight, a.costWeight, a.skyCost, a.fuelCost, a.com1Cost, a.totalFee, a.com2Cost, a.otherCost, a.tNo, a.prefix FROM cargo_info a LEFT JOIN base_carrier bcarr ON bcarr.prefix = a.prefix OR bcarr.mailPrefix = a.prefix WHERE a.tNo = 80482485 ) s (62) 时区问题的解决方案是在该对象的属性上的get方法加上这个注解 @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") 即可解决 (63) DataTable.init('#saleDataTable', { url: global.rootPath + '/auth/si/siPostAcctSale/findPage?billStatus=0', columns: [ {type: "checkbox", bind: "#saleSelectAll"}, {data: "status", render: data => data == 1 ? '已审核' : "未审核"}, {data: "ticketagent"}, {data: "orderid"}, {data: "checknumber"}, {data: "saleticketdate"}, {data: "startstation"}, {data: "deststation"}, {data: "airsegment"}, {data: "fullairline"}, {data: "feeweight"}, {data: "feerate"}, {data: "transfee"}, { render: function (data, type, full) { return Constructors.buildTagA({ text: "编辑", click: () => { showCarryEditForm(full.id); } }) + Constructors.buildTagA({ text: "删除", click: () => { delCarry(full.id); } }) } } ] }); DataTable里的columns属性,其实都是相当于对象.getXXX()这样获取的,而且要一一与界面对应 (64) 总结datatable后台数据传回前端之后进行文字转换的操作 {data:"othFee", render: function(data, type, row, meta) { if (data === 0){ return "否"; }else return "是"; return data; } }, 这个data:"othFee",可以省略,因为是与页面一一对应的 (65) 如果出现js无法使用的情况,那有可能版本号没有更新,使用new Date根据时间 变化即可解决 (66) 一般在获取某个单选框的id后,用完之后要进行清空操作,不然会进行残余 (67) F12可以获取请求(前端传给后台的参数)和响应(后台返回给前端的信息)的相关参数,在NetWork点击对应的Url路径后,看header和response面板即可查看 (68)如果dao层里传入的不是对象,而是一个集合,那么就需要为该集合 添加@Param注解 如List 因为mybatis框架当传入多个参数时,需要对其进行命名来辨别 (69) 总结静态变量的弊端:会被共享,对于很多人使用的系统是不行的 (70)var cnvcairport3code = obj.cnvcairport3code; if(cnvcairport3code.indexOf("'")>-1){ layer.alert("含有单引号敏感字符,请重新输入"); } 如果对于限制某些字符的话,可以采用这种方式。如果遇到复杂的限制形式,只能 用正则表达式了 (71)$(function () { // 代理人选项 var getAllAgentUrl = global.rootPath + '/auth/base/baseAgent/findAll'; global.asyncGet(getAllAgentUrl, function (res) { var agentData = $.map(res, function (obj) { obj.text = obj.cnvcname; return obj; }); $("#search_agent").select2({ data: agentData, //placeholder: '请选择', width: '100%' }); $('#EditForm').find('select[name="agent"]').select2({ data: agentData, placeholder: '请选择', width: '100%' }); }); initDataTable(); }); 为下拉框赋值的方法,最好是用map集合为它赋值 (72) 获取下拉框所选的值用Jquery轻松实现 var agent = $("#search_agent").val(); 然后把这个值传给url即可 (73) 给下拉框重置的方法 $('#searchForm').find('select').val('').trigger('change'); 或者 $('#agent').val('').trigger('change'); (74) 前端数据传到后台的方法 //给货单号派发一个失去焦点事件 发送ajax请求 $("#tno1").change(function(){ var searchVal = ""; searchVal = $("#search_financialCode").val(); //获取输入的值 var prefix = $('#prefix').val(); var $value=$(this).val(); var checkurl = global.rootPath + '/auth/cargo/cargoInfoImport/checkMessageTno?prefix='+prefix+'&financialCode='+ searchVal+'&tno='+$value; $.get(checkurl,function(data){ console.log(data,'141') if(data.message == 0) layer.msg(' 该货单号不合法', {icon: 0}); }); }); 总结:利用jquery表单事件获取对应的值,然后在url路径带上这些参数即可 然后后台利用对象的形式,调用Get方法分别获取。参数名称一定要与对象的属性 相对应,不然会报错 (75) sql的语句编写规范 SELECT count(1) FROM t_stock_detail WHERE usedUnit = #{financialCode} AND prefix = #{prefix} AND id NOT IN ( SELECT tno FROM (SELECT a.*, b.financialCode FROM cargo_info_import a LEFT JOIN si_sale_report b ON b.id = a.siSaleReportId) a WHERE financialCode = #{financialCode} AND prefix = #{prefix} AND STATUS = '1' AND tno !=#{tno} ORDER BY tNo ) and id =#{tno} 总结:看sql先看整体,再看细节 写sql先写细节,再写整体 (76) 在数据库查找数据时候,不要直接ctrl+F,应该使用上方的筛选条件进行筛选 (77) Jquery中获取元素之后,对该元素进行赋值有两种方式。第一种是 直接的html()方法进行赋值,这种方式简单,但不适用于下拉框 还有一种是val()方法,这种方法非常适用于下拉框赋值,也适用于文本框。 举个例子: $("#search_policyName1").val(policyNo).trigger("change"); val赋值之后再调用trigger,即可生效,很重要这一步 (78) 正则表达式使用规则:先定义正则表达式规则,然后调用test(指定的字符串),然后看返回是true和false即可进行不同的操作 例子如下: var regulation = /^[0-9]{8}$/; if(regulation.test($value)){ var checkurl = global.rootPath + '/auth/cargo/cargoInfoImport/checkMessageTno?prefix='+prefix+'&financialCode='+ searchVal+'&tno='+$value+'&editTno='+editTno; $.get(checkurl,function(data){ if(data.message == 0) layer.msg(' 该货单号不合法', {icon: 0}); }); }else{ layer.alert("您输入数字不是8位数,请重新输入", {icon: 0}); } (79) 对于模糊查询,在sql语句可以直接写 like "%北京%" 就能匹配到包含北京的所有记录 但是如果在框架里面是没办法把%%直接代入到,只能是like #{cnvcname}匹配到北京,并没有模糊查询 的功能,所以只能在controller或者service层进行%拼接 例子如下 if (StringUtils.isNotEmpty(baseAgent.getCnvcname())) { baseAgent.setCnvcname("%" + baseAgent.getCnvcname() + "%"); } (80) 对于前端使用的模板,很多时候一定要属性和属性的名称要一致,不然就很可能使用不了 例子如下 货运处: 像这里的data-select-name="search_org" 要和id="search_org"一致即可 总结: (1)使用多选框插件的思路: 先是初始化的时候,对每个复选框赋予id,当其被点击的时候才能根据这个id来锁定事件 (2)对于datatable返回的data属性,是要看sql语句中select返回的对象,两者是一致的。包括名字也要一致。 例子如下: SELECT a.startStation AS "startCode", a.endStation AS "endCode" {data: "startCode"}, {data: "endCode"}, (81) 前端传递给后台的原理也一样,前端代码 var parameter = '?startTime=' + obj.startTime + '&endTime=' + obj.endTime + '&twoCodes=' + twoCodes + '&areaIds=' + areaIds + '&orgCodes=' + orgCodes + '&agentIds=' + agentIds + '&chargeTypes=' + chargeTypes + '&openMode=' + openMode + '&incomeTypes=' + incomeTypes + '&selectTwoCode=' + selectTwoCode + '&selectArea=' + selectArea + '&selectOrg=' + selectOrg + '&selectAgent=' + selectAgent + '&selectChargeType=' + selectChargeType + '&selectIncomeType=' + selectIncomeType; g_searchParameter = parameter; calculate(parameter);// 小计 var url =global.rootPath + '/auth/si/siSaleSum/findPage' + parameter; (82)null是空对象,是不能调用任何方法的。但是""是可以调用对象的,注意两者的区别 (83)对于type="radio"这种类型取消选中的方法是: $('#searchForm').find('input[name="search_status"]').parent().removeClass('checked'); $('#searchForm').find('input[name="search_status"]:eq(0)').parent().addClass('checked'); (84)对于一个raido单选框进行重置,从两方面入手。第一是样式上,将那个点取消。第二个是对它的点击的值进行置空 代码如下: $('#serachData input[name=unittype]').prop("checked", false); $('#serachData input[name=unittype]').parent().removeClass("checked"); 不过这里需要注意的是,如果是固定属性,要是用prop进行赋值,而不是用attr.不然会出错。固定属性类似于有“checkbox,radio和select” (85) 如果在打断点的过程中进行Update项目,那么很可能在update项目之后该断点不可用,出现 no executable code found at line的错误提示,那么只需要重新运行项目,再打一次断点即可 (86) 各个属性的对应关系,作个总结 前端的属性传到后台,里面的属性名称要一一对应 后台返回的数据传到前端,里面的属性名称要一一对应 查询数据库返回的字段要与自己设置的实体类的属性一一对应 正是由于这么紧密的联系,才能保证数据传输的正确性 (87) POI对Excel单元格进行操作 import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.IOException; import java.io.FileOutputStream; /** * Demonstrates how to work with excel cell comments. * * Excel comment is a kind of a text shape, * so inserting a comment is very similar to placing a text box in a worksheet * * * @author Yegor Kozlov */ public class CellComments { public static void main(String[] args) throws IOException { //1.创建一个工作簿对象 XSSFWorkbook wb = new XSSFWorkbook(); //2.得到一个POI的工具类 CreationHelper factory = wb.getCreationHelper(); //3. 创建一个工作表 XSSFSheet sheet = wb.createSheet(); //4.得到一个换图的对象 Drawing drawing = sheet.createDrawingPatriarch(); //5. ClientAnchor是附属在WorkSheet上的一个对象, 其固定在一个单元格的左上角和右下角. ClientAnchor anchor = factory.createClientAnchor(); //6. 创建一个单元格(2A单元格) Cell cell0 = sheet.createRow(1).createCell(0); //6.1. 对这个单元格设置值 cell0.setCellValue("Test"); //6.2. 对这个单元格加上注解 Comment comment0 = drawing.createCellComment(anchor); RichTextString str0 = factory.createRichTextString("Hello, World!"); comment0.setString(str0); comment0.setAuthor("Apache POI"); cell0.setCellComment(comment0); //7. 创建一个单元格(4F单元格) Cell cell1 = sheet.createRow(3).createCell(5); //7.1. 对这个单元格设置值 cell1.setCellValue("F4"); //7.2. 对这个单元格加上注解 Comment comment1 = drawing.createCellComment(anchor); RichTextString str1 = factory.createRichTextString("Hello, World!"); comment1.setString(str1); comment1.setAuthor("Apache POI"); cell1.setCellComment(comment1); //8. 创建一个单元格(4F单元格) Cell cell2 = sheet.createRow(2).createCell(2); cell2.setCellValue("C3"); Comment comment2 = drawing.createCellComment(anchor); RichTextString str2 = factory.createRichTextString("XSSF can set cell comments"); //9。为注解设置字体 Font font = wb.createFont(); font.setFontName("Arial"); font.setFontHeightInPoints((short)14); font.setBoldweight(Font.BOLDWEIGHT_BOLD); font.setColor(IndexedColors.RED.getIndex()); str2.applyFont(font); comment2.setString(str2); comment2.setAuthor("Apache POI"); comment2.setColumn(2); comment2.setRow(2); //10. 保存成Excel文件 String fname = "comments.xlsx"; FileOutputStream out = new FileOutputStream(fname); wb.write(out); out.close(); } (88) Alt+回车键 快速导入所需的类型 (89) 表命名规范:用下划线进行分割,全部小写 (90) 正则表达限制只能输入英文和逗号 οnkeyup="this.value=this.value.replace(/[^\a-zA-Z\,]/g,'')" onafterpaste="this.value=this.value.replace(/[^\a-zA-Z\,]/g,'')" (91) AND a.prefix=#{prefix} 各个字段的含义 #{prefix}传的是前台输入的值,名字要对应。a.prefix是数据表的字段名 同理,当在前台传到controller时,各个字段名称要对应的Get方法,与Jsp的input name相对应 (92) 对导出Excel进行宽度设置,先在ExportExcel这个表格公共类添加一个setColumnWidth()设置宽度的方法 /** * 设置列的宽度 */ public ExportExcel setColumnWidth(){ for (int i = 0; i < 20; i++) { sheet.setColumnWidth(i, 14*255); } sheet.setColumnWidth(4, 14*420); sheet.setColumnWidth(6, 14*420); sheet.setColumnWidth(7, 14*420); return this; } 然后在导出表格中对该公共类的设置宽度的方法进行调用即可 new ExportExcel("票证明细", TStockDetail.class).setColumnWidth().setDataList(list).write(response, fileName).dispose(); (93) mysql> grant all privileges on *.* to 'yangxin'@'%' identified by 'yangxin123456' with grant option; all privileges:表示将所有权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等。 on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示所有数据库,所有表。如果我要指定将权限应用到test库的user表中,可以这么写:test.user to:将权限授予哪个用户。格式:”用户名”@”登录IP或域名”。%表示没有限制,在任何主机都可以登录。比如:”yangxin”@”192.168.0.%”,表示yangxin这个用户只能在192.168.0IP段登录 identified by:指定用户的登录密码 with grant option:表示允许用户将自己的权限授权给其它用户 (94) layui的日期控件样式设置 例子如下: laydate.render({ elem: '#timeInputSeven', type: 'year', format:'yyyy-MM-dd' }); type是显示年份还是月份, format是自定义日期格式 (95) 在使用BootStrap来布局界面时,很可能会遇到错位问题,基于bootstrap是个栅栏系统,可以从以下角度进行分析 (1)一个界面最多分成12列,是不是分配的时候给多了 (2)对于form-container这个div层,看看给的宽度是否合适;看看input输入框或者select多选框,看看给的宽度是否合适,这两者无非就是container大,input小或者container小,input大 (96) Intellij IDEA中使用MyBatis-generator 自动生成MyBatis代码 ,可以参考这两个博客 https://blog.csdn.net/noaman_wgs/article/details/54409301 https://blog.csdn.net/u012345283/article/details/45876547 第一个是具体方法,第二个是对配置的说明 配置好之后,点击运行即可 (97)不要复制类或者接口到另外一个路径,因为路径不一样,会出Bug (98)Mybatis实现映射关系 https://www.cnblogs.com/xdp-gacl/p/4264440.html (99)如果xml使用了大小写符号,可以在这里面使用
AND date_format(a.effStartDate,'%Y-%m-%d') >= DATE_FORMAT(#{effStartDate}, '%Y-%m-%d') ]]>
AND date_format(a.effEndDate,'%Y-%m-%d') <= DATE_FORMAT(#{effEndDate}, '%Y-%m-%d') ]]> 这样就不用转换大小写符号了 (100) 如果对于文件要更换包的位置,则一定要refactor然后move,不可以直接拖动,不然路径会报错。 Idea会自动更换包的路径。更换后可能路径需要重新加载,使用maven的clean功能即可 (101) 在数据库文件加入这两个属性,那么在插入数据的时候就能自动获取id了 (102) 在Service层中,如果涉及到更新的处理,需要添加 @Transactional(readOnly = false) 这个注解,不然就无法更新成功,错误提示Cause: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not (103) 点击按钮获取值赋给对应的界面,有两种方式,第一种是是用controller的setAttriBute(), 然后jsp用EL表达式获取,不推荐,因为Jsp界面包含了其他东西 第二种是在前端用full获取之后,通过Jquery获取事件之后为其赋值,推荐 代码如下: // 导入退出原因弹出框 function openImportRecycle(id) { debugger $('#importWindowRecycle').find('.modal-title').text('退出原因信息'); resetForm('importFormRecycle'); var url = global.rootPath + '/auth/itmodules/pi/itExpFlineImpulseSignUp/get?id=' + id; global.asyncGet(url, function (data) { if (data != null) { isFirstOpen = true; $("#cnvcName1").val(data.cnvcName); $("#cnvcFiscalCode1").val(data.cnvcFiscalCode); $("#consultId").val(data.consultId); $("#signupGrade").val(data.signupGrade); } }); $('#importWindowRecycle').modal({ backdrop: 'static' }); } (104) 总结formData var form = $("#importFormCount")[0]; var formData = new FormData(form); 只能获取input里面的对应属性值,其他值一律不会被加进去 (105) 前端遍历的方法,例子如下 $.each(data.itExpFlineImpulseSignupContracts, function (index, entry) { $("#addfiles").after(' }); 只需要对集合赋值之后,前台获取值就可以直接调用 (106) dataTable和实体和数据库的关系如下 dataTable的js要与Jsp的列一一对应 dataTable返回的数据要与数据库名称对应,且要有实体的Get方法 (107) dataTable错误代码 7是服务器内部错误或者路径出错 4是jsp页面与dataTables的列不对应 3是重复初始化一个dataTable (108) 在Service层需要添加@TranSaction注解来解决事务的问题 (109) 按tab键可以逐次获取页面表单的焦点,但是有时候我们需要指定获取焦点顺序,或者某些元素不需要获取焦点, 这时候可以使用 tabindex 属性。 (110) 第一种方法 // 初始化运价表格 function priceIntiTable(){ var table = $('#priceTable'); var url = global.rootPath + '/auth/pi/piSoftSprintPolicy/findPagePrice'; var dt = table.on("page.dt", function () { $loading().showLoading(); }).DataTable({ "language": { "url": global.languageUrl }, "processing": false, "serverSide": true, "deferLoading": 1, "ordering": false, "scrollX": true, "ajax": { url: url }, "createdRow": function ( row, data, index ) { debugger //row代表表格的每一行,每行数据都会进入这个方法走一遍 if(data.rown == 1 && data.maxnum != 1){ $(row).find("td").eq(7).attr('rowspan', data.maxnum); $(row).find("td").eq(8).attr('rowspan', data.maxnum); $(row).find("td").eq(9).attr('rowspan', data.maxnum); $(row).find("td").eq(10).attr('rowspan', data.maxnum); } if(data.rown != 1 && data.maxnum != 1){ $(row).find("td").eq(7).remove(); $(row).find("td").eq(9).remove(); } }, "columns": [ { data: "dep" }, { render: getDestCombine }, { render: getFlight }, { data: "airline" }, { render: getGoodsType }, {data:"transType", render: function(data, type, row, meta) { if (data == 1){ return "直达"; }if (data == 2){ return "始发中转"; }else { return "*"; } return data; } }, { data: "remark" }, { data: "aExamWeight" }, { data: "aRefundRate" }, { data: "bExamWeight" }, { data: "bRefundRate" }, {data:"refundWay", render: function(data, type, row, meta) { if (data == 1){ return "全额返点"; }if (data == 2){ return "增量返点"; } return data; } }, { render: formatTimeSlot }, { data: "agents", render: (a,b,c) => Constructors.buildTagA({ text: "查看列表", click: () => showAgentList(c.policyId) }) }, {data: "status", render: (data, type, full) => PriceHelperInter.doStatus(full.effEndDate, data)}, { render: getPolicy } ], "scrollX": true, dom: '<"toolbar">rtpl', "lengthMenu":[10,20,50,100,200,500], initComplete: function () { } }); } 第二种方法: DataTable.init('#priceTable', { url: global.rootPath + '/auth/pi/piSoftSprintPolicy/findPagePrice', isLazyLoading:true, createdRow:{ }, columns: [ { data: "dep" }, { render: getDestCombine }, { render: getFlight }, { data: "airline" }, { render: getGoodsType }, {data:"transType", render: function(data, type, row, meta) { if (data == 1){ return "直达"; }if (data == 2){ return "始发中转"; }else { return "*"; } return data; } }, { data: "remark" }, { data: "aExamWeight" }, { data: "aRefundRate" }, { data: "bExamWeight" }, { data: "bRefundRate" }, {data:"refundWay", render: function(data, type, row, meta) { if (data == 1){ return "全额返点"; }if (data == 2){ return "增量返点"; } return data; } }, { render: formatTimeSlot }, { data: "agents", render: (a,b,c) => Constructors.buildTagA({ text: "查看列表", click: () => showAgentList(c.policyId) }) }, {data: "status", render: (data, type, full) => PriceHelperInter.doStatus(full.effEndDate, data)}, { render: getPolicy } ] }); (111) 解决服务器端乱码或者本地乱码的情况,可以从这四种方式解决 第一种是设置系统的编码格式要utf-8 第二种是数据库的格式要utf-8 第三种是对字符串实现强转 第四种直接改sever.xml文件,加多一个utfEncode="utf-8" (112) 前端传到后台的一般是字符串的形式,不能是对象,所以需要把对象转为字符串的形式,例子如下 var formdata = $("#serachData").serializeObject(); if ($('#serachData input[name=unittype]:eq(0)').is(':checked')) { formdata.unittype = '1'; } else if ($('#serachData input[name=unittype]:eq(1)').is(':checked')) { formdata.unittype = '2'; }else { formdata.unittype = ''; } var url = global.rootPath + '/auth/ticket/tStockDetail/exportExcel?'; for(var key in formdata){ url += key + "=" + formdata[key] + "&"; } window.location.href = url.substring(0, url.length-1); break; ');
' + entry.prefix + ' ' + entry.tNo + ' ' + entry.attachname + ' 删除