Chuenhung的个人网站

chuenhung.github.io

上次去泰国清迈的时候玩了滑翔机,但是视频文件有点大,平时也有点小忙,视频一直没剪辑,今天下午总算搞完了,视频如下:

阅读全文 »

前言

如果说走就走,会不会颠覆了这时光,天南地北,一场美梦

作为地道码农,看着这么美的文字,很多时候是一种奢望。不过前两个月就有计划着来一场说走就走的旅行,考虑到国庆国内游客太爆,所以选择去东南亚

阅读全文 »

Redis保存对象的两种方式

一、序列化(实体需要实现Serializable接口)

  • 序列化就是将一个对象转换为二进制的数据流。这样就可以进行传输,或者保存到文件中。如果一个类的对象要想实现序列化,就必须实现serializable接口
    阅读全文 »

Java程序猿搬砖笔记(二)

作为码农平时搜集一些小知识点个人认为是个不错的习惯,书上说

好记性不如烂笔头

我想即使是以前忽略或者新get的很简单的东西,自己动手记下来不管如何印象也会更深刻。

1、jQuery常用的选择器整理
$(":first");//匹配第一个元素
$(":last");//匹配最后一个元素
$(":eq(index)");//在匹配的集合中选择索引值为index的元素
$(":gt(index)");//在匹配的集合中选择索引值大于index的元素
$(":even");//选择索引值为偶数的元素,从0开始计数
$(":odd");//选择索引值为奇数的元素,从0开始计数
$(“parent>child”);//子选择器:选择所有指定"parent"元素中指定的"child"的直接子元素
$(“ancestor decendant”);//后代选择器:选择给定的祖先元素的所有后代元素,一个元素的后代可能是该元素的一个孩子,孙子,曾孙等
$(“prev +next”);//相邻兄弟选择器:选择所有紧接在"prev"元素后的"next"元素
$(“prev ~sibings”);//一般兄弟选择器:匹配"prev"元素之后的所有兄弟元素

2、MyBatis批量更新
sql列子:

1
2
3
4
5
6
7
8
9
10
11
12
UPDATE course
SET name = CASE id
WHEN 1 THEN 'name1'
WHEN 2 THEN 'name2'
WHEN 3 THEN 'name3'
END,
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3)

在做编辑订单功能(现在想想都是一场噩梦)时,折腾了这个操作,java代码如下:

1
int updateBatch(@Param("detailList")List<ThOrderDetail> detailList);

注:MyBatis默认会把所有集合封装为"list",如果要自定义参数名需要用@Param注解

MyBatis代码如下:

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
<update id="updateBatch" parameterType="java.util.List">
update th_order_detail
<trim prefix="set" suffixOverrides=",">
<trim prefix="unit_price =case" suffix="end,">
<foreach collection="detailList" item="item" index="index">
<if test="item.unitPrice !=null">
when ord_detail_id=#{item.ordDetailId} then #{item.unitPrice}
</if>
<!--原数据-->
<if test="item.unitPrice == null">
when ord_detail_id=#{item.ordDetailId} then th_order_detail.unit_price
</if>
</foreach>
</trim>
<trim prefix="negative_interval_percentage =case" suffix="end,">
<foreach collection="detailList" item="item" index="index">
<if test="item.negativeIntervalPercentage !=null">
when ord_detail_id=#{item.ordDetailId} then #{item.negativeIntervalPercentage}
</if>
<!--原数据-->
<if test="item.negativeIntervalPercentage == null">
when ord_detail_id=#{item.ordDetailId} then th_order_detail.negative_interval_percentage
</if>
</foreach>
</trim>
<trim prefix="positive_interval_percentage =case" suffix="end,">
<foreach collection="detailList" item="item" index="index">
<if test="item.positiveIntervalPercentage !=null">
when ord_detail_id=#{item.ordDetailId} then #{item.positiveIntervalPercentage}
</if>
<if test="item.positiveIntervalPercentage == null">
when ord_detail_id=#{item.ordDetailId} then th_order_detail.positive_interval_percentage
</if>
</foreach>
</trim>
<trim prefix="negative_interval_quantity =case" suffix="end,">
<foreach collection="detailList" item="item" index="index">
<if test="item.negativeIntervalQuantity !=null">
when ord_detail_id=#{item.ordDetailId} then #{item.negativeIntervalQuantity}
</if>
<if test="item.negativeIntervalQuantity == null">
when ord_detail_id=#{item.ordDetailId} then th_order_detail.negative_interval_quantity
</if>
</foreach>
</trim>
<trim prefix="positive_interval_quantity =case" suffix="end,">
<foreach collection="detailList" item="item" index="index">
<if test="item.positiveIntervalQuantity !=null">
when ord_detail_id=#{item.ordDetailId} then #{item.positiveIntervalQuantity}
</if>
<if test="item.positiveIntervalQuantity == null">
when ord_detail_id=#{item.ordDetailId} then th_order_detail.positive_interval_quantity
</if>
</foreach>
</trim>
</trim>
where ord_detail_id in
<foreach collection="detailList" index="index" item="item" separator="," open="(" close=")">
#{item.ordDetailId}
</foreach>
</update>

执行代码后,打印出的sql如下:

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
update 
th_order_detail
set
unit_price =
case
when ord_detail_id = 252
then 25.55
when ord_detail_id = 253
then 35.55
end,
order_price =
case
when ord_detail_id = 252
then 383.25
when ord_detail_id = 253
then 639.9
end,
negative_interval_percentage =
case
when ord_detail_id = 252
then 11.11
when ord_detail_id = 253
then 13.33
end,
positive_interval_percentage =
case
when ord_detail_id = 252
then 12.2
when ord_detail_id = 253
then 14.44
end,
negative_interval_quantity =
case
when ord_detail_id = 252
then 13.3335
when ord_detail_id = 253
then 15.6006
end,
positive_interval_quantity =
case
when ord_detail_id = 252
then 16.83
when ord_detail_id = 253
then 20.5992
end
where ord_detail_id in (252, 253) ;

参考链接

3、POI导出Excel

  • 测试方法:
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
public static void main(String[] args) throws IOException {
HSSFWorkbook workbook = new HSSFWorkbook();

HSSFCellStyle style = workbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

HSSFSheet sheet = workbook.createSheet("sheet");

HSSFRow row0 = sheet.createRow(0);
HSSFCell cell_00 = row0.createCell(0);
cell_00.setCellStyle(style);
cell_00.setCellValue("日期");
HSSFCell cell_01 = row0.createCell(1);
cell_01.setCellStyle(style);
cell_01.setCellValue("午别");

HSSFRow row1 = sheet.createRow(1);
HSSFCell cell_10 = row1.createCell(0);
cell_10.setCellStyle(style);
cell_10.setCellValue("20191103");
HSSFCell cell_11 = row1.createCell(1);
cell_11.setCellStyle(style);
cell_11.setCellValue("上午");

HSSFRow row2 = sheet.createRow(2);
HSSFCell cell_21 = row2.createCell(1);
cell_21.setCellStyle(style);
cell_21.setCellValue("下午");

// 合并日期占两行(4个参数,分别为起始行,结束行,起始列,结束列)
// 行和列都是从0开始计数,且起始结束都会合并
// 这里是合并excel中日期的两行为一行
CellRangeAddress region = new CellRangeAddress(1, 2, 0, 0);
sheet.addMergedRegion(region);

File file = new File("E:\\demo.xls");
FileOutputStream fout = new FileOutputStream(file);
workbook.write(fout);
fout.close();
}

实现效果如下:

日期 午别
20191103 上午
下午

参考链接

  • 项目中导出xcel例子:
    客户给出的表格需要统计对上游付款总金额和对下游付款总金额(大于的为占用金额),然后根据这个占用金额去计算利息
    有两个要求:1、第一行需要显示用款和付款 2、后面如果日期相同也要显示到同一行
    这个用sql查询出来后还需要Java代码处理,总之这是今年做的最坑的需求之一(搞死开发者却不一定实用)。
    后台打印出的sql如下:
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
#分组前sql
select
*
from
(
(select
p.amount as amount,
ifnull(p.payment_date, p.add_time) as payment_date,
p.contract_id as contract_id,
c.type as type
from
payment_bond p
inner join contract c
on p.contract_id = c.contract_id
and p.state != 2
and c.type in (1, 2)
and p.entrust_id = 116)
union
all
(select
s.amount as amount,
ifnull(s.payment_date, s.add_time) as payment_date,
s.contract_id as contract_id,
c.type as type
from
settlement_apply s
inner join contract c
on s.contract_id = c.contract_id
and s.status in (0, 1, 3)
and c.type in (1, 2)
and s.entrust_id = 116)
) b
order by b.payment_date asc

分组前数据库返回结果:
在这里插入图片描述
类型为1是采购合同,也就是对上游付款的信息,类型为2的是销售合同,也就是对下游收款的数据。可以看出同一类型同一天的数据还没有合并起来。所以还需要对这个查询结果再分组求和,sql如下:

1
2
3
4
5
6
7
8
#分组后sql
select
sum(amount) as amount,
payment_date,
type
from
(上面的sql) bb
group by bb.payment_date,bb.type ;

分组后数据库返回结果:
在这里插入图片描述
费了九牛二虎之力然而仅仅是开始,在java代码中还需要实现[1、第一行需要显示用款和付款 2、后面如果日期相同也要显示到同一行]这两个要求。大致思路是先定义一些全局的变量来记录上一条数据和第一条数据,找到第一条后再去看后面是不是有时间相同的,controller的核心代码如下:

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
if(!ObjectUtils.isNullObj(paymentBondViewVos)){
//百分比
NumberFormat numFormat = java.text.NumberFormat.getPercentInstance();
numFormat.setMaximumIntegerDigits(3);
numFormat.setMaximumFractionDigits(2);
double payAmount = 0d;//支出金额
double receiptAmout = 0d;//收入金额
int type=0;//上一次合同类型(是否第一次)
boolean alreadySet=false;//已找到第一条
int lastType=0;//上一次合同类型(循环后)
Date lastDate=null;//上一次日期
double lastAmout=0.0;//上一次金额
int size = paymentBondViewVos.size();
for(int i = 0; i < size; i++){
PaymentBondViewVo paymentBondViewVo = paymentBondViewVos.get(i);
int typeTmp = paymentBondViewVo.getType();//当前合同类型
if(i==0){
type = typeTmp;
row = sheet.createRow(4);
if(typeTmp==1){
row.createCell(0).setCellValue(sdf.format(paymentBondViewVo.getPaymentDate()));
row.createCell(1).setCellValue(paymentBondViewVo.getAmount());
payAmount = DoubleUtil.preciseAdd(payAmount, paymentBondViewVo.getAmount(), 2);
}
if(typeTmp==2){
row.createCell(2).setCellValue(sdf.format(paymentBondViewVo.getPaymentDate()));
row.createCell(3).setCellValue(paymentBondViewVo.getAmount());
receiptAmout = DoubleUtil.preciseAdd(receiptAmout, paymentBondViewVo.getAmount(), 2);
}
}else{
Date paymentDate = paymentBondViewVo.getPaymentDate();
//占用天数
int daysOfUse = 0;
if(type!=typeTmp&&alreadySet==false){//第一条数据展示
alreadySet=true;
row = sheet.getRow(4);
if(typeTmp==2){//采购商后付款
daysOfUse = daysBetween(lastDate,paymentDate);
}
}else if(ObjectUtils.equals(sdf.format(lastDate),sdf.format(paymentDate))){//时间相同的合并到一列
int lastRowNum = sheet.getLastRowNum();
row = sheet.getRow(lastRowNum);
//获取excel上一行的时间并计算占用天数
daysOfUse = calculateDaysOfUse(sheet,lastRowNum-1,sdf,paymentDate);
}else{//正常处理
int lastRowNum = sheet.getLastRowNum();
row = sheet.createRow(lastRowNum+1);
//获取excel上一行的时间并计算占用天数
daysOfUse = calculateDaysOfUse(sheet,lastRowNum,sdf,paymentDate);
}
if(typeTmp==1){
row.createCell(0).setCellValue(sdf.format(paymentDate));
row.createCell(1).setCellValue(paymentBondViewVo.getAmount());
payAmount = DoubleUtil.preciseAdd(payAmount, paymentBondViewVo.getAmount(), 2);
}
if(typeTmp==2){
row.createCell(2).setCellValue(sdf.format(paymentDate));
row.createCell(3).setCellValue(paymentBondViewVo.getAmount());
receiptAmout = DoubleUtil.preciseAdd(receiptAmout, paymentBondViewVo.getAmount(), 2);
}
//支出金额大于收入金额
if(Double.compare(payAmount, receiptAmout)==1){
double advancePayment = DoubleUtil.preciseSub(payAmount,receiptAmout, 2);
//利息=占用金额*占用天数*年化/应付利息天数
double tmp = DoubleUtil.preciseMul(DoubleUtil.preciseMul(advancePayment,Constant.ANNUALIZED),Double.valueOf(daysOfUse));
double interestAmount = DoubleUtil.preciseDev(tmp,Double.valueOf(Constant.INTERESTDAYS));

row.createCell(4).setCellValue(advancePayment);
row.createCell(5).setCellValue(daysOfUse);
row.createCell(7).setCellValue(interestAmount);
}
}
row.createCell(6).setCellValue(numFormat.format(Constant.ANNUALIZED));//年化
lastType=paymentBondViewVo.getType();//上一次合同类型(循环后)
lastDate=paymentBondViewVo.getPaymentDate();//上一次日期
lastAmout=paymentBondViewVo.getAmount();//上一次金额
}
}

只贴出了封装数据代码 (省略查询委托 合同 设置表头 合并单元格以及循环设置单元格样式等代码)。这样以后就导出需要的表格了,效果图如下:
在这里插入图片描述
然而作死把浏览器设置为英文后出现文件名乱码了,如下所示:
在这里插入图片描述
需要在浏览器的header中对中文重新进行编码:

1
String codedFileName = java.net.URLEncoder.encode(fileName, "UTF-8");

这样一来,总算搞定了。。。
4、登录时返回之前的链接
在Spring中做如下配置:

1
2
3
4
5
6
<!-- 记录登录返回路径 -->
<mvc:interceptor>
<mvc:mapping path="/mcmall/**"/>
<mvc:mapping path="/foodmall/**"/>
<bean class="com.itonghui.filter.RecordLoginInterceptor"/>
</mvc:interceptor>

Java代码如下:

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
public class RecordLoginInterceptor extends HandlerInterceptorAdapter {
private static final Logger LOGGER = LoggerFactory.getLogger(RecordLoginInterceptor.class);

/**
* 如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller 然后进入拦截器链
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
SysUser user = (SysUser) SecurityUtils.getSubject().getPrincipal();
String url = "";
if ((request.getMethod().equalsIgnoreCase(WebContentGenerator.METHOD_POST) || ServerInfo.isAjaxs(request))) {
return true;
}else{
url = request.getRequestURI();
String queryString =request.getQueryString();
if(StringUtils.isNotBlank(queryString)){
url =url+"?"+queryString;
}
}
if(!ObjectUtils.isNullObj(user)){//已登录
return true;
}
HttpSession session = request.getSession();
session.setAttribute(Constant.HISTORY_URL,url);
return true;
}
}

Java程序猿搬砖笔记(一)

作为码农平时搜集一些小知识点个人认为是个不错的习惯,书上说

好记性不如烂笔头

我想即使是以前忽略或者新get的很简单的东西,自己动手记下来不管如何印象也会更深刻。

这篇笔记截至时间2019年11月3日。

1、Tomcat设置jvm

1
-Xms128m -Xmx1024m -XX:MaxPermSize=512m

2、el表达式判断字符串是否为空
${值 eq null or 值 eq ’ '} 返回true 的话,表示为空。例:

1
test="${company.custName eq  null or company.custName eq ' '}"

${empty 值} 返回true ,表示为空字符串。例:

1
test="${empty  company.custNam}"

用empty方法更好,el表达式封装了

3、el表达式判断
==、eq、//相等
!=、ne、// 不相等(inequality)
<、lt、//小于(less than)
>、gt、//大于(greter than)
<=、le、//小于等于(less equal)
>=、ge。//大于等于(greter equal)
例子:判断传过来的值是否大等于2

1
test="${product.validity ge 2}"

4、MyBatis遍历集合

1
2
3
<foreach collection ="array" item="classIds" open="(" separator="," close=")">
#{classIds}
</foreach >

MyBatis foreach的collection参数可以是java的Array或者List
5、 jQuery的data()方法,相比attr()更安全
访问id为test的元素 的data-name属性例子:

1
$('#test').data("name"); 

6、数据库权限问题

  • cmd进入mysql/bin目录下后,mysql -u root -p并输入密码登陆
  • grant all privileges on . to root@"%" identified by “.”; 注意root替换为报的错
  • flush privileges;

7、MySQL的date_format函数用法
语法如下:

1
date_format(now(),'%Y-%m-%d %H:%i:%s')<结束时间

  参考链接

8、MyBatis中小于号都要写成&lt;大于号可以不用转

9、MyBatis传入参数为0被误认为是空字符串,解决方法是去掉等于0的判断

10、JavaScript保留两位小数方法

1
2
3
4
5
6
7
8
function toDecimal(x) {
var f = parseFloat(x);
if (isNaN(f)) {
return;
}
f = Math.round(x*100)/100;
return f;
}

11、jQuery判断checkbox是否选中的一些方法
方法一:

1
2
3
if ($("#checkbox-id").get(0).checked) {
// do something
}

方法二:

1
2
3
if ($("#checkbox-id")[0].checked) {
// do something
}

方法三(建议):

1
2
3
if($('#checkbox-id').is(':checked')) {
// do something
}

12、checkbox赋值方法

1
$("#checkbox-id").prop("checked",true);

13、JavaScript页面加载前调用的一些方法
方法一:

1
2
3
$(function(){
//do something
})

方法二:

1
2
3
$(document).ready(function () {
//do something
});

方法三:

1
2
3
if(document.readyState=="complete"){
//do something
}

14、判断页面元素是否显示
  参考链接

15、加红色样式

1
2
<font color="red">测试</font>
<span style="color:red">测试</span>

16、连续数字或字母换行

1
style="word-break:break-all; width:200px; overflow:auto;"

17、表格内容过长时截取显示

1
<span title="鼠标放上去显示的内容">实际显示的内容</span>

18、科学计数法格式化
Java 返回字符串:

1
2
3
4
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
df.setMinimumFractionDigits(2);//强制保留两位小数
String productPrice= df.format(productViewVo.getProductPrice());

注意这种方法还需要替换","

JavaScript简单粗暴的方法 返回字符串

1
2
3
4
5
6
7
8
var formatScientificNumber = function(value){
let result = String(value);//可以用0.0000001测试
if (result.indexOf('-') >= 0) {
result = '0' + String(Number(result) + 1).substr(1);
}
return result;
}
console.log(result);

19、输入框限制只能输入数字

1
onkeyup="this.value=this.value.replace(/[^\d]/g,'')" 

20、jQuery需要用text()取span的值

21、jQuery获取table的所有tr以及td

1
2
3
4
5
$('#tabbleId tr').each(function(i){          // 遍历 tr
$(this).children('td').each(function(j){ // 遍历tr的各个td
alert("第"+(i+1)+"行,第"+(j+1)+"个td的值:"+$(this).text()+"。");
});
});

22、MySQL的concat_ws(sperator,str1,str2,str…)、concat()、repeat()方法

  • concat_ws()方法可以将两个字段的值拼接起来,它的本意是有分隔符的字符串连接。但要注意为null的情况(不然整个都会为null)
    例子:
    1
    concat_ws(c.city_code,'',ifnull(c.company_address,''))
  • concat()函数可以连接一个或者多个字符串,只要一个为null就会返回Null
  • repeat()函数用来复制字符串,比如select repeat(‘ab’,2);//abab

23、MySQL删除所有表数据(不是删除数据库)
返回所有drop table语句语法:

1
2
3
SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
FROM information_schema.tables
WHERE table_schema = 'saas_mcjd';

24、将Double类型的数据保留2位小数

1
2
3
Double a = 2.34566; 
BigDecimal bd = new BigDecimal(a);
Double d = bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

d输出就是2.35, 注意会四舍五入

25、将String转Double,并保留2位小数

1
2
3
4
String a =6.145”; 
Double d= Double.parseDouble(a);
DecimalFormat df = new DecimalFormat(“0.00”);
String s = df.format(d);

s输出就是6.15,注意会四舍五入

26、JavaScript修改网页标题
可以在页面加载完时执行下面的代码

1
document.title ="产品详情"

27、JavaScript比较时间大小

1
2
3
4
function CompareDate(d1,d2)
{
return ((new Date(d1.toString().replace(/-/g,"\/"))) < (new Date(d2.toString().replace(/-/g,"\/"))));
}

28、页面定期刷新

1
setInterval(func,time);

29、JSP根据参数默认选中radio

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<tr>
<td class="va-m text-right text-dark6" width="20%">是否集团审批:</td>

<td colspan="3">
<div class="checkbox checkbox-circle mn">
<input type="radio" name="isApproval" id="isApproval" value="1" <c:if test="${businessModeViewVo.isApproval eq 1}">checked</c:if>/>
<label class="font-bolder" for="isApproval">需要</label>
</div>
<div class="checkbox checkbox-circle mn ml10">
<input type="radio" name="isApproval" id="noIsApproval" value="2" <c:if test="${businessModeViewVo.isApproval eq 2}">checked</c:if>/>
<label class="font-bolder" for="noIsApproval" >不需要</label>
</div>
</td>
</tr>

关键代码:

1
<c:if test="${businessModeViewVo.isApproval eq 2}">checked</c:if>

30、页面元素的禁用与启用
禁用:

1
2
3
$("#id").attr("disabled","true");  
$("#id").attr("disabled",true);
$("#id").attr("disabled","disabled");

启用:

1
2
$("#id").removeAttr("disabled");  
$("#id").attr("disabled",false);

注意:$("#id").attr(“disabled”,“false”);不起作用,disabled只能禁用button,对超链接不起作用

31、handlebars 时间格式化

1
<td>{{dateFormat addTime 'YYYY-MM-DD HH:mm:ss'}}</td>

32、handlerbars判空,if 和unless

1
2
3
{{#if logisticsId}}
<a type="button" class="text-button text-blue3 pr10" data-toggle="tooltip" data-placement="left" onclick="seeDetail('{{logisticsId}}')" >查看</a>
{{/if}}

它是尝试去读取logisticsId属性,如果返回的为undefined、null、""、[]、false任意一个,都会导致最终结果为假。unless和if正好相反,当返回false的时候执行。

33、正则校验所有输入框

1
2
3
4
5
6
7
8
9
 $("input[name='unitPrice']").each(function(){
var unitPrice = $(this).val();
var reg = /^([1-9][\d]{0,7}|0)(\.[\d]{1,2})?$/;
var reslut = unitPrice.match(reg);
if(reslut==null){
toastrWarning('无效金额,整数8位,小数2位,示例:247.23');
return false;
}
});

34、

1
2
var htm = $($('#checkMethodDiv').html()); htm[0].outerHTML;//1     
var htm = $('#checkMethodDiv');htm.html();//2

1返回的是文本 整个返回的貌似是一个对话框对象
2返回的是document对象

35、禁止textarea拉伸

1
style="resize:none"

36、做申请开票的时候,订单列表从表格中删除了,但下次点申请开票时还在。使用空串替换某一个订单号,则是可以实现去除指定字符串功能。

1
orderIds = orderIds.replace(orderId+","," ");

37、登陆后跳回原来的页面的问题
思路:点击登录的时候用一个SpringMVC获取到当前url,并把其放到session中,登陆后从session中取出url 清空后跳转

38、jQuery在不知道数组元素下标的时删除数组元素

1
2
3
if($.inArray(templateId.toString(),templateIdSelected)>=0){
templateIdSelected.splice($.inArray(templateId.toString(), templateIdSelected), 1)
}
  • $.inArray(),函数用于在数组中查找指定值,并返回它的索引值(如果没有找到,则返回-1),源数组不受影响
  • arrayObject.splice(index,howmany,item1,…,itemX)
    index: 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
    howmany: 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
    item1, …, itemX: 可选。向数组添加的新项目。
    splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。

39、JSP千分位

1
2
3
<fmt:formatNumber value="${subscriptionMoney }" pattern="#,###.####"/>	
subscriptionMoney.replace(/(?<=\d)(?< !.\d*)(?=(\d{3})+(.|$))/g,',');
paymentFee.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')

40、数组需要JSON格式化传到后台,不能直接用隐藏域

1
2
var data = $('#settlementForm').serializeJson();//不是serialize();
data.fileAttachIds = $("#uploader2").catUpload("getUniqueId");
1
2
3
url : '/member/purchaseentrustmgr/ajaxpaybond',
contentType:"application/json",
data : JSON.stringify(data),

41、Java千分位

1
2
DecimalFormat df = new DecimalFormat("#,###.00");	//0用于小数部分,不足补0.
System.out.println(df.format(vo.getStockPrice()));

参考链接

42、在使用removeAttr()移除了radio的checked属性后,使用attr()重新增加不起作用

1
2
$("#invoiceStatus2").prop("checked","checked");
$("#invoiceStatus1").removeAttr("checked");

即使用prop()可重新配置上该属性, 具有 true 和 false 两个属性的属性,如 checked, selected 或者 disabled 使用prop(),其他的使用 attr()

43、MySQL查询一张表的详细信息(注释)

1
2
3
4
show full columns from 表名;

use information_schema;
select * from information_schema.columns where table_schema ='数据库名' and table_name = '表名' (and column_name='CONTRACT_status' limit 1)

44、查询MySQL创建表的sql

1
show create table 表名

45、textarea开始标签和结束标签中间不要有“回车”。 否则内容不是从头开始的

46、JavaScript科学计数法还原
方法一:

1
2
3
4
5
6
const a = 0.00000001;
let result = String(a);
if (result.indexOf('-') >= 0) {
result = '0' + String(Number(result) + 1).substr(1);
}
console.log(result);

方法二:

1
2
3
4
function toNonExponential(num) {
var m = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/);
return num.toFixed(Math.max(0, (m[1] || '').length - m[2]));
}

47、textarea没有value属性

1
<textarea id="summary" name="summary" rows="8" cols="50" "><%= summary %></textarea>

48、MySQL不等于null语法is not null,MySQL等于null语法is null

49、JavaScript正则匹配

1
2
3
4
var reg = RegExp(/^[0-9a-zA-Z_]+$/);
if(!material.match(reg)){
alert("内部料号为数字、字母、下划线或三者组合");
}

50、jQuery获取选中值

1
2
3
4
//获取radio checkbox选中值
var item = $('input[name=items][checked]').val();
//获取option选中值
var item = $("select[name=items] option[selected]").text();

51、MyBatis 的<trim/>标签
prefix 给sql语句拼接的前缀 suffix 给sql语句拼接的后缀
prefixOverrides 去除sql语句前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定,假设该属性指定为"AND",当sql语句的开头为"AND",trim标签将会去除该"AND"
suffixOverrides 去除sql语句后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定

52、MySQL的group_concat()函数默认拼接字符串长度是1024,可以手动设置。 做双贸项目分组查了分类下的所有扩展属性,后面分类多了肯定出问题😂

53、jQuery的on()方法不起作用的解决方法。双贸前台商品列表扩展属性监听用到

1
2
$(document).on('click','.attrList li',function () {
}

这种方法每次执行点击事件 的时候,它会先找到document对象,然后去检测有没有子对象,如果有的话,他就将事件给到子对象,子对象得到该事件之后就开始触发事件后面的方法

54、MyBatis返回List只需要resultType="java.lang.String"就可以了

55、jQuery下拉框默认选中

1
$("#businessModeAll option[businessId='104']").prop("selected",true); 

其中businessId是自定义属性,正常用value就可以了。attr方法正常取属性值:

1
$("#businessModeAll option:selected").attr("businessId");

56、

1
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

这个月份和分钟一个是大写M一个是小写m,不能混用不能混用不能混用,不然会出现离奇解析错误;H表示小时按24小时制,h不按24小时制

0%