❶ 输入框校验点
例:电话号码输入框:
1)正春圆则校验11位数字,且第一位以1开头,且第二位大于2
2)不允许输入非数字类型的任何(耐让包含回车、空格、特殊字符)内容
3)需要对非法字符做检验,并做提示框信息提示:提示文案越详细越好
4)校验复制粘贴操作,是否能输入非法字昌森局符
5)建议这些校验规则在server端和前端同时进行处理
6)根据具体交互规则在做相应调整
❷ 求前端验证js代码
这是一般表单中会用到的 1. 长度限制
<script>
function test()
{
if(document.a.b.value.length>50)
{
alert(”不能超过50个字符!”);
document.a.b.focus();
return false;
}
}
</script>
<form name=a onsubmit=”return test()”>
<textarea name=”b” cols=”40″ wrap=”VIRTUAL” rows=”6″></textarea>
<input type=”submit” name=”Submit” value=”check”>
</form>
2. 只能是汉字
<input onkeyup=”value=”/oblog/value.replace(/[^\u4E00-\u9FA5]/g,”)”>
3.” 只能是英文
<script language=javascript>
function onlyEng()
{
if(!(event.keyCode>=65&&event.keyCode<=90))
event.returnvalue=false;
}
</script>
<input onkeydown=”onlyEng();”>
4. 只能是数字
<script language=javascript>
function onlyNum()
{
if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)))
//考虑小键盘上的数字键
event.returnvalue=false;
}
</script>
<input onkeydown=”onlyNum();”>
5. 只能是英文字符和数字
<input onkeyup=”value=”/oblog/value.replace(/[\W]/g,””) “onbeforepaste=”clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,”))”>
6. 验证邮箱格式
<SCRIPT LANGUAGE=javascript RUNAT=Server>
function isEmail(strEmail) {
if (strEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
return true;
else
alert(”oh”);
}
</SCRIPT>
<input type=text onblur=isEmail(this.value)>
7. 屏蔽关键字(这里屏蔽***和****)
<script language=”javascript1.2″>
function test() {
if((a.b.value.indexOf (”***”) == 0)||(a.b.value.indexOf (”****”) == 0)){
alert(”:)”);
a.b.focus();
return false;}
}
</script>
<form name=a onsubmit=”return test()”>
<input type=text name=b>
<input type=”submit” name=”Submit” value=”check”>
</form>
8. 两次输入密码是否相同
<FORM METHOD=POST ACTION=”">
<input type=”password” id=”input1″>
<input type=”password” id=”input2″>
<input type=”button” value=”test” onclick=”check()”>
</FORM>
<script>
function check()
{
with(document.all){
if(input1.value!=input2.value)
{
alert(”false”)
input1.value = “”;
input2.value = “”;
}
else document.forms[0].submit();
}
}
</script>
够了吧 :)
屏蔽右键 很酷
oncontextmenu=”return false” ondragstart=”return false” onselectstart=”return false”
加在body中
二
2.1 表单项不能为空
<script language=”javascript”>
<!–
function CheckForm()
{
if (document.form.name.value.length == 0) {
alert(”请输入您姓名!”);
document.form.name.focus();
return false;
}
return true;
}
–>
</script>
2.2 比较两个表单项的值是否相同
<script language=”javascript”>
<!–
function CheckForm()
if (document.form.PWD.value != document.form.PWD_Again.value) {
alert(”您两次输入的密码不一样!请重新输入.”);
document.ADDUser.PWD.focus();
return false;
}
return true;
}
–>
</script>
2.3 表单项只能为数字和”_”,用于电话/银行帐号验证上,可扩展到域名注册等
<script language=”javascript”>
<!–
function isNumber(String)
{
var Letters = ”1234567890-”; //可以自己增加可输入值
var i;
var c;
if(String.charAt( 0 )==’-')
return false;
if( String.charAt( String.length - 1 ) == ’-’ )
return false;
for( i = 0; i < String.length; i ++ )
{
c = String.charAt( i );
if (Letters.indexOf( c ) < 0)
return false;
}
return true;
}
function CheckForm()
{
if(! isNumber(document.form.TEL.value)) {
alert(”您的电话号码不合法!”);
document.form.TEL.focus();
return false;
}
return true;
}
–>
</script>
2.4 表单项输入数值/长度限定
<script language=”javascript”>
<!–
function CheckForm()
{
if (document.form.count.value > 100 || document.form.count.value < 1)
{
alert(”输入数值不能小于零大于100!”);
document.form.count.focus();
return false;
}
if (document.form.MESSAGE.value.length<10)
{
alert(”输入文字小于10!”);
document.form.MESSAGE.focus();
return false;
}
return true;
}
//–>
</script>
2.5 中文/英文/数字/邮件地址合法性判断
<SCRIPT LANGUAGE=”javascript”>
<!–
function isEnglish(name) //英文值检测
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return false;
}
return true;
}
function isChinese(name) //中文值检测
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return true;
}
return false;
}
function isMail(name) // E-mail值检测
{
if(! isEnglish(name))
return false;
i = name.indexOf(” at ”);
j = name dot lastIndexOf(” at ”);
if(i == -1)
return false;
if(i != j)
return false;
if(i == name dot length)
return false;
return true;
}
function isNumber(name) //数值检测
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charAt(i) < ”0″ || name.charAt(i) > ”9″)
return false;
}
return true;
}
function CheckForm()
{
if(! isMail(form.Email.value)) {
alert(”您的电子邮件不合法!”);
form.Email.focus();
return false;
}
if(! isEnglish(form.name.value)) {
alert(”英文名不合法!”);
form.name.focus();
return false;
}
if(! isChinese(form.cnname.value)) {
alert(”中文名不合法!”);
form.cnname.focus();
return false;
}
if(! isNumber(form.PublicZipCode.value)) {
alert(”邮政编码不合法!”);
form.PublicZipCode.focus();
return false;
}
return true;
}
//–>
</SCRIPT>
2.6 限定表单项不能输入的字符
<script language=”javascript”>
<!–
function contain(str,charset)// 字符串包含测试函数
{
var i;
for(i=0;i<charset.length;i++)
if(str.indexOf(charset.charAt(i))>=0)
return true;
return false;
}
function CheckForm()
{
if ((contain(document.form.NAME.value, ”%\(\)><”)) || (contain(document.form.MESSAGE.value, ”%\(\)><”)))
{
alert(”输入了非法字符”);
document.form.NAME.focus();
return false;
}
return true;
}
//–>
</script>
1. 检查一段字符串是否全由数字组成
—————————————
<script language=”Javascript”><!–
function checkNum(str){return str.match(/\D/)==null}
alert(checkNum(”1232142141″))
alert(checkNum(”123214214a1″))
// –></script>
2. 怎么判断是否是字符
—————————————
if (/[^\x00-\xff]/g.test(s)) alert(”含有汉字”);
else alert(”全是字符”);
3. 怎么判断是否含有汉字
—————————————
if (escape(str).indexOf(”%u”)!=-1) alert(”含有汉字”);
else alert(”全是字符”);
4. 邮箱格式验证
—————————————
//函数名:chkemail
//功能介绍:检查是否为Email Address
//参数说明:要检查的字符串
//返回值:0:不是 1:是
function chkemail(a)
{ var i=a.length;
var temp = a.indexOf(’@');
var tempd = a.indexOf(’.');
if (temp > 1) {
if ((i-temp) > 3){
if ((i-tempd)>0){
return 1;
}
}
}
return 0;
}
5. 数字格式验证
—————————————
//函数名:fucCheckNUM
//功能介绍:检查是否为数字
//参数说明:要检查的数字
//返回值:1为是数字,0为不是数字
function fucCheckNUM(NUM)
{
var i,j,strTemp;
strTemp=”0123456789″;
if ( NUM.length== 0)
return 0
for (i=0;i<NUM.length;i++)
{
j=strTemp.indexOf(NUM.charAt(i));
if (j==-1)
{
//说明有字符不是数字
return 0;
}
}
//说明是数字
return 1;
}
6. 电话号码格式验证
—————————————
//函数名:fucCheckTEL
//功能介绍:检查是否为电话号码
//参数说明:要检查的字符串
//返回值:1为是合法,0为不合法
function fucCheckTEL(TEL)
{
var i,j,strTemp;
strTemp=”0123456789-()# “;
for (i=0;i<TEL.length;i++)
{
j=strTemp.indexOf(TEL.charAt(i));
if (j==-1)
{
//说明有字符不合法
return 0;
}
}
//说明合法
return 1;
}
7. 判断输入是否为中文的函数
—————————————
function ischinese(s){
var ret=true;
for(var i=0;i<s.length;i++)
ret=ret && (s.charCodeAt(i)>=10000);
return ret;
}
8. 综合的判断用户输入的合法性的函数
—————————————
<script language=”javascript”>
//限制输入字符的位数开始
//m是用户输入,n是要限制的位数
function issmall(m,n)
{
if ((m<n) && (m>0))
{
return(false);
}
else
{return(true);}
}
9. 判断密码是否输入一致
—————————————
function issame(str1,str2)
{
if (str1==str2)
{return(true);}
else
{return(false);}
}
10. 判断用户名是否为数字字母下滑线
—————————————
function notchinese(str){
var reg=/[^A-Za-z0-9_]/g
if (reg.test(str)){
return (false);
}else{
return(true); }
}
2.8. form文本域的通用校验函数
—————————————
作用:检测所有必须非空的input文本,比如姓名,账号,邮件地址等等。
该校验现在只针对文本域,如果要针对form里面的其他域对象,可以改变判断条件。
使用方法:在要检测的文本域中加入title文字。文字是在提示信息,你要提示给用户的该字段的中文名。比如要检测用户名
html如下<input name=”txt_1″ title=”姓名”>,当然,最好用可视化工具比如dreamweaver什么的来编辑域。
如果要检测数字类型数据的话,再把域的id统一为sz.
javascript判断日期类型比较麻烦,所以就没有做日期类型校验的程序了.高手可以补充。
程序比较草,只是提供一个思路。抛砖引玉! :)
哦,对了,函数调用方法:
< form onsubmit=”return dovalidate()”>
function dovalidate()
{
fm=document.forms[0] //只检测一个form,如果是多个可以改变判断条件
for(i=0;i<fm.length;i++)
{
//检测判断条件,根据类型不同可以修改
if(fm[i].tagName.toUpperCase()==”INPUT” &&fm[i].type.toUpperCase()==”TEXT” && (fm[i].title!=”"))
if(fm[i].value=”/blog/=”")//
{
str_warn1=fm[i].title+”不能为空!”;
alert(str_warn1);
fm[i].focus();
return false;
}
if(fm[i].id.toUpperCase()==”SZ”)//数字校验
{
if(isNaN(fm[i].value))
{ str_warn2=fm[i].title+”格式不对”;
alert(str_warn2);
fm[i].focus();
return false;
}
}
}
return true;
}
❸ Jquery.validate.js实现前端表单验证
jquery.validate.js表单验证
官方网站: http://bassistance.de/jquery-plugins/jquery-plugin-validation/
API: http://jquery.bassistance.de/api-browser/plugins.html
当前版本:1.5.5
需要JQuery版本:1.2.6+, 兼容 1.3.2
<script src="../js/jquery.js" type="text/javascript"></script>
<script src="../js/jquery.validate.js" type="text/javascript"></script>
(1)required:true 必输字段
(2)remote:"check.php" 使用ajax方法调用check.php验证输入值
(3)email:true 必须输入正确格式的电子邮件
(4)url:true 必须输入正确格式的网址
(5)date:true 必须配销输入正确格式的日期
(6)dateISO:true 必须输入正确格式的日森卖拍期(ISO),例如:2009-06-23,1998/01/22 只验证格式,不验证有效性
(7)number:true 必须输入合法的数字(负数,小数)
(8)digits:true 必须输入整数
(9)creditcard: 必须输入合法的信用卡号
(10)equalTo:"#field" 输入值必须和#field相同
(11)accept: 输入拥有合法后缀名的字符串(上传文件的后缀)
(12)maxlength:5 输入长度最多是5的字符串(汉字算一个字符)
(13)minlength:10 输入长度最小是此羡10的字符串(汉字算一个字符)
(14)rangelength:[5,10] 输入长度必须介于 5 和 10 之间的字符串")(汉字算一个字符)
(15)range:[5,10] 输入值必须介于 5 和 10 之间
(16)max:5 输入值不能大于5
(17)min:10 输入值不能小于10
例子:自定义密码验证的规则
❹ 前端规范一(命名规范)
前端规范一(命名规范)
1、小驼峰命名法(lowerCamelCase) :第一个单词以小写字母开始,第二个单词的首字母大写,例如:firstName、lastName。
2、大驼峰命名法(CamelCase) :每一个单词的首字母都采用大写字母,例如:FirstName、LastName。
3、下划线命名法(snake_case):下划线命名法也叫蛇形法,全由小写字母和下划线组成,在两个单词之间用下滑线连接。例如:first_name。
4、中划线命名法(kebab-case):中划线命名法也叫串式命名法,各个单词之间通过下划线“-”连接。例如:first-name。
强制使用:中划线命名法
命名规则:1、文件名不得含有空格
2、文件名建议只使用小写字母,不使用大写字母
3、文件名包含多个单词时,单词之间建议连词线 ( - ) 分隔
4、有复数结构式,要使用复数
示例:login 、 error-page、 icons
强制使用:全部大写字母
为了醒目,某些说明文件的文件名,可以使用大写字母
示例:README
补充说明: README 标准
◎ 项目简介。
◎ 注意事项。
◎ 线上的示例地址(测试、正式)。
◎ 支持运行的环境。
◎ 必要的依赖准备,以及如何搭建。
◎ 项目的安装指南。
◎ 相关的文档链接。
◎ 相关人员的联系方式。
README.md 示例:
强制使用:小驼峰命名法
命名规则:前缀为动词,见名知意
1、onXxx 监听事件的回调
2、handleXxx 处理事件
3、getXxx 获取某个值
4、setXxx 设置某个值
常见场景:
a、事件处理:
(1).事件主动监听采用 onXxx ,被动处理使用handleXxx
示例:onXxxSubmit: '提交表单'
handleXxxSizeChange: '处理分页页数改变'
handleXxxPageChange: '处理分页每页大小改变'
onXxxKeydown: '按下键'
(2). 其他命名:元素+click、 元素+change、select+范围
示例:selectAllXxx: '选择所有'
xxxCellClick: '当某个单元格被点击时会触发该事件'
xxxSortChange: '当表格的排序条件发生变化的时候会触发该事件'
b、增删改查处理:
增: addXxx 添加子项
createXxx 创建大项
删: deleteXxx 真删除
removeXxx 伪删除
改:updateXxx
查: getXxx 获取原始数据需要修改
fetchXxx 原始数据
示例:getUserList: '获取用户列表', fetchToken: '取得Token', deleteUser: '删除用户', removeTag: '移除标签', updateUserInfo: '更新用户信息', addUser: '添加用户', createAccount: '创建账户'
c、API接口函数:
get: getXxxApi
post: postXxxApi
patch: patchXxxApi
delect: delectXxxApi
域名:xxxUrl
一般属性变量 强制使用:小驼峰命名法
1、布尔值
命名规则:前缀为判断性动词
hasXxx 判断是否含有某个值。true:含有此值; false:不含有此值
isXxx 判断是否为某个值。true:为某个值; false:不为某个值
示例:isShow: '是否显示', isLoading: '是否处于加载中', hasToken: '是否包含Token',
2、数组命名
命名规则:使用名词+List组合
示例: userList: '用户列表'
3、私有属性变量
命名规则:前缀为下划线(_)后面和变量命名一样。
4、枚举变量 \textcolor{red}{强制使用:大驼峰命名法}
枚举的属性使用全大写字母,单词间用下划线隔开。
示例:let TargetState = { READING: 1, READED: 2, APPLIED: 3, READY: 4 };
5、常量: 强制使用:使用全大写字母,单词间用下划线隔开
强制使用:大驼峰命名法
命名规则: 可参考vue官网风格指南
例如: 1、按照功能来命名
2、应用特定样式和约定的基础组件 (也就是展示类的、无逻辑的或无状态的组件) 应该全部以一个特定的前缀开头,比如 Base、App 或 V。
3、组件名应该以高级别的 (通常是一般化描述的) 单词开头,以描述性的修饰词结尾。
示例:components/
|- BaseButton.vue
|- BaseTable.vue
|- BaseIcon.vue
强制使用: 中划线命名法
命名规则:
1.class、id 、标签、属性的命名应该尽量精短、明确,必须以字母开头命名,且全部字母为小写,单词之间统一使用中划线 “-” 连接
2.class必须代表相应模块或部件的内容或功能,不得以样式信息进行命名。
3.元素 id 必须保证页面唯一。
4.禁止创建无样式信息的 class
示例:
1、尽量不要缩写、简写的单词。除了 template => tmp、message => msg、image => img、property => prop 这些单词已经被公认的缩写
2、可读性强的命名优先于简短的命名
3、命名长度最好在 20 个字符以内,避免多长带来的阅读不便
4、命名要有具体的含义,避免使用一些泛指和无具体含义的词
5、不要使用拼音,更不要使用中文
6、正则表达式用 Exp 结尾
7、ref:使用Ref结尾
❺ javax 是如何实现依赖
参数校验是我们程序开发中必不可少的过程。用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的健壮性,后端同样需芦毕宽要对数据进行校验。后端参数校验最简单的做法是直接在业务方法里面进行判断,当判断成功之后再继续往下执行。但这样带给我们的是代码的耦合,冗余。当我们多个地方需要校验时,我们就需要在每一个地方调用校验程序,导致代码很冗余,且不美观。
那么如何优雅的对参数进行校验呢?JSR303就是为了解决这个问题出现的,本篇文章主要是介绍 JSR303,Hibernate Validator等校验工具的使用,以及自定义校验注解的使用。
校验框架介绍
JSR303 是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面,就可以在需要校验的时候进行校验了。注解如下:
❻ 前端基础(问答21)
keywords: jQuery、常用方法、Ajax。
$(document).ready() 和 window.onload 的作用类似,都是在页面加载完成后调用绑定的函数,但也有一些区别。
$node.html(): 获取集合中第一个匹配元素的 html 内容,或设置每一个元素的html内容。
$node.text(): 获取匹配元素集合中每个元素的合并文本,包括它们的后代,或设置匹配元素集合中每个元素的文本内容为指定的文本内容。
ps:.text()方法不能使用在 input 元素或scripts元素上。input或textarea需要使用 .val() 方法获取或设置文本值。得到scripts元素的值,使用.html()方法
作用:将两个或更多对象的内容合并到第一个对象。
用法:
jQuery 的链式调用是指执行完一个方法之后就返回当前对象,被返回的对象继续执行后面的方法。
通过对$.ajax()中传入的cache控制,具体规则如下:
.data():在匹配元素上存储任意相关数据 或 返回匹配的元素集合中的第一个元素的给定名称的数据存储的值。
用法:
DEMO:
1、给元素 $node 添加 class active,给元素 $noed 删除 class active
添加class:$node.addClass('.active')
移除class:$node.removeClass('active')
切换class:$node.toggleClass('active')
2、展示元素$node, 隐藏元素$node
显示:$node.show()
隐藏:$node.hide()
切换显示/隐藏:$node.toggle()
3、获取元素$node的属性: id、src、title, 修改以上属性
获取:$node.attr('id'),$node.attr('src'),$node.attr('title')
修改:
修改一处属性:$node.attr('id','header')
修改多处属性:$node.attr({'id':'header','title':'task16'})
4、给$node 添加自定义属性data-src
$node('data-src','images/01.jpg')
5、在$ct 内部最开头添加元素$node
$ct.prepend($node)
6、在$ct 内部最末尾添加元素$node
$ct.append($node)
7、删除$node
$node.remove()
8、把$ct里内容清空
$node.empty()
$ct.text("")
$ct.html("")
9、在$ct 里设置 html <div class="btn"></div>
$ct.html('<div class="btn"></div>')
10、获取、设置$node 的宽度、高度(分别不包括内边距、包括内边距、包括边框、包括外边距)
获取:1、$node.width()、$node.height()
2、$node.innerWidth()、$node.innerHeight()
3、$node.outerWidth()、$node.outerHeight()
4、$node.outerWidth(true)、$node.outerHeight(true)
11、获取窗口滚动条垂直滚动距离
$(window).scrollTop()
12、获取$node 到根节点水平、垂直偏移距离
水平:$node.offset().left
垂直:$node.offset().top
13、修改$node 的样式,字体颜色设置红色,字体大小设置14px
$node.css({
color:'red',
font-size:ཊpx'
})
14、遍历节点,把每个节点里面的文本内容重复一遍
$node.each(function() {
console.log($(this).text())
})
15、从$ct 里查找 class 为 .item的子元素
$ct.find('.item')
16、获取$ct 里面的所有孩子
$ct.children()
17、对于$node,向上找到 class 为’.ct’的父亲,再从该父亲找到’.panel’的孩子
$node.parent('.ct').children('.panel')
18、获取选择元素的数量
$nodes.length
19、获取当前元素在兄弟中的排行
$node.index()
1、当点击$btn 时,让 $btn 的背景色变为红色再变为蓝色
2、当窗口滚动时,获取垂直滚动距离
3、当鼠标放置到$div 上,把$div 背景色改为红色,移出鼠标背景色变为白色
4、当鼠标激活 input 输入框时让输入框边框变为蓝色,当输入框内容改变时把输入框里的文字小写变为大写,当输入框失去焦点时去掉边框蓝色,控制台展示输入框里的文字
5、当选择 select 后,获取用户选择的内容
效果
效果
❼ npm的xlsx前端导出excel怎么合并单元格呢
创建@/vendor/Export2Excel.js:
require('script-loader!file-saver');
require('script-loader!@/vendor/Blob');//在vendor文件加下建立Blob.js,代码在最下方
importXLSXfrom'xlsx'
functiondatenum(v,date1904){
if(date1904)v+=1462;
varepoch=Date.parse(v);
return(epoch-newDate(Date.UTC(1899,11,30)))/(24*60*60*1000);
}
functionsheet_from_array_of_arrays(data,opts){
varws={};
varrange={s:{c:10000000,r:10000000},e:{c:0,r:0}};
for(varR=0;R!=data.length;++R){
for(varC=0;C!=data[R].length;++C){
if(range.s.r>R)range.s.r=R;
if(range.s.c>C)range.s.c=C;
if(range.e.r
if(range.e.c
varcell={v:data[R][C]};
if(cell.v==null)continue;
varcell_ref=XLSX.utils.encode_cell({c:C,r:R});
if(typeofcell.v==='number')cell.t='n';
elseif(typeofcell.v==='boolean')cell.t='b';
elseif(cell.vinstanceofDate){
cell.t='n';
cell.z=XLSX.SSF._table[14];
cell.v=datenum(cell.v);
}
elsecell.t='s';
ws[cell_ref]=cell;
}
}
if(range.s.c<10000000)ws['!ref']=XLSX.utils.encode_range(range);
returnws;
}
functionWorkbook(){
if(!(thisinstanceofWorkbook))returnnewWorkbook();
this.SheetNames=[];
this.Sheets={};
}
functions2ab(s){
varbuf=newArrayBuffer(s.length);
varview=newUint8Array(buf);
for(vari=0;i!=s.length;++i)view[i]=s.charCodeAt(i)&0xFF;
returnbuf;
}
//单列合并数据加工
//在tableData数据中对colName列进行加工(header:['xx','yy',...],mergeRule:[2,1,1,3,2,1...])
//返回格式newTableDatas=[[列头s],["abc","ss","yyy",0],[null,"xx","y",1],["bca","xxx","yy",1],[null,"xxx","yy",1]]
//返回格式newMergeRules=[{"e":{"r":2,"c":0},"s":{"r":1,"c":0}},{"e":{"r":4,"c":0},"s":{"r":3,"c":0}}]
functionformatTableData(header,tableDatas,mergeRules,colIndex,colName){
varnewTableDatas=[header]//第一行为列头,
varnewMergeRules=[]//加工合并规则
varcurrRowIndex=1//因为第一行为列头所以起始为1
varmergeIndexs=[currRowIndex]//因为第一行为列头所以起始为1,为创建newTableDatas使用
for(vari=0;i
varendRowIndex=currRowIndex+mergeRules[i]-1
varmerge={"e":{"r":endRowIndex,"c":colIndex},"s":{"r":currRowIndex,"c":colIndex}}
newMergeRules.push(merge)
currRowIndex=currRowIndex+mergeRules[i]
mergeIndexs.push(currRowIndex)
}
for(vari=0;i
varcurrRow=tableDatas[i]
if(mergeIndexs.indexOf(i+1)===-1){
currRow[colName]=null//合并的数据但不是第一行时,此列赋值null
}
varnewTabRow=[]
for(varjincurrRow){
newTabRow.push(currRow[j])
}
newTableDatas.push(newTabRow)
}
return[newTableDatas,newMergeRules]
}
@/vendor/Blob.js:
exportfunctionexport_data_to_excel(header,tableDatas,mergeRules,colIndex,colName,excelName){
varoo=formatTableData(header,tableDatas,mergeRules,colIndex,colName);
varranges=oo[1];
/*originaldata*/
vardata=oo[0];
varws_name="SheetJS";
varwb=newWorkbook(),ws=sheet_from_array_of_arrays(data);
/*addrangestoworksheet*/
//ws['!cols']=['apple','banan'];
ws['!merges']=ranges;
/*addworksheettoworkbook*/
wb.SheetNames.push(ws_name);
wb.Sheets[ws_name]=ws;
varwbout=XLSX.write(wb,{bookType:'xlsx',bookSST:false,type:'binary'});
saveAs(newBlob([s2ab(wbout)],{type:"application/octet-stream"}),excelName+".xlsx")
}
(function(view){
"usestrict";
view.URL=view.URL||view.webkitURL;
if(view.Blob&&view.URL){
try{
newBlob;
return;
}catch(e){}
}
//
//
varBlobBuilder=view.BlobBuilder||view.WebKitBlobBuilder||view.MozBlobBuilder||(function(view){
var
get_class=function(object){
returnObject.prototype.toString.call(object).match(/^[objects(.*)]$/)[1];
}
,FakeBlobBuilder=functionBlobBuilder(){
this.data=[];
}
,FakeBlob=functionBlob(data,type,encoding){
this.data=data;
this.size=data.length;
this.type=type;
this.encoding=encoding;
}
,FBB_proto=FakeBlobBuilder.prototype
,FB_proto=FakeBlob.prototype
,FileReaderSync=view.FileReaderSync
,FileException=function(type){
this.code=this[this.name=type];
}
,file_ex_codes=(
"NOT_FOUND_ERRSECURITY_ERRABORT_ERRNOT_READABLE_ERRENCODING_ERR"
+"NO_MODIFICATION_ALLOWED_ERRINVALID_STATE_ERRSYNTAX_ERR"
).split("")
,file_ex_code=file_ex_codes.length
,real_URL=view.URL||view.webkitURL||view
,real_create_object_URL=real_URL.createObjectURL
,real_revoke_object_URL=real_URL.revokeObjectURL
,URL=real_URL
,btoa=view.btoa
,atob=view.atob
,ArrayBuffer=view.ArrayBuffer
,Uint8Array=view.Uint8Array
;
FakeBlob.fake=FB_proto.fake=true;
while(file_ex_code--){
FileException.prototype[file_ex_codes[file_ex_code]]=file_ex_code+1;
}
if(!real_URL.createObjectURL){
URL=view.URL={};
}
URL.createObjectURL=function(blob){
var
type=blob.type
,data_URI_header
;
if(type===null){
type="application/octet-stream";
}
if(blobinstanceofFakeBlob){
data_URI_header="data:"+type;
if(blob.encoding==="base64"){
returndata_URI_header+";base64,"+blob.data;
}elseif(blob.encoding==="URI"){
returndata_URI_header+","+decodeURIComponent(blob.data);
}if(btoa){
returndata_URI_header+";base64,"+btoa(blob.data);
}else{
returndata_URI_header+","+encodeURIComponent(blob.data);
}
}elseif(real_create_object_URL){
returnreal_create_object_URL.call(real_URL,blob);
}
};
URL.revokeObjectURL=function(object_URL){
if(object_URL.substring(0,5)!=="data:"&&real_revoke_object_URL){
real_revoke_object_URL.call(real_URL,object_URL);
}
};
FBB_proto.append=function(data/*,endings*/){
varbb=this.data;
//decodedatatoabinarystring
if(Uint8Array&&(datainstanceofArrayBuffer||datainstanceofUint8Array)){
var
str=""
,buf=newUint8Array(data)
,i=0
,buf_len=buf.length
;
for(;i
str+=String.fromCharCode(buf[i]);
}
bb.push(str);
}elseif(get_class(data)==="Blob"||get_class(data)==="File"){
if(FileReaderSync){
varfr=newFileReaderSync;
bb.push(fr.readAsBinaryString(data));
}else{
//asyncFileReaderwon'tworkasBlobBuilderissync
thrownewFileException("NOT_READABLE_ERR");
}
}elseif(datainstanceofFakeBlob){
if(data.encoding==="base64"&&atob){
bb.push(atob(data.data));
}elseif(data.encoding==="URI"){
bb.push(decodeURIComponent(data.data));
}elseif(data.encoding==="raw"){
bb.push(data.data);
}
}else{
if(typeofdata!=="string"){
data+="";//
}
//decodeUTF-16tobinarystring
bb.push(unescape(encodeURIComponent(data)));
}
};
FBB_proto.getBlob=function(type){
if(!arguments.length){
type=null;
}
returnnewFakeBlob(this.data.join(""),type,"raw");
};
FBB_proto.toString=function(){
return"[objectBlobBuilder]";
};
FB_proto.slice=function(start,end,type){
varargs=arguments.length;
if(args<3){
type=null;
}
returnnewFakeBlob(
this.data.slice(start,args>1?end:this.data.length)
,type
,this.encoding
);
};
FB_proto.toString=function(){
return"[objectBlob]";
};
FB_proto.close=function(){
this.size=this.data.length=0;
};
returnFakeBlobBuilder;
}(view));
view.Blob=functionBlob(blobParts,options){
vartype=options?(options.type||""):"";
varbuilder=newBlobBuilder();
if(blobParts){
for(vari=0,len=blobParts.length;i
builder.append(blobParts[i]);
}
}
returnbuilder.getBlob(type);
};
}(typeofself!=="undefined"&&self||typeofwindow!=="undefined"&&window||this.content
作者:paperss
链接:https://www.jianshu.com/p/b440106eb8a2
来源:简书
着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
❽ 一个app项目单点登录,前端要做什么,后端要做什么。
前端需要做你那个用户姓名,密码一些验证什么的,然逗橡野后有山喊前如春端打包数据到后再去处理,进行
逻辑判断
就可以了。