Youzi的知识库 - 2021年12月
type: channel
link: https://knowledge.autisn.com/index.php/2021/12
description: 关于一个菜鸟的成长过程
items: JS 手机号码脱敏处理
items: jQuery on() 和 click() 的区别
items: 数据结构（王道论坛）
items: Tomcat乱码问题
items: Excel导入和导出功能的实现
items: Java接口
items: Java抽象类
items: InnoDB和MyISAM的区别
items: IDEA激活-试用30天-自动激活
items: Datatables常用操作

JS 手机号码脱敏处理
type: item
date: 2021-12-31T10:32:15+08:00
description: 我们在开发前端项目时，一般会对用户敏感信息（如姓名、手机号码、身份证号码）进行脱敏处理。本文以手机号码脱敏处理为例进行说明。如 13366668888 脱敏处理后变成 133****8888。具体处理方法如下：/**手机号码脱敏处理 * @method phoneDesensitization * @param {String} phone 需要处理的手机号码 * @param {String} char 脱敏替换的字符 * @return {String} 脱敏处理后的手机号码 */ function phoneDesensitization(phone, char) { return phone.replace(/(\d{3})\d*(\d{4})/, `$1${new Array(5).join(char)}$2`) }需要调用的地方直接调用：console.info(phoneDesensitization('13366668888', '*')) // => 133****8888 console.info(phoneDesensitization('13366668888', '密')) // => 133密密密密8888说明：这里主要使用了正则表达式的 分组 和 $1,$2 的方法。通过 () 对字符串进行分组，$相当于下标从1开始的集合，$n相当于对应第n个索引的值。/(\d{3})\d*(\d{4})/ 相当于把字符串前3个和后4个字符分为两个集合，$1${new Array(5).join(char)}$2 相当于保留前3后4的字符后，替换剩下字符串为新字符串 new Array(5).join(char)。

jQuery on() 和 click() 的区别
type: item
date: 2021-12-30T13:29:59+08:00
description: on() 和 click() 的区别:二者在绑定静态控件时没有区别，但是如果面对动态产生的控件，只有 on() 能成功的绑定到动态控件中。以下实例中原先的 HTML 元素点击其身后的 Delete 按钮就会被删除。而动态添加的 HTML 元素，使用 click() 这种写法，点击 Delete 按钮无法删除；使用 On() 方式可以。HTML 展示jQuery中on()和click()的区别 点击生成新按钮。NewOn生成的Delete按钮行为用on()实现，NewClick生成的Delete按钮行为用click()实现。 NewOn NewClick 原先的HTML元素on Delete 原先的HTML元素click Delete JS$("#newclick").click(function(){ $(".li").append(' 动态添加的HTML元素click Delete '); }); $("#newon").click(function(){ $(".li").append(' 动态添加的HTML元素on Delete '); }); $(".delete").click(function(){ $(this).parent().remove(); }); $(".li").on('click', ".deleteon", function(){ $(this).parent().remove(); }) $(".deleteclick").click(function(){ $(this).parent().remove(); });

数据结构（王道论坛）
type: item
date: 2021-12-30T11:17:00+08:00
description: 1.1数据结构的基本概念数据结构：是相互之间存在一种或多种特定关系的数据元素的集合。数据对象：是具有相同性质的数据元素的集合，是数据的一个子集。数据结构的三要素：逻辑结构，物理结构（存储结构），数据的运算逻辑结构：集合，线性结构，树形结构，网状结构物理结构（存储结构）（会影响数据运算速度）：顺序存储（物理相邻连续的），链式存储（指针），索引存储（索引表），散列存储（哈希存储）数据的运算：施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑机构的，指出运算的功能；运算的实现是针对存储结构的，指出运算的具体操作步骤。数据类型数据类型是一个值的集合和定义在此集合上的一组操作总称。原子类型。其值不可再分的数据类型结构类型。其值可以再分解为若干成分（分量）的数据类型抽象数据类型（ADT）是抽象数据组织及与之相关的操作。1.2.1算法的基本概念程序 = 数据结构 + 算法算法必须具备的特性有穷性：一个算法必须总在执行有穷步之后结束，且每一步都可在有穷时间内完成。注：算法必须是有穷的，而程序可以是无穷的确定性：算法中每条指令必须有确切的含义，对于相同的输入只能的书相同的输出。可行性：算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。输入：一个算法有零个或多个输入，这些输入取自于莫格特定的对象的集合。输出:一个算法有一个或多个输出，这些输出是与输入有着某种特定关系的量。”好“算法的特质正确性。算法应能正确的解决求解问题。可读性。算法应具有良好的可读性，以帮助人们理解。健壮性。输入非法数据时，算法能适当的做出反应或进行处理，而不会产生莫名其妙的输出结果。高效率与低存储量需求。执行速度快，时间复杂度低。不费内存，空间复杂度低。

Tomcat乱码问题
type: item
date: 2021-12-24T17:04:48+08:00
description: 修改Tomcat的server.xml文件，在Connector中加一句<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>完整的xml文件<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener"/> <!-- Security listener. Documentation at /docs/config/listeners.html <Listener className="org.apache.catalina.security.SecurityListener" /> --> <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/> <Listener className="org.apache.catalina.core.JasperListener"/> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/> <GlobalNamingResources> <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/> </GlobalNamingResources> <Service name="Catalina"> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads=…

Excel导入和导出功能的实现
type: item
date: 2021-12-22T10:59:00+08:00
description: 导出功能1、Jsp(一个按钮) 导出 2、Js$("#export").click(function(){ window.location.href =path+"/gc/riskBadAssets/exportExcel?filter=" + encodeURIComponent(JSON.stringify(filter)); });3、Controllerpackage com.ctbr.applet.controller.manage; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.ctbr.applet.service.IMpRewardListService; import com.ctbr.baseFrame.core.BaseController; import com.ctbr.baseFrame.model.AjaxResult; import com.ctbr.baseFrame.model.PageResult; import com.ctbr.baseFrame.service.IExcelService; import com.ctbr.baseFrame.util.UserContext; import net.sf.json.JSONArray; /** * 业绩管理 */ @Controller @RequestMapping(value = "/appletManage/mpReward") public class MpRewardListController extends BaseController { private static Logger logger = Logger.getLogger(MpRewardListController.class); @Resource private IMpRewardListService service; @ResponseBody @RequestMapping(value="/exportExcel") public void exportExcel(HttpServletResponse response,HttpServletRequest request){ String filter = request.getParameter("filter"); Map<String,Object> map = new HashMap<String,Object>(); String vague = null; try { if(getFilter(JSONArray.fromObject(filter)) == null || getFilter(JSONArray.fromObject(filter)).equals("")) { vague = getFilter(JSONArray.fromObject(filter)); } else { vague = new String(getFilter(JSONArray.fromObject(filter)).getBytes("ISO8859-1"), "UTF-8"); } } catch (Exception e) { logger.info("根据模糊匹配时导出excel表格时发生异常", e); } map.put("filter", vague); String titleList[] = {"奖励明细编号" , "业务编号" , "客户名称" , "业务日期"…

Java接口
type: item
date: 2021-12-21T17:50:00+08:00
description: java中的接口是类的蓝图。 它有静态常量和抽象方法。java中的接口是一种实现抽象的机制。 接口中只有抽象方法而不是方法体。接口用于在Java中实现抽象和多重继承。Java接口也表示IS-A关系。它不能像抽象类一样被实例化。为什么要使用Java接口？需要使用接口主要有三个原因。它用于实现抽象。通过接口，可以支持多重继承的功能。它可用于实现松耦合。Java 8，接口可以有默认和静态方法.换句话说，接口字段默认是public，static和final，方法默认是public和abstract。Java 8接口中的默认方法:从Java 8开始，我们可以在接口中有方法体。 但需要使其为默认方法。interface Drawable { void draw(); default void msg() { System.out.println("default method"); } } class Rectangle implements Drawable { public void draw() { System.out.println("drawing rectangle"); } } class TestInterfaceDefault { public static void main(String args[]) { Drawable d = new Rectangle(); d.draw(); d.msg(); } }执行上面代码，得到如下结果 -drawing rectangle default methodJava 8接口中的静态方法:从Java 8开始，我们可以在接口中有静态方法。interface Drawable { void draw(); static int cube(int x) { return x * x * x; } } class Rectangle implements Drawable { public void draw() { System.out.println("drawing rectangle"); } } class TestInterfaceStatic { public static void main(String args[]) { Drawable d = new Rectangle(); d.draw(); System.out.println(Drawable.cube(3)); } }执行上面代码，得到如下结果 -drawing rectangle 27Java嵌套接口注意： 一个接口中可以有另一个接口，即被称为嵌套接口。

Java抽象类
type: item
date: 2021-12-21T17:20:00+08:00
description: 在java中用abstract关键字声明的类称为抽象类。 它可以有抽象和非抽象方法(带主体的方法)。规则：如果在类中有任何抽象方法，那个类必须声明为抽象的。规则：如果你扩展任何具有抽象方法的抽象类，必须提供方法的实现或使这个类抽象化。Java中的抽象抽象是隐藏实现细节并仅向用户显示功能的过程。另一种方式，它只向用户显示重要的事情，并隐藏内部详细信息，例如：发送短信，只需输入文本并发送消息。您也不需要知道有关邮件传递的内部处理过程。抽象可以让你专注于对象做什么(实现的功能)，而不是它如何做。实现抽象的方法在java中有两种实现抽象的方法，它们分别是：抽象类(部分)接口 (完全)Java中的抽象类抽象类使用 abstract关键字声明的类被称为抽象类。需要扩展和实现它的方法。 它不能被实例化。abstract class A{};抽象方法一个被声明为 abstract 而没有实现的方法称为抽象方法。abstract void printStatus();抽象类的另一个真实场景抽象类也可以用于提供接口的一些实现。 在这种情况下，终端用户可能不会被强制覆盖接口的所有方法。

InnoDB和MyISAM的区别
type: item
date: 2021-12-20T17:47:00+08:00
description: InnoDB和MyISAM的区别 MyISAMInnoDB事务支持不支持支持数据行锁不支持（表锁）支持外键约束不支持支持全文索引支持不支持表空间的大小较小较大，约为2倍常规使用操作：MyISAM 节约空间，数度较快InnoDB 安全性高，事务的支持，多表多用户操作在物理空间存在的位置所有的数据库文件都存在data目录下，一个文件夹就对应一个数据库本质还是文件的存储！MySQL引擎在物理文件上的区别InnoDB 在数据库表中只有*.frm文件，以及上级目录下的bdatal文件MyISAM 对应文件*.frm 表结构的定义文件*.MYD 数据文件（data）*.MYI 索引文件（index）设置数据库表的字符集编码CHARSET=utf-8不设置的话，会是MySQL默认的字符集编码（不支持中文）MySQL的默认编码是Latin1，不支持中文在my.ini中配置默认编码character-set-server=utf-8

IDEA激活-试用30天-自动激活
type: item
date: 2021-12-06T16:28:30+08:00
description: 1、进入设置2、选择Plugins -> 点击齿轮，选择第一个3、点击+，填入https://plugins.zhile.io4、搜索并安装ide eval reset，installed后点击ok5、关闭setting界面，点击help，选择Eval Reset（如果没有，请重新进行上一步）6、点击复选框，设置为自动重置7、点击Reset -> 弹窗选择yes，重启IDE8、总结Settings/Preferences... -> Plugins 内手动添加第三方插件仓库地址：https://plugins.zhile.io -> 安装ide eval reset并使用

Datatables常用操作
type: item
date: 2021-12-03T18:06:52+08:00
description: 1、jsp和对应的js文件1.1js//页面初始化就加载 $(function() { //表格列 /** *dataTables开始** */ dataTables = $('#articleListTable').DataTable({ "language": { "info": "当前 _START_ - _END_ 条 共 _TOTAL_ 条", "paginate": { "sFirst": "首页", "sPrevious": " < ", "sNext": " >", "sLast": " 尾页 " }, "emptyTable": "没有符合条件的记录!", "lengthMenu": "显示 _MENU_ 条", "sZeroRecords": "没有找到匹配的记录", "sInfoEmpty": "" }, "aLengthMenu": [10, 20, 50, 100], "pagingType": "full_numbers", // 用于指定分页器风格 // "full_numbers"" or // ""two_button""， // default // ""two_button"" "bAutoWidth": true, "scrollX": true, "ajax": { "url": path + "/appletManage/mpArticle/queryPage", "type": "POST", "dataType": "json", "data": { filter : filter } }, "processing": true, "serverSide": true, "bLengthChange": true, "bSort": false, // 排序功能 "searching": false, "bStateSave": false, // 保留分页信息 "resetPaging": false, "dom": '<"top">t<"bottom"lip><"clear">', "columns": [ //数据对应的内容 {"data": "ord"}, {"data": "status_flag_nm"}, {"data": "thumbnail_url"}, {"data": "title"}, //操作按钮，样式靠右 {"data": "","class": "align-right"} ], "columnDefs": [ { "render": function(data, type, row, meta) { //序号列 return meta.row + 1 + meta.settings._iDisplayStart; }, "orderable": false, //表示第一列 "targets": 0 }, { //如果表格中要显示图片，可以修改样式 "render": function(data, type, row) { var html = " "; //缩略图 return html; }, "orderable": false, "targets": 2 }, { "render":function(data,type,full){ return " "+data+" "; }, "targets": 3 },{ "render": function(data, type, row, meta) { var html = "";//编辑按钮 html += ' '; html += ' '; if(row.status_flag == "Y"){ html += ' '; }else{ html += ' '; } html += ' '; html += ' '; html += ' '; return html; }, "orderable": false, "targets": 4 }] }); });1.2jsp 序号 显示状态 缩略图 标题 操作 2、上移下移操作2.1、js文件/** * 上移下移 * */ function updateOrd(id,type,ord,rowIndex){ if(dataTables.rows()&& dataTables.rows().data()){ var data = dataTables.rows().data(); var nextIndex = 0; if(type == "up" && rowIndex == 0 ){ $.zkbr.alert("错误信息", "已经是第一条数据"); return false; } if(type == "down" && rowIndex =…