学习新技术的时候可以做夜歌todomvc项目
Stack Overflow
msdn.itellyou.cn
================================Html+css========================================
1.HTML:是一门标记语言,是展示数据的;
CSS:美化页面的;
Js:控制网页内容,给页面增加效果;
2.由于浏览器中有JavaScript引擎所有可以运行JavaScript代码;
3.JavaScript中有错误代码后面的JavaScript就不执行,但是不同的的script标签中互不影响;
<!DOCTYPE html>是H5的标准,所以Script标签中可以不写type/JavaScript(language=“en”)
4.script的标签一般是放在body标签中最后面;因为如果放在最前面会阻塞渲染(遇到script会停止当前页面树的渲染,解析JS完成后从暂停的地方继续开始渲染)
5.变量的声明(有var 没值)var name;
变量的初始化(有var 有值) var name=“小黑”
/*字符串类型的值都用双引号和单引号*/
“=”的意义是赋值 “==”的意义是比较;
名字的声明尽量用英语,可以上网翻译,记得使用驼峰命名法 ;
//单行注释一般是在一行代码上面;
/**/多行注释:一般是用在函数或者一段代码
tyoeof 变量名 可以获得除null外原始类型变量名的类型和function这个对象类型,其他对象类型会显示成object ,instanceof 可以获得对象类型的类型,但是不能获得原始类型的类型;
Console 中字符串是黑色的,数字是蓝色的;
不要拿小数验证小数,精度会出现问题
Var num1=0.1;
Var num2=0.2;
Num1+num2==0.3 ------> false;
如果一个是字符串,一个是数字两个相减的时候,会转换成数字;“10”-5=5;
类型的转换: 1. 数字的转换parseInt.parseInt.Float
字符串的转换 num.toString()有意义的才转换 即有值;
14.prompt是输入的弹框 输入的是字符串,如果要用于计算要用parseInt(prompt(“ ”));
15.创建变量的三种方式:①使用系统的构造函数创建对象;var obj=new object;
②自定义构造函数创建对象:
function Person ( ) { 自定义构造函数}
var obj =new Person();自定义构造对象
在自定义构造函数和创造对象的时候做的四件事:
在内存中创建一个内存空间,存储对象
设置this 为当前的对象;
设置对象属性和方法的值;
返回this;
③字面量的创建:var obj={}等同创建对象类似自定义变量
Var obj={name: “”, sex: “”, age: “”}
16 值类型的值在栈中储存,引用类型的对象在堆中存放(内存),地址在栈中存放;
遍历数组用for(key in arrays)和forEach(value,key,arr)遍历对象用for of
内置对象:①Math②String③Arrays④Date
Arguments可以获取方法括号内的值;(var max=arguments[0];)
标签自定义属性用getAttribute()来获取;标签自带的属性可以用element.Attribute获取;
NodeType 是节点的类型如果是1--标签 2--属性 3--文本;
nodeName 是节点的名字 大写---标签 小写---属性名 #text 文本
*获取节点和元素的代码,谷歌火狐都支持 ,但是获取节点在IE8中获取的是元素,而获取元素的在IE8中没定义,不兼容;
23.如果是用循环添加事件就用命名事件,因为节省内存空间;如果不是就用匿名事件;
24.*为同一个元素添加多个事件可以使用addEventListener(“事件类型”,事件处理函数,false);谷歌和火狐支持;但是IE8只支持attentEvent(“有on的事件类型”,事件处理函数);
25.方法和函数的区别:方法是需要用对象调用的,而函数直接调用;
Eg: 方法: 对象.sayHi(); 函数: sayHi();
26.判断有没有这个方法的时候直接写方法名,不要加();
Eg;if(sayHi){ console.log(“有sayHi方法”)}else{“没有sayHi方法” }
绑定事件和解绑事件:
* 注意:用什么方式绑定事件,就应该用对应的方式解绑事件
* 1.解绑事件
* 对象.on事件名字=事件处理函数--->绑定事件
* 对象.on事件名字=null;
* 2.解绑事件
* 对象.addEventListener("没有on的事件类型",命名函数,false);---绑定事件
* 对象.removeEventListener("没有on的事件类型",函数名字,false);
* 3.解绑事件
* 对象.attachEvent("on事件类型",命名函数);---绑定事件
* 对象.detachEvent("on事件类型",函数名字);
事件冒泡:当元素嵌套,有层次,内层元素和外层元素注册了相同事件时,运行内层事件,外层事件也会运行,
阻止事件冒泡:必须在需要阻止的那一层函数加入
①Window.event.cancelBubble=true;*IE 8和谷歌支持 但是火狐不支持;
②而function( e ){ e .shopPropagation()} ; *谷歌火狐支持 IE8 不支持;
*e在谷歌和火狐中是对象,window.event在IE8 和谷歌中是对象
事件:①事件的捕获阶段; true 从外到里;
②事件的目标阶段; 点击或事件的目标;
③事件的冒泡阶段; false 从里到外;
通过e.event.Phase(*function(e){ e.event.Phase) 可以获取数字1.2.3即为事件阶段 ;
为同一个元素绑定多个不同的事件使用同一个处理函数用switch-case的方式解决;
数组必记方法:1.push 追加(); 2. pop();删除最后一个元素 3.shift();删除第一个元素返回删除的元素 4.unshift();在数组的第一个位置添加元素;(轮播图)
【.every(function(ele,index)) 检测元素是否符合函数
.filter(function(ele))返回符合条件的元素;
Ele.from复制数组;
arr1.concat(arr2,arr3)】添加元素
三种弹窗:prompt.Confirm.alert;
” 地址 ” method= ” get/post ” >表单 input 表单元素如果要提交必须要有name
设置css模块隐藏的时候使用display:none 要使他显示的时候必须在style中的class具体到哪个父类子类、例如
要显示的span元素在class为‘dv’的div内,只要有.showit就显示
设置 .dv display:none 设置.dv .showit {display: block;}
子元素的margin-top/left/.. 设置(n%)百分比的时候,实际上的margin/padding就是父元素的宽度* n%;记得都是父元素的宽度,没有高度
块级元素的padding和margin取百分比值的时候,都是相对于 父元素的宽度 来计算的。
BOM--------------------------------------------------------------------------------------------------------------------
1.location几个需要记的属性及方法:
①主机名和端口:号window.location.host ⑧*跳转地址:location.href=”www.4399.com”
②主机名:window.location.hostname (可以返回)=location.assign(“www.43...”)
③#后面的内容:window.location.hash (不能返回)=location.replace(“www.43..”)
④端口window.location.port
⑤协议 :window.location.protocol
⑥相对路径:window.location.pathname
⑦附带参数:window.location.search
2.判断平台的系统:使用window.navigation.platform (移动端pc端;)
3.看自己的系统和浏 览器:window.Navigation.userAgent;
4.BOM中的俩种定时器:①定时器:var timeId=window.setInterval(function(),time) 清除定时器:clearInterval(timeId)
②一次性定时器: var timeId=window.setTimeout(function(),time)
清除定时器:clearTimeout(timeId)
5.透明度:element.style.opacity=(0-1);
6.如果样式的代码是在style中设置的那么外部是无法获取的;如果是在style属性中设置的就可以获取;如果想获取 style中的left可以使用element.offsetLeft(以此类推!)得到的是数字类型;
7.element.children 可以获得子元素节点; element.childNodes获得子元素;
8获得对象属性的三种方法:
①offsetLeft 可以获得style中的Left 但是当没有脱离文档流时不能获取left值
②window.getComputeStyle(element).left 谷歌火狐支持IE8不支持;
③element.currentStyle.left IE8支持,火狐谷歌不支持;
9 . ① function (e)e.clientX 与 function (e)e.pageX的区别在与一个是可视化距离一个是距离界面边框的大小,图片跟着鼠标飞时是用pageX;
② function (e)e .clientX 火狐谷歌支持,
而在IE8中应该使用function ()window.event .clientX
兼容代码 e=window.event||e
③pageX和pageY在IE8中不兼容
Window.eventcancelBubble()
10原型可以解决遍历时调用导致重复开辟多个内存空间的问题,(构造函数名字.prototype.构造方法名字 )原型的作用:共享数据,节省内存空;
11单的原型写法:缺陷:-->原型直接指向{ },没有构造器,要自己加 constructor=对象名
eg:简单的写法:Student.prototype ={
constructor:Student,
height: "188",
weight: "55kg",
}
一般的写法:
Student.prototype.height="188";
Student.prototype.weight="55kg";
12.自调用函数(一次性函数)(function(形参){ })(实参) 可以用来把局部变量替换成全局变量; function(win){ Win.number=10;})(window)
Console.log(number) ====> 10
13.面向对象的编程思想:根据需求,抽象出相关的对象,总结出对象的特征和行为,把特征变成属性,行为变成方法,然后定义构造函数,实例化对象,通过对象调用属性和方法,完成相应的需求;
Bind可以改变函数里this的值;function(){}.bind(that) this==that;
new 构造函数 == 实例对象,构造函数的prototype就是原型对象。原型对象的构造器就是构造函数。实例对象的__proto__(原型)就是原型对象,实例对象可以使用原型对象的方法。原型链就是一种实例对象和原型对象的联系,关系是通过原型(__proto__)联系。per实例对象的__proto__------->Person.prototype的__proto__---->Object.prototype的__proto__是null
原型的指向可以改变,函数2的原型对象等于函数1的实例化对象。因为 Func.prototype ={}对象。f1的实例对象也是对象。所以当f2.prototype = new f1()的时候f2继承f1的属性和函数.还存在一个问题是,如果一开始f1设置了原型对象,一旦改变了指向后,前面设置的原型对象内容都不存在,存在的只有新的原型对象(f2的实例对象)!
Function f1(){}
Function f2(){}
f2.prototype = new f1()的时候f2继承f1的属性和函数
原型指向改变后再添加方法就可以使用,实例对象访问这个属性,应该先从实例对象中找,找到了就直接用,找不到就去指向的原型对象中找,找到了就使用。
Js中的继承是通过原型来实现的;(改变原型的指向相同的行为就用原型的方法写,)
Dog(子对象).prototype=new Animal(name,color)(实例化父对象)
原型继承会导致所有父级的值相同。即:stu1 小明 男 120分 stu2 小明 男 130分
这也就是继承的缺陷。
19.要解决继承的缺陷就需要借用父级的构造函数;(在子集构造函数中加入 父级构造函数名字.call(this,属性,属性,属性,属性)) ;但是缺陷在于父级的方法无法继承day3中的11
组合继承:就是原型继承+借用构造函数 在原型继承中不用输入属性值
20.①普通拷贝 var obj1={} var obj2=obj1;只拷贝了地址,而内存却只有一盒
②拷贝继承var obj={}
for(key in Person.prototype){obj2[key]=Person.prototype[key]}
函数声明if-else在IE8中会出现问题
*函数中的this
①普通函数中的this------>window(直接调用)
Function f1(){ }
F1();
②定时器里的this------>window
③对象.方法中的this------>当前的实例对象;
Function Person(){ this.play=function(e){ };}
Var pre=new Person(); pre.play(e);
④原型对象方法中的this------>实例对象;(对象点)
⑤构造函数中的this------>实例对象 (函数用new的方法调用)
Funtion F1(){ this.name} var f=new F1(构造函数首字母大写,普通小写);
对象中有__proto__原型是对象 函数中有一定有prototype 和__proto__ 是对象;
方法.call 和方法.apply 的区别在与参数call是一个个传,apply是传一个数组 ,相同点在于可以改变this的指向,如果第一个对象参数是null那么this指向window,如果是一个对象那么就指向这个对象;
Bind的函数用法和call类似 但是call和apply是调用函数,而bind是复制一份函数
addEventListener(“click”,function(){},false)事件监听对象;
把js中的var 换成const 就可以定义为常量,不可以被修改;
27.css中的text-indent是首行缩进!
===================================正则表达式==================================
元字符:
1 . 表示的是:除了/n以外的所有字符
2 []
①范围:[1-7][a-z][A-Z][0-9a-zA-Z]分别表示 1-7数字 a-z的小写字母,a-z的大写字母,所有数字字母。(不存在[100-200]只能一个一个数字来)
②把正则表达式中元字符的意义去掉 [.]就是一个.没有意义了
3 | 或者 [1-2]|[3-4] 1-2或者3-4;
4 () 分组和提升优先级 分组都是从最左边来算((())()) 第一个左括号就是第一
元字符下的限定符:
1 * 表示的是:前面表达式出现了0次到多次,例如“dd232132135”和[a-z][0-9]*匹配,(多个数字)
2 + 表示的是:前面表达式出现了1次到多次
3 ? 表示的是: 前面的表达式出现0-1次
4 {}:可以更加明确的表示前面的表达式出现的次数{5,10} 最少5次最多10次
{0,}=== * {1,}=== + {0,1}=== ? {4} 4次
5 ^表示的是:以什么开始或者取非
^(a-z):在括号外面所以是以字母开头
(^a-z):在里面说明是取非 ,除了字母;
6 $表示的是以什么结束 [a-z][0-9]$ 以数字结束
如果正则表达式以^开头$结尾说明是严格模式,字符串必须以这样的形式出现,如果没有,那么只需要在字符串中出现就可以了
7 \d 数字中的任意一个
\D 非数字的任意一个
8 \s 空白符
\S 非空白符
9 \w 非特殊符号
\W特殊符号
10 \在非特殊符号前加一个\ 说明下一个字符是特殊的。 s是字母\s是空白符
创建正则表达式
Var reg = /\d{1,5}/
Reg.test(“我的幸运数字是:6”)
============================jQuery============================================
js和jq对象的区别在于他们都是由各自的方法获得的,js对象无法使用js函数;jq对象无法使用js函数,除非他们互相转换
JS---->JQ :var name=.... $(name);
JQ---->JS :$(name) $(name)[0];
操作JQ不会覆盖,JS会覆盖;Js对象是一个一个对象(需要遍历),Jq对象是一组对象;
$有3中用法 :
1>第一种是入口函数
2>第二种是JS转换成Jq
3>第三种是获取对象:$(“div”) $(“#div”) $(“.className”)
过滤选择器:前面都有冒号,:even 下标为偶数 :odd 下标为奇数 :eq(index)下标等于index :gt(index)下标大于index :lt(index) 下标小于index ;
Jq中是链式编程,因为使用方法后都会返回jq对象;
Jq中的调错错误只可能出现在对象上直接看对象
-css操作 (改变样式 样式是在style中的)
1>设置样式:①css(“name”,“value”);②css({“name”:“value”,“name”:“value”;})
2>获取样式:①css(“name”) name是想要获取的样式(但是获取jq对象的时候只能得到一个元素的属性值)
8. -attr操作(改变属性 属性是在script中的)使用的方法和-css操作一样!
*自定义属性可以直接在attr操作中设置例如 attr(aa:bb)
*当用attr 设置 checked select disable 时会出现bug 这时需要使用.prop()来改变;
9. -class操作
1>添加一个类:addClass(“classname”)
2>移除一个类:removeClass(“classname”);
3>判断类是否存在: hasClass(“classname”) 返回 boolean。
4>切换类:toggleClass
10.jq动画的三种基本函数
1>显示 show(time,function) hide(time,function);
2>淡入 fadeIn(time,function) fadeOut(time,function)
3>滑入 slideUp(time,function) slideDown(time,function)
11.动画操作 .animate({attr:num},speed,swing(秋千) or linear(匀速),function);
.stop()可以停止当前正在进行的动画 用 .stop().animate()解决动画队列的问题
音频操作 用 audio(src=“” controls(播放器) autoplay(自动播放) )
视频操作 用video(src=“” controls(播放器) autoplay(自动播放) )
注意在音频前添加一个.load 再添加一个.play去掉一点要把音乐放完的bug
元素节点操作: var $li=$(“123 ”)
1>把元素添加到父元素最后面 : .append($li);
2>把元素添加到父元素最前面 : .prepend($li);
3>把子元素添加到父元素后面 : .appendTo();
4>把子元素添加到父元素前面 : .prependTo();
14.清空节点用 .empty();可以把元素节点和对应的事件清除;
15.删除节点:.remove()
15.深度复制 .clone(boolean) 为true的时候会复制事件为false不会复制事件;
16.操作value 值可以 .val(“ ”)来改变;
17.聚焦事件
1>聚焦用 .focus(function(){ })
2>离开焦点用 .blur(function({ }))
18. .html和.text的区别在于
1>.html更类似于innerHTML会打印标签
2> .text类似于innerText
19. 1>获取宽度高度: .width .height 不能获取padding附加的区域
2>可以获取padding 的区域: .innerWidth .innerHeight
3>可以获得border 的区域: .outerWidth .outerHeight
4>获取滚动出去的宽度高度:
$(window).scroll(function (){ $(window).scrollLeft})
5>获取窗口可视化区域的大小
$(window).resize(function(){$(window).width}))
offset是获得相对于页面的位置
相对于有定位的父元素位置
委托事件:.delegate(select,type,function)给父元素注册然后给子元素执行;
优点:
动态创建出来的元素也有事件,在点击时元素没有事件由于冒泡会触发被委托事件从而为创建出的元素注册事件;
当多个子元素要注册相同事件的时候,用委托事件让父元素只为被点击对象进行操作,从而节省空间;
注册事件有2种方式 .on(type ,select,function)
1>注册简单事件 .on(“click”,function)
2>注册委托事件 .on(“click”,“p”,function)
先执行自己的委托事件然后再执行自己的简单事件;
22.移除事件 .off(“type”)输入事件就移除这个事件,不输入就全部移除
23.事件的触发 .trigger(“type”)== .type可写click等 ();
24.阻止浏览器默认跳转
1> e.preventDefault();
2>阻止事件冒泡:e.stopPropagation();
3> return false; 阻止跳转和阻止冒泡;
25.避免多次触发使得出现bug用节流阀的思路,设置一个开关 在函数中判断开关然后关闭开关 再在另一个函数打开开关;
26. .delay(time) 延迟的时间 可以用在2个动画之间
27.五角星评分案例:
1>前面所有兄弟prevAll();
2>后面所有兄弟.nextAll();
28.遍历的两种方法:
1>for
2>.each (function(index,element){
$(element).css( , )});
$.noConflict 当使用多个库定义符号冲突时释放$的控制权 需要的时候再上网查
插件: 颜色渐变插件 懒加载
获得现有的年份
var d=new Date;
d.getYear()获得现在距离1900年的年数;
d.setYear(需要设置的年数,不是距离1900的年数)
d.toGMTstring()可以获得当前设置的时间;
day2城市选择案例中的selected;
day2 $(btn).click(function(){
*Var tex=$().val(获取$()中的值)
$(“
”
(直接创建li对象) ).text(tex)
(设置文本内容) })
day3 飞到顶部的小火箭:
由于只有Body 和html有scrollTop属性 window没有所以
$(“body,html”).aninmate({scrollTop:0});
==============================PHP=====================================
查询端口占用 #
每次改变Apache后用http-t 来测试是否OK
更改网页根目录是 找到httpd.conf 修改Document Root (记得复制过去后要改斜杆 )
添加虚拟机出现forbidden 时找到文件vhost中的 DocumentRoot,在下面添加
AllowOverride None
Options None
Require all granted
即可
2>添加虚拟机也要注意修改虚拟机Document Root
默认文档是:当客户端访问一个文件时默认返回的文档 可以在配置文件中修改 directoryindex来修改
阻止别人访问本机的其他文件目录可以把配置文件中的Options Indexes FollowSymLinks 中的Indexes 去掉;
虚拟主机,就是把一个网站分成多个网站
先在配置文件中解除主文件里的注释505行 Include conf/extra/httpd-dav.conf conf\extra\v中修改,每个虚拟主机必须配置ServerName 就是修改DocumentRoot“默认文件”;ServerName必须是自己购买的域名
宽字符集就是普通的文字 ,他有一套专门的api 都是mb_xxxx;需要载入模块后才能使用
# php -a 进入console
Php.ini 中的display_errors在开发阶段设置为On 在生产阶段设置为Off;(警告)
用if(isset($arr[$foo])) 可以判断是否有$foo这个键;用if($arr[$foo]) 也可以但是会警告不推荐
Empty() 和isset()的区别在于Empty()=!isset()|| arr=false;用empty()来识别别人提交的数据是否可以获取,或者有没有数据; *(‘0’==false ‘’==false)
In_array()和IndexOf的区别在于In_array()只是判断是否存在,不返回下标;
13.require()和include()都是载入文件的函数但是require一旦没有文件那么就不会执行,而include()和报警告并继续执行;(include一般用于载入部分html,require用于载入必要的代码文件)
用from action 提交给另一个PHP后用:
var_dump($_GET):用于接收URL地址中的数据(一般是GET发出的)
var_dump($_POST):用于接收请求体中的数据(一般是POST发出的 )
var_dump($_REQUEST):$_GET+$_POST;
GET和POST的使用在于到底是拿东西还是送东西(账号密码是送,筛选等的是拿)
15.在from的客户端中:(必须查询$_SERVER使用方法)
使用if[$_SERVER(‘REQUEST_METHOD’)===‘post/get’]可以判断是什么类型;
对action=“”使用$_SERVER [‘PHP_SELF’];?>”得到当前php的名字
将数据保存到文本中 file_put_contents (, ,FILE_APPEND)
表单处理的三个步骤:
接收并校验;
持久化(将数据保存到文件磁盘)
响应(服务端后台响应)
直接在地址栏输入地址以及用a标签的形式进入的是用GET的方式请求的,但是一旦点击注册就是用POST方式请求的 (见day'3 case1 :第一行PHP判断是否是POST 请求,如果是才执行接下来的PHP代码,为了让一开始的错误信息就直接显示出来;)
如果表单中有文件上传必须把method设置为“post”,把enctype设置为multipart/form-data,接收文件要使用全局变量$_FILES;
上传文件大小限制可以找php.ini 查找upload_max;修请求提交总文件的大小查找post_max_size;
字面量是代码中用来表述数据的一种手段,Json是一种基于字面量的语法;
Json 中属性必须用双引号包裹;
Json 中字符串必须用双引号包裹;
Json 中不允许使用注释;
Json 的解析用Json_decode($contain,//假如加入true 那么才是关联数组)
Eg: [
{ id:xxx ,name:xxx,email:xxx },
{ id:xxx ,name:xxx,email:xxx },
{ id:xxx ,name:xxx,email:xxx },
{ id:xxx ,name:xxx,email:xxx },
{ id:xxx ,name:xxx,email:xxx },
{ id:xxx ,name:xxx,email:xxx },
{ id:xxx ,name:xxx,email:xxx }
]
注册列表的步骤;(传到文件夹中)
清单;
1.1获取 json文件 file_get_contents();
1.2解析 json文件 $arr= json_decode();
1.3显示 json文件 foreach($arr as item){ $item[‘name’]}
服务端;
2.1表单的校验:
1.判断是不是post请求 $_SERVER[‘REQUEST_METHOD’]==='POST'调用函数;
2.使用函数让文件格式清楚使用if (empty($_POST[‘name’])){return;}来解决
2-1文件域是否存在if (empty($_POST[‘source])){return;}
2-2是否上传文件成功$source[‘error’]!==UPLOAD_ERR_OK;
2-3限制文件大小$source[‘size’]
2-4限制文件种类$source[‘type’]
$allowed_types = array('audio/mp3', 'audio/wma');
if (!in_array($source['type'], $allowed_types))
可以限制文件种类
可以选择多个文件
一个文本域上传多个文件的时候必须把name变成一个数组;
2-3更改上传目录 move_uploaded_file(临时路径($source['tmp_name']),$target)
注册表单:(传到数据库中)
1>复制注册表单静态页面必须注意form:
①form action=""method="post" enctype="multipart/form-data" autocomplete=“off”>
②有id的input要加name
③点击保存后查看network是否正常运行;
保存数据的路径一定用绝对路径
相对路径中的./代表当前目录 ../代表上级目录 传路径时要用substr()剪切
路径要用 . 拼接;
2>“”可以解析$id但是‘’不可以
写mysqli_query 的时候;$qurey = mysqli_query($coun," insert into users values (null,' $avatars' ,' $name' ,$gender,' $birthday' );" );
3>在选择性别的时候是select标签包含option标签,若要默认选择那么必须使用selected属性 为了判断是否和原来编辑前的值一样,必须用三目运算符。例如
男
注意的是selected 前面的空格必须存在才符合规则;
要删除或者是编辑指定的表单要在action后面加? 和判断的数值;
24.编辑表单:
时候需要更新原来是数据库,语句是update users set sex ='为' where id=3,要注意到id到底取什么值,这时就要在edit.php中的href中传Id值(在校验的过程中出错的时候会返回原来的页面,如果没有传id值那么前面那些需要get中id值的地方全部都会报错,所以必须传入id值) 由于有id值所以前面那些需要id值的函数可以执行而不报错,进行校验。
25.数据库的整体思路:
1>连接数据库 mysqli_connect("localhost","root","123","demo");
判断:if ($coun) {echo("连接成功");}else{exit("连接失败");}
字符:mysqli_set_charset($coun,'utf8');
2>查询数据库 mysqli_query($coun,"select * from users;");
判断:if (!$qurey) {exit("查询失败");}
遍历数据库 while ($row = mysqli_fetch_assoc($qurey)){var_dump($row);}
单条:$row = mysqli_fetch_assoc($qurey)
4>查询的话要释放结果集 mysqli_result($qurey);
5>炸桥 mysql_close($qurey);
25.表单案例中的思路!很重要!
总思路 :连接并检验,持久化(保存数据),响应(返回);
清单页面:index.php
1>连接数据库
2>查询数据库
3>遍历数据库(在html中遍历混合编码)
注册页面:
接收并校验文件
连接数据库
查询数据库
持久化(保存到数据库)
响应(跳转)
删除页面:
获取get后的id值
连接数据库
查询数据库(删除指定行)mysqli_query($con,delete from users where id=1;
响应 header(Location:XXX.php)
编辑页面:
1>获取get后的id值
2>连接数据库
3>获取数据库的值放在一个变量中;
4>修改html文件中的初始化value值;
5>在点击保存的时候在?后面加id值(因为要删除指定行,如果不传那么就无法在$_SERVER[ ‘ REQUEST_METHOD ’ ]=== ’ POST ’ )中获得当前的id值; )
25.pathinfo($_FILES[‘avatar’][‘name’],PATHINFO_EXTENSION);可以获得文件格式;
进行文件移动操作的时候(move_upload_file()),若想接收中文文件名字必须用iconv来转换中文编码为GBK编码 (iconv(‘utf-8’,’GBK’,$XXXX[‘name’]));
忽略报错:在PHP头error_reporting(E_ALL&~E_NOTICE)
解决无状态的方法就是使用cookie
①在php中使用setcookie来修改cookie
1.使用的方法(‘键’,’值’,’过期时间’,’path’,‘domian’);
2.使用$_COOKIE这个全局变量来获取cookie
3.单单只有一个键的时候是用来删除这个cookie的;
4.使用想同的键的时候会被覆盖;
5.同时由于cookie是在报文中被保存的所以可以修改heard里的Set-Cookie从而修改 或添加cookie;
②同时在js中也可以修改和获取cookie
1.获取:COOKIE.cookie(‘key’);
2.修改:COOKIE.cookie=‘key=value’
③如果有人伪造cookie来获取数据
1.加密(比较高级)
2.记总账:
2.1在使用之前必须要用session_start();
2.2使用$_SESSION[‘key’]='value';改变的是在session中的数据,用cookie可 以访问到但是由于这个cookie是一个随机编码,所以不能轻易获得相应session的 cookie编码;
2.3使用$_SESSION来获取session里的数值;
==============================AJAX=====================================
Ajax就是浏览器给我们提供的api,作用是操作网络,可以操作响应请求,对网络进行网络编程
AJAX 核心的 三个步骤
①安装浏览器 :var htr = new XMLHttpRequest;
②打开浏览器并输入地址 htr.open(‘GET’,‘http://study08.io/time.php’);
③敲回车访问: htr.sent();
涉及到AJAX的操作页面不能使用文件协议访问(file://XXXXX)
同一个网站下面就可以写相对或者绝对路径;
常用api:
获取当前的状态 xhr.readyState
获取状态的改变 xhr.onreadystatechange = function (){}
使用switch(xhr.readyState){case 2:;...} 来获取这些状态下应该做什么;
获取响应体 xhr.response 获取的结果会随着responseType变化而变化
获取响应体 xhr.responseText 获取字符串文本
获取全部的响应头 xhr.getAllResponseHeaders();
获取指定的响应头 xhr.getResponseHeader( ‘ date ’ );
获取响应的状态 xhr.status (200)
获取状态内容 xhr.statusText(OK)
不同状态代表的意义:
// 0.新建请求代理
// 1.open了一个对象
// 2.加载了响应头和响应行建立了连接
// 3.加载了响应体但是没有完全下载完毕
// 4.完全下载完毕
xhr.onload = function(){} 可以直接获取状态4时的情况(有兼容性问题)
设置open对象的响应头使用xhr.setRequestHeader
xhr.setRequestHeader(‘Foo’,‘bar’);
xhr.setRequestHeader(‘Content-Type’,‘application/x-www-form-urlencoded(根据不同的情况而改变)’)
AJAX的基本操作
var xhr = new XMLHttpRequest();
xhr.open("POST","ajax.php");
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.send('valq=1&ss=2');
//同时还可以使用xhr.send(`valq=${ }&ss=${ }`);
//设置请求头
xhr.addEventListener('readystatechange',function(){
if(xhr.readyState!==4)return;
1console.log(xhr.readyState);
console.log(xhr.response);
console.log(xhr.responseText);
//responseText获取字符串文本
console.log(xhr.status);
console.log(xhr.statusText);
console.log(xhr.getResponseHeader('Content-type'));
console.log(xhr.getAllResponseHeaders());}
AJAX函数的封装需要封装成回调函数:ajax(method,url,params,done)
Done为函数
回调函数,当函数里面嵌套着函数,外面函数是无法获取里面函数的返回值的所以需要使用回调函数来解决;
function getTime( done ){
(function getThis(){
done ( Date.now() );
})();
}
getTime( function( time ){
console.log( time )
} )
其中里面的函数需要执行才可以,在这里我们使用自调用。同时done=function(time);
time的值为date.now()
AJAX解决跨域的问题可以使用JSONP,它是一种借助于动态创建script标签进行跨域请求的技巧
JSONP就是当script里的src属性引入的文件为PHP文件,但是返回的结果是JS;
从而将服务器想要给客户端发过去的数据发给客户端
==============================Vue======================================
v-for : v-for="item in list" 是循环list里的内容然后放入item中。
v-bind 特性被称为 指令 。指令带有前缀 v- ,以表示它们是 Vue 提供的特殊特性
input : 里的v-model="inputValue"的时候就是双向绑定了。
①this.inputValue :可以获得input中的值
v-on:click :事件使用v-on:click = 'func';func是要写在methods里的
MVC、MVP模式、MVVM设计模式的区别
①MVC:前端常用的设计模式
Model : 模型 (用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法)
View : 视图 (渲染页面)
Controller : 控制器 (M和V之间的连接器,用于控制应用程序的流程,及页面的业务逻辑)
MVC流程 :M-->V-->C--M...成一个循环的状态,MV可以直接联系,同时导致视图与控制器间过于紧密连接 。
②MVP模式 :MVC的改良模式 将 Controller 改名为 Presenter,同时改变了通信方向 。
此时M数据层和V视图层不能直接联系都得通过P来进行联通,修改视图可以不影响模型,主要的程序逻辑都在P层,缺点在于视图层和模型层的交互太过频繁。
③MVVM模式: 在vue中M层是模型层,V层是视图层,而Vue就是VM层,我们主要修改的方面在于V层和M层! MVVM模式和MVC模式类似, 主要目的是分离视图(View)和模型(Model)
前端的组件化:组件是页面的一个区域,组件也是一个实例,一个项目是由很多个组件组成的,也可以说是由很多个实例组成的
实例对象后面以$开头的是实例属性或实例方法例如 app.$el,app.$data
V ue的生命周期钩子:
大体分为四个部分分别为:
创建实例
b eforeCreate: function(){}
C reated:function(){}
渲染页面
beforeMount:function(){}
Mounted:function(){}
销毁实例
beforeDestroy:function(){}
D estroyed:function(){}
更新数据
beforeUpdate:function(){}
U pdated:function:function(){}
V ue的基础模板语法
以下三种都需要获取实例中data的数据,而且都可以使用js的语法书写内容。
插值表达式:在标签中{{ }}以这样的形式传入内容。
标签中的 v-text 属性 类似与js中的innerText 方法
标签中的v-html 属性 类似于js中的innerHTML方法
9 .重要 绑定样式的两种方式class和style。都有俩种写法,数组和对象!
(1):class="{样式名:决定是否出现样式名 }"
(2).:class="['样式名','样式名']"!通过methods中的函数调整。
(3):style="样式名"需要在data中用样式名输入Css
(4):style="[样式名,{fontSize:'20px'}],前面和第一种一样,后面对象可以直接输入CSS样式注意单引号
10.使用v-if,v-elseif ,v-else 条件渲染必须让他们连续出现,中间不可以存在其他DOM节点
else后面不存在变量直接书写!
使用v-if时由于 vue会尽量不更换DOM节点 ,如果有相同的大部分不会替换!如果需要在替换的时候清空那么需要在input后面添加key值,key值是任意的!
11.v-if和v-show的区别在于,当v-if为false的时候就会被销毁,为true重新创建,但是v-show就会保留,只是标签属性的display变成none从而隐藏
12.在列表渲染时:
(1)为了提升性能需要给循环的每一项提供:key值
(2)当:key值都是不相同时性能最优,而不是使用index作为key
(3)修改数据和同时改变渲染的方法:
① 通过数组的几个变异方法来改变数据渲染:pop,push,shift,unshift,sort,resver,
② 改变引用地址,即改变data中list的数据!(输入全部数据)
③ 使用vue.set(vm.list,"key","value")来改变list中那个key 的 value!
注意 :当我们修改数据的时候不能通过下标的形式修改数据的渲染,但是可以修改数据 (arr[4]="5");
13当存在多级的时候,例如table>tbody> child 组件child最后会与table同级。
解决的方法: table>tbody> ” child ” >。
模板占位符!可以让内容需要整体循环的外文本包括消失。如果使用那么外围div也会循环
当需要子组件中数据为独立的可以通过组件中的data返回一个对象来解决,如果使用template那么就会使用同一个数据
用ref引用修改DOM节点或者组件
如果使用 DOM节点的话修改的就是 DOM节点,获取的方式需要用this.$refs. ref(注:这里的ref就是body标签中ref=“”的值) 获取。
如果是组件的话就是获取组件!
父组件通过属性(:count="0")的方式向子组件传值
可以通过接收父组件属性的方式接收数据,但是如果没有:count没有 ':'传递过来的值是字符串
因为Vue中存在单项数据流的概念,所以直接改变的话会报错,父组件可以随机改变子组件值,但是子组件无法修改父组件的值,只能使用。
解决的方法是:在子组件中定义一个函数=父组件需要传输的值,此时点击修改的是子组件的值(例如:return{number:this.count})
子组件通过事件触发的方式向父组件传值!@click=“handleClick”
非父子组件之间的传值:
1 首先先设置一个全局组件
2 其次令Vue.prototype.bus = new Vue();
3 创建实例对象
4 在全局组件中设置模板template 同时设置时间click,由于是在全局组件中使用的方法所以methods写在全局组件中
5 然后该方法使用this.bus.$emit(),由于最后还是全局组件监听所以在这可以使用生命周期钩子 mounted,自动监听
6 监听时注意作用域!
19.Vue的插槽就是在组件中插入标签,然后在template中用slot进行引用,如果要指定标签在模板中的位置,那么就需要使用具名插槽。就是给slot加name值(在body标签中是” one ” > ,在模板的template中是使用 ` ” one ” >Default Value `)
20.Vue当中的作用域插槽:
(1).创建全局组件及其模板template
(2)当需要用到循环或者是需要用到各种的模板,则需要用到Vue中的作用域插槽
(3).在body中写出组件,同时其第一子元素必须是 同时必带属性slot-scope="属性(props)"即
(4).在template中输入值,属性.值 ,在使用的时侯必须保证组件中template模板存在:item=item属性,此时获取的item值将传输到props.item中
21.实像toggle装换;
第一种:
1.先写2个组件,再设置一个按钮,点击时切换type值
2.当v-if值为type时候就显示!
第二种:使用动态组件。
1.先写2个组件,再设置一个按钮,点击时切换type值
2.设置component标签 此时需要一个:is属性,:is的值是什么就返回什么组件!
================================ Vue的环境==================================
1.路由器(router):根据网址的不同返回不同的内容给用户
2.main.js是主页面,里面可以展示路由,组件,等等可以按照名字在src中寻找到,在此同时在使用前要用import引入。
3.引入fastclick依赖的 原因:
1、手动点击与真正触发 click 事件会存在300ms的延迟(ios上面最明显)
2、点击穿透问题(点击行为会穿透元素触发非父子关系元素的事件)
在cmd中的traval 书写命令:npm install fastclick --save来安装然后使用 import FastClick from 'fastclick' FastClick.attach(document.body)
4.在引入其他css文件的时候可以把它集中放在文件及中,然后使用main.js中的import来引用css
5.项目的开始引入的依赖
1.npm install stylus --save
2. npm install stylus-loader --save
6.使用 npm audit fix 修复漏洞之后,再运行 npm run dev 就 报错 :
解决: 最后找出是版本更新原因 。 删除node_modules后,在 npm install之后,运行 npm i -D [email protected] 更新版本
每个公司的reset.css是不同的,需要适当进行修改才能达到目的
使用图片的时候可以去iconfont查找
组件的优化:
在style设置varibles.styl全局css使用时需要引入,需要改变主题色可以直接在文件里改
@符号代表src目录这样可以优化代码,减少长度。在css中要引入其他css要使用~@
如果需要多次使用同一个路径可以把其代换成一个符号就是@代表src一样:
方法:点开build中的webpack.base.conf.js找到resolve下的alias来改
git的指令。
最基础的 文件上传
①git init //在当前项目目录中生成本地git管理,并建立一个隐藏.git目录
②git add . //添加当前目录中的所有文件到索引
③git commit -m "first commit" //提交到本地源码库,并附加提交注释
④git push
如果创建了分支使用
git pull 把线上的分支下载到本地
git checkout index(分支) //切换到该分支
git status //查看在那个分支
编码!
git add . => git commit -m “ index ” =>git push
git checkout master //切换的主分支
git merge (分支)origin/index-swiper //合并到master注:先要处于master
使用轮播图的时候可以下载插件 使用命令 [email protected] --save
官网https://github.com/surmon-china/vue-awesome-swiper
一般设置大小都先在reset.css中设置body大小接下来都使用rem
如果要让多的文字显示 ... 那么需要封装一个函数 mixins.styl到styles中,当发现没有用的时候就在父元素中flex:1 下面加一个min-width:0
内容是:
e llipsis()
overflow:hidden
white-space:now-rap
text-overflow:ellipsis
注意flex布局!很重要
在父元素写display:flex说明子元素开始弹性布局
flex-direction:column :主轴的方向横row纵column,向主轴方向收缩
justify-content:center: 主轴对齐方式,center居中,space-between两边
align-items:center :交叉轴对齐,盒子下边界对齐用flex-end向交叉轴反向收缩
flex-warp:warp(换行)/nowrap(默认)/warp-reserve :的时候就可以自动换行,同时由于有边框所有需要使用box-sizing:border-box,
加载图片的时候注意在外面包裹一层占位的div
H eight:0 padding-bottom: 22%
进行数据交互的时候可以使用axios它功能完善十分强大
安装的时候输入命令npm install axios --save
18.进行ajax请求的时候尽量不要一个一个组件请求可以在总界面进行请求!这样性能得以优化
19只有把一些静态的页面放在static页面中才可以在外部访问到
20.如果不想某些文件提交到线上就需要打开gitignore 把需要屏蔽的路径放上去
21.vue中存在一个转发的机制可以把对api下面的所有请求,转发到本地static中mock(自己建立的)文件下,即:点开config文件夹里的index.js文件,找到proxyTable更改成
proxyTable: {
'/api': {
target: 'http://localhost:8080',
pathRewrite: {
'^/api': '/static/mock'}
}}
首次进行ajax请求的过程
安装axios npm install axios --save
在主页Home引入axios import axios form ‘ axios ’
在static下创建文件,因为外部只能访问到这个文件
屏蔽上传到码云,找到gitignore 输入路径就可以
在Home中进行ajax请求:
生命周期函数mounted : function() { this.getHomeInfo()}
在methods中添加函数get HomeInfo(){
axios.get( ‘ 路径eg:/static/mock/index.json/ ’ )//请求数据
.then(this.getHomeInfoSucc())//获取数据成功
}
在methods中添加方法 this.getHomeInfoSucc(res){ console.log(res)}
在(5)②中的路径一般需要更改,换成/api/index.json此时需要使用vue中的一个转发的机制更改 config文件夹里的index.js文件,找到proxyTable更改。
首次进行ajax交互:
父组件设立要传输的data值为空
在组件标签属性设置值
在子组件用props接收记住 Key:String/Array...,不用放在data中,然后用this.值放置在组件上
(5)③中可以获得数据,由于之前设值为空,所以在这里先判断
if (res.ret && res.data) {
const data = res.data
this.city = data.city
.....
}
24.页面使用组件的时候自己的template中不要加其他标签,加组件标签就好
25.当存在float浮动的时候会场上BFC区域,需要在父元素使用overflow=hidden 解决
26.在准备访问class下 的class的时候,需要在写出2给class,一个作为父class,内容就是子class
27.当页面list没有设置display:hidden 的时候,多出来的部分会撑出去。设置了之后页面不能移动,此时需要引入 better-scroll
28.使用router-link标签的to属性可以跳转页面
29.在需要网络的一些图片的时候需要使用 iconfont 组件
30.如果要使用ajax必须使用网络环境,要么搭建本地服务器 要么就用subineServer插件,点击工具- subineServer-serverstart之后,点击文件右键viewinserver打开就可以了、
基本项目中使用的插件
1.懒加载
npm install --save lozad
var lozad = require ( 'lozad' )
标签中: < img class = "lozad" data-src = "image.png" />
J s中: const observer = lozad (); // lazy loads elements with default selector as '.lozad' observer. observe ();
2.vuex
npm install vuex --save
由于大型项目需要传输很多值,所以需要在src中添加文件store文件同时添加index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new vuex.Store({
state: {//state存放全局公用数据
city: '北京' } })
M ain.js中引入import store from './store'在new Vue 中传入store
==============================移动端================================
meta name="viewport" content="width=device-width,initial-scale=1.0" 解释
V iewport概念
通俗来讲就是移动设备上显示网页的那一个部分,一般来说移动端的浏览器会设定自己的viewport一般是980px或1024px,实际的网站可能会比这个大,就会在显示出滚动条
2.css中的1px和移动设备中1px的区别
在PC端中css的1px往往是为实际的物理像素1px。但是在移动端中的设备五花八门,例如早先的ipone3分辨率为320*480,后来新出的ipone屏幕升级为640*960但是尺寸没有发生改变。这时css中的1px就不为1个物理像素了。我们可以通过 window . devicePixelRatio 来获取css中1px和实际像素的比例,像刚刚ipone3 1px为一个物理像素,更新后为1px等于2给像素 。 ( window . devicePixelRatio = 2)
可以这么理解,由于 你 设备 分辨率增大了,但屏幕尺寸并没有变大多少,必须让css中的1px代表更多的物理像素,才能让1px的东西在屏幕上的大小与那些低分辨率的设备差不多,不然就会因为太小而看不清。
3. ppk大神关于viewPort理论中的三种表现方式
layout viewport : 浏览器默认的viewport,会出现滚动条
visual viewport : 浏览器可视化区域的大小(通过 window.innerWidth 获取)
ideal viewport : 不同设备由不用的ideal viewport
例如ipone的viewport值为320,意思是css中的320px就是苹果宽度的100%,不管是什么尺寸的苹果手机ideal viewport 都是相同的!安卓设备就比较五花八门了320 360 384等等。(http://viewportsizes.com可查询)
添加 就可以把viewport设置为
4.在iphone和ipad上,无论你给viewport设的宽的是多少,如果没有指定默认的缩放值,则iphone和ipad会自动计算这个缩放值,以达到当前页面不会出现横向滚动条(或者说viewport的宽度就是屏幕的宽度)的目的
5.媒体查询常见尺寸
@media screen and (min-width:1200px){ ... }/* 大型设备(大台式电脑,1200px 起) */
@media screen and (min-width:992px){ ... }/* 中型设备(台式电脑,992px 起) */
@media screen and (min-width:768px) { ... } /* 小型设备(平板电脑,768px 起) */
@media screen and (min-width:480px){ ... }/* 超小设备(手机,小于 768px) */
==============================mysql== ==================================
1.利用mysql_connect(‘127.0.0.1’,’root’,’password’,’demo’);
2.navicat中的增删改查
-- 查询
-- select id,age,sex from users
-- 如果产生通配符就会产生全表扫描
-- select * from users
-- 语句可以选择一个列或者一个具体的值
-- select 1 from users
-- 增加
-- insert into users values(null,'小红',18,'女')
-- insert into users(name,age,sex) values('小白',18,'男')
-- 删除
-- delete from users where id<=2
-- delete from users where id<=2 and sex='女'
-- delete from users where id<=2,sex='女'
-- delete from users where id in(1,2,3,4,)
-- 修改
-- update users set sex ='为' where id=3
-- update users set sex=‘1’,age=‘2’ where id in(1,2,3,4);
bootstrap中 :
col-md-5 mb-3 代表 form的长 宽
Container表示居中
mx-5 my-5 代表margin right和margin top;
px-5 py-5 代表padding right和 padding top;
Form
1.form-control 代表from的标准格式;
2.form-row 代表from和label同一行 form-ground 代表换行;
Btn
btn btn-danger 红色;
Btn btn-success 绿色
你可能感兴趣的:(笔记)
第 13 题:谈谈你对 CSS 选择器以及优先级的理解?
Noxus丶SJ
常用的CSS选择器ID选择器、类选择器、标签选择器、属性选择器、伪类选择器、后代选择器权重划分在同一层级下!important>内联样式>ID选择器>类选择器>(标签选择器、伪类选择器、属性选择器)不同层级下正常来说权重值越高的优先级越高,但是一直以来没有具体的权重值划分,所以目前大多数开发中层级越深的优先级越高文章的内容/灵感都从下方内容中借鉴【持续维护/更新500+前端面试题/笔记】https
你活着可能已经死了-《得到》“武志红的心理学课”学习笔记28
大庆思考笔记
人生由几百、几千乃至几万个大大小小的选择构成,等你老了,回顾一生的时候,你发现最亏待的,恰恰是你自己,那你这一生,就白活了。我们来做一个调查,很简单,然而也许很“致命”:你能不能想起五件事,你特别想做的,但却一直没有去做的,就按照自由联想的顺序,把这五件事写出来。现在,你可以做你自己的“父母”,试试带着点偏执劲,去追逐一些你特别想追逐的事物,以此来滋养你的本我。分享一段鲁米的诗给你:有一颗光的种子
ReactiveCocoa 学习笔记七(RACCommand)
那夜的星空分外清澈
ReactiveCocoa ReactiveCocoa
RACCommandRACCommand关键的两个方法如下,理解了他们便能理解RACCommand的作用。-(instancetype)initWithEnabled:(nullableRACSignal*)enabledSignalsignalBlock:(RACSignal*(^)(InputType_Nullableinput))signalBlock;-(RACSignal*)execut
C语言学习笔记:do..while循环、goto语句
女巫和她的乌鸦
C语言 c语言 学习
do…while()循环,do语句的语法:do循环语句;while(表达式);例:intmain(){inti=1;do{printf("%d",i);i++;}while(i#include#includevoidmenu(){printf("1.play\n");printf("0.exit\n");}voidgame(){//猜数字游戏的实现:先生成随机数-->猜数字。rand函数返回了一个
Kubernetes学习笔记(四)--Pod 状态与生命周期管理
Mr小三
Kubernetes 云原生 kubernetes
文章目录四、Pod状态与生命周期管理1.Pod概念网络存储用法pod的终止2.Init容器init模板用途3.Pause容器4.Pod的生命周期Podphase(阶段)Pod状态5.Pod健康-容器探针(Probe)概念EXEC探针HTTP探针TCPSocket探针四、Pod状态与生命周期管理Pod是kubernetes中最重要的基本概念,在kubernetes中最小的管理元素不是一个个独立的容器
《比昂全集》阅读笔记:漫长的周末 - 战争 4 中
若宁Rena
【战争】第4节。如果年轻时候遇到一些优秀的人,这些人可能成为年轻人的榜样。一个人可能希望自己未来成为自己欣赏的老师、教官、或者自己的父母那样的父母。Bion所在的营地很好,纪律严明。那些军官也是应该服从的人。尽管有的教官有有依据的缺点,但是那时候还是容易把对方放到权威的角色里。Bion的生活中,有着:“训练、技术课程、左轮手枪、机关枪、六磅步枪,还有强大的坦克本身……”“不坏的士兵……熄灯……夜晚
什么是java
IT界小新学姐
Java属于一种计算机语言,计算机语言的种类非常多,总的来说可以分成机器语言、汇编语言、高级语言三大类。Java是一种高级计算机语言。Java是由SunMicrosystems在1995年首先发布的编程语言和计算平台。有许多应用程序和Web站点只有在安装Java后才能正常工作,而且这样的应用程序和Web站点日益增多。Java快速、安全、可靠。从笔记本电脑到数据中心,从游戏控制台到科学超级计算机,从
《小狗钱钱》学习心得(第三、四、五章)
A01琪公子
《小狗钱钱》学习心得(第三、四、五章)最近在跟战友读一本《小狗钱钱》的书,今天把读到的精华与对这本书的感悟分享给正在看文章的你,希望对你有用。一、成功笔记:1.昨天的梦想相册的三个重要梦想开始在我脑海中浮现,我闭眼想到靠自己努力买房并装修好的新房的温馨舒适、爸妈安享晚年的幸福时刻,以及清晨爱人醒来那甜蜜的微笑。2.给客户重新发了合同,不在急急燥燥,而是准备好,只要有机会,就紧紧抓住。3.用心读完了
python分布式爬虫打造搜索引擎--------scrapy实现
weixin_30515513
爬虫 python 开发工具
http://www.cnblogs.com/jinxiao-pu/p/6706319.html最近在网上学习一门关于scrapy爬虫的课程,觉得还不错,以下是目录还在更新中,我觉得有必要好好的做下笔记,研究研究。第1章课程介绍1-1python分布式爬虫打造搜索引擎简介07:23第2章windows下搭建开发环境2-1pycharm的安装和简单使用10:272-2mysql和navicat的安装
创意PPT模板:好水灵的排版,还是熟悉的味道
LJ的学习笔记
大家好,我是爱学习的瞄代表。今天给广大职场人带来一份创意PPT模板(好水灵的排版)。【总览图】:【PPT展示】:【PPT模板特点】:1、创意PPT模板,前所未有的快感;2、几乎所有素材均可编辑,有型更有料;3、扁平设计,时下正流行;4、好水灵的排版,还是熟悉的味道【获取方式】:微信公众号:LJ的读书笔记(ljdushubiji)回复关键词“0505”,即可获取。
猴子·成功日记(32)
Monkey_858e
2020/3/211、口语打卡2、牙套计时——26副第2天3、小提琴练习2小时4、学习理财+笔记5、备课+文稿6、尤克里里打卡7、上课8、练读《末日焚书》
《How to Take Smart Notes》读书笔记1
LY320
最近在读一本书,题为《HowtoTakeSmartNotes:OneSimpleTechniquetoBoostWriting,LearningandThinking–forStudents,AcademicsandNonfictionBookWriters》1。尚未读完,分享一些读这本书的感想,我的一些心得,和不解。这本书让我觉得最有收获的点是更新了我对记录和整理笔记的认识。通常我们在记录笔记时
左眼跳财右眼跳灾的科学依据是什么?医生告诉你答案
高省张导师
俗话说“左眼跳财,右眼跳灾”。许女士对这句俗语深信不疑。从一年前开始,许女士总是左眼皮跳,但每次只要稍作休息就能恢复正常,所以许女士都没放在心上,甚至还心想:说不定能走财运了。大家好,我是高省APP最大团队,【高省】是一个可省钱佣金高,能赚钱有收益的平台,百度有几百万篇报道,也期待你的加入。高省邀请码520888,注册送2皇冠会员,送万元推广大礼包。给大家推荐一个公主号《张十五笔记》分享引流,思维
为这人间操碎了心-读书笔记-02
Tracy的小书斋
火车有人嫌火车走得慢,又有人嫌火车冒烟脏。人类浪费时间精力做好多好多不该做的事,何必斤斤计较旅途所耗的时间?纵然火车走得像枪弹一般快,车上的人忙的是什么?火车冒烟是脏,可是冒烟的并不只是火车,何况现在火车多不冒烟了。如果老远地看火车冒黑烟或吐白气,那景象却不一定讨厌。送礼礼尚往来,来而不往非礼也。升官图一开始以为这篇文章会是在讲述官场的景象,但是原来升官图只是一个游戏。但是游戏中也蕴含了人间真理:
PyTorch torch.no_grad() 指南(笔记)
拉拉拉拉拉拉拉马
pytorch 人工智能 python 笔记 深度学习
PyTorchtorch.no_grad()权威在PyTorch深度学习框架中,高效的显存管理对于训练复杂模型和执行大规模推理任务至关重要。显存不足(OutOfMemory,OOM)错误是开发者经常面临的挑战之一。torch.no_grad()作为PyTorch提供的一个核心工具,能够在推理(inference)和验证(validation)阶段显著优化显存使用并提升计算速度。本报告旨在全面、深入
读书笔记之 瑞达利欧《原则》
niuDavid
桥水创始人瑞·达利欧写的《原则》一书,厚厚的竟达五百多页,我也是花费很长时间读完。《原则》主体架构无非分为三个部分,首先是写自己的历程,夹杂一些自己感悟作为本书的引子,第二部分是讲到归纳的生活原则,最后一部分就讲了工作中的原则。书中归纳点很多,虽然有些是我们早已体察到的,但仍有部分观点新鲜可敬,有些理论是深刻的,有些观点是让人触动不已,有些竟是即相通而又交叉验证的,这些都通过此书系统的给我们展显出
网络爬虫-07
YEGE学AI算法
Python-网络爬虫
网络爬虫-07)**Spider06回顾****scrapy框架****完成scrapy项目完整流程****我们必须记住****爬虫项目启动方式****数据持久化存储****Spider07笔记****分布式爬虫****scrapy_redis详解****腾讯招聘分布式改写****机器视觉与tesseract****补充-滑块缺口验证码案例****豆瓣网登录****Fiddler抓包工具****移
【RK3568 嵌入式linux QT开发笔记】 二维码开源库 libqrencode 交叉静态编译和使用
本文参考文章:https://blog.csdn.net/qq_41630102/article/details/108306720参考文章有些地方描述的有疏漏,导致笔者学习过程中,编译的.a文件无法在RK3568平台运行,故写本文做了修正,以下仅是自我学习的笔记,没有写的很详细。一:下载软件包https://download.csdn.net/download/qq_41630102/12781
20200323《学习就是找对方法》笔记1
芯雨诚
走出学习误区,找对学习方法作为老师,经常被问及的问题之一就是,“老师,学习怎么那么难?”“老师,有没有好的学习方法,能够让成绩快速提高呢?”问这个问题的既有学生,也有家长。每每遇到这个问题,我都有一种一言难尽的感觉……其实,学习是一件快乐的事情。我们却总是认为学习是一件“苦差事”,总是觉得学习过程“既枯燥又乏味”,在学校中“厌学”的学生比比皆是……问题到底出在哪里了呢?关键在于我们走进了学习的误区
这也将过去——《大历史:虚无与万物之间》读书笔记
毛毛小朋友
图片发自App无论你我的此生有多长,对整个生物的物种而言,都是短暂的;无论我们这个物种生命有多长,对所有的生命而言,都是短暂的;无论所有的生命有多长,对地球而言,都是短暂的;无论地球的寿命有多长,对银河系而言,都是短暂的;我们在短暂的生命中,仰望苍穹,渺小而又卑微的,仰视着时间的河流,那些生命的开端兴盛灭绝与重启。大历史,从星球的形成到未来的遐思,用13章,走完了关于地球的前世今生到未来,那么,阅
恋恋笔记本
赫本_abf2
昨晚洗完澡就捧着电脑躲被窝花了两个小时重温了《恋恋笔记本》真心推荐大家看熬对我影响挺大的完全改变了我的爱情观鉴于恋恋笔记本会看哭所以拒绝任何院线的催泪大片(除非自己导/演)睡前会看阿拉斯加独居修行者的纪录片渴望搬去那里远离尘世第一次看这部电影是在高中时候飞往北京的天空中小小的爱情观从那时候开始萌芽电影讲述了一个穷小子爱上富家小姐历尽坎坷白头偕老的故事很难泪目的我也会有情感代入时候毕竟一辈子只爱一个
随笔记
龙的心_48aa
新的模式下,人们争先恐后的抢占先机,未来的市场,是适应这种模式,还是淘汰这种模式!静观其变,以不变应万变!
2018-10-24丨微日记027
Jonathanchoi
今天分享一些小碎片:有道云笔记里头有一个扫描文档的功能,可是它只能自动识别,却不能给用户编辑的机会,可谓是“拍得到就是你的,拍不到就拜拜”,而扫描全能王则提供了识别错误后可编辑的功能。开完组会路过包道的时候,发现它提供了顾客到店开柜取餐的功能,为想吃到美食却赶路程赶时间的人们提供了多种选择性。这种饮食界的丰巢快递柜,个人我觉得很实用。捷登都会的洗手间设置让人不太习惯,三层男厕二层是女厕,经常让人白
c语言如何宏定义枚举型结构体,C语言学习笔记--枚举&结构体
搁浅的鲎
c语言如何宏定义枚举型结构体
枚举枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明:enum枚举类型名字{名字0,名字1,。。。,名字n};枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为它们就是常量符号,它们的类型是int,值则依次从0到n。如:enumcolor{red,yellow,green};就创建了3个常量,red的值是0,yellow的值是1,green的值是2。当需要一些可以排列
尚硅谷C语言笔记-结构体与共用体
想名困难户
尚硅谷C语言笔记 c语言 笔记
1、结构体(struct)类型的基本使用1.1为什么需要结构体?C语言内置的数据类型,除了几种原始的基本数据类型,只有数组属于复合类型,可以同时包含多个值,但是只能包含相同类型的数据,实际使用场景受限。1.2结构体的理解C语言提供了struct关键字,允许自定义复合数据类型,将不同类型的值组合在一起,这种类型称为结构体(structure)类型。C语言没有其他语言的对象(object)和类(cla
2018-05-10
黛丽丝
今天,儿子给我分享他的快乐:上课时,因为积极发言得了两张表扬信。又因为能积极背诵课文片段,又得了两张!祝贺!祝贺!晚上写作业挺积极,从不用我催促!这好习惯妈妈也该奖励!唯一缺乏自我细心检查的好习惯,什么时间儿子会自己认真检查作业,就更“完美”了!自从儿子买上笔记本,就见他有时记录一些东西,具体内容他一直保密!睡觉的时间到了,我忍不住地问:“儿子,你笔记本都记录些什么?”儿子说:“今晚你可以看了!不
学习笔记(39):结合生活案例,介绍 10 种常见模型
宁儿数据安全
# 机器学习 学习 笔记 生活
学习笔记(39):结合生活案例,介绍10种常见模型线性回归只是机器学习的“冰山一角”!根据不同的任务场景(分类、回归、聚类等),还有许多强大的模型可以选择。下面我用最通俗易懂的语言,结合生活案例,介绍10种常见模型及其适用场景:一、回归模型(预测连续值,如房价)1.决策树(DecisionTree)原理:像玩“20个问题”游戏,通过一系列判断(如“面积是否>100㎡?”“房龄是否0.5就判为“会”
USB Hub 和 USB Dock 技术解析
TESmart碲视
KVM切换器领域相关技术 网络 电脑 计算机外设 智能硬件 物联网 游戏
"笔记本只有两个USB口,外接键盘鼠标后就没法插U盘了…"这样的困扰正在数百万办公族日常上演。面对接口荒,市场给出了两种截然不同的解决方案——轻巧便携的USBHub与功能强大的USBDock扩展坞,但究竟哪种才是你的Mr.Right?本文将从工作原理、协议支持、应用场景三个维度展开深度解析:Hub如同USB接口的"分线器",通过简单的信号复制实现多个USB端口基础扩展;Dock则是系统级的"外设中
《故事写作大师班》阅读笔记
莫如斯
从今天起,开始在微信读书上阅读《故事写作大师班》。每天晨读一个小时,细细来读,约需10天。在阅读过程中,发现有感触、有收获的段落,以及他人分享的有价值的内容,先在这里记录下来,等整本读完,再作一个总结。《故事写作大师班》作者约翰。特鲁比,是好莱坞首屈一指的故事写作顾问,约翰。特鲁比作家工作室创始人。该书是他30年故事创作与教学经验的精华,包含故事写作的整套秘诀,帮且创作者找到对的方法,写出好的故事
Unity_通过鼠标点击屏幕移动屏幕里的一个对象
沧海归城
unity 计算机外设 游戏引擎
文章目录一、获取到点击物体的Tansform(摁下鼠标左键的瞬间)二、移动点击的物体(摁着鼠标左键不放)三、松开左键清理被移动对象属性总结注:本文章只是学习总结的笔记,视频链接一、获取到点击物体的Tansform(摁下鼠标左键的瞬间)实现思路:通过Camera的ScreenPointToRay方法和Input.mousePosition鼠标坐标生成创建Ray射线,再通过Physics的Raycas
apache 安装linux windows
墙头上一根草
apache inux windows
linux安装Apache 有两种方式一种是手动安装通过二进制的文件进行安装,另外一种就是通过yum 安装,此中安装方式,需要物理机联网。以下分别介绍两种的安装方式
通过二进制文件安装Apache需要的软件有apr,apr-util,pcre
1,安装 apr 下载地址:htt
fill_parent、wrap_content和match_parent的区别
Cb123456
match_parent fill_parent
fill_parent、wrap_content和match_parent的区别:
1)fill_parent
设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间。这跟Windows控件的dockstyle属性大体一致。设置一个顶部布局或控件为fill_parent将强制性让它布满整个屏幕。
2) wrap_conte
网页自适应设计
天子之骄
html css 响应式设计 页面自适应
网页自适应设计
网页对浏览器窗口的自适应支持变得越来越重要了。自适应响应设计更是异常火爆。再加上移动端的崛起,更是如日中天。以前为了适应不同屏幕分布率和浏览器窗口的扩大和缩小,需要设计几套css样式,用js脚本判断窗口大小,选择加载。结构臃肿,加载负担较大。现笔者经过一定时间的学习,有所心得,故分享于此,加强交流,共同进步。同时希望对大家有所
[sql server] 分组取最大最小常用sql
一炮送你回车库
SQL Server
--分组取最大最小常用sql--测试环境if OBJECT_ID('tb') is not null drop table tb;gocreate table tb( col1 int, col2 int, Fcount int)insert into tbselect 11,20,1 union allselect 11,22,1 union allselect 1
ImageIO写图片输出到硬盘
3213213333332132
java image
package awt;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imagei
自己的String动态数组
宝剑锋梅花香
java 动态数组 数组
数组还是好说,学过一两门编程语言的就知道,需要注意的是数组声明时需要把大小给它定下来,比如声明一个字符串类型的数组:String str[]=new String[10]; 但是问题就来了,每次都是大小确定的数组,我需要数组大小不固定随时变化怎么办呢? 动态数组就这样应运而生,龙哥给我们讲的是自己用代码写动态数组,并非用的ArrayList 看看字符
pinyin4j工具类
darkranger
.net
pinyin4j工具类Java工具类 2010-04-24 00:47:00 阅读69 评论0 字号:大中小
引入pinyin4j-2.5.0.jar包:
pinyin4j是一个功能强悍的汉语拼音工具包,主要是从汉语获取各种格式和需求的拼音,功能强悍,下面看看如何使用pinyin4j。
本人以前用AscII编码提取工具,效果不理想,现在用pinyin4j简单实现了一个。功能还不是很完美,
StarUML学习笔记----基本概念
aijuans
UML建模
介绍StarUML的基本概念,这些都是有效运用StarUML?所需要的。包括对模型、视图、图、项目、单元、方法、框架、模型块及其差异以及UML轮廓。
模型、视与图(Model, View and Diagram)
&
Activiti最终总结
avords
Activiti id 工作流
1、流程定义ID:ProcessDefinitionId,当定义一个流程就会产生。
2、流程实例ID:ProcessInstanceId,当开始一个具体的流程时就会产生,也就是不同的流程实例ID可能有相同的流程定义ID。
3、TaskId,每一个userTask都会有一个Id这个是存在于流程实例上的。
4、TaskDefinitionKey和(ActivityImpl activityId
从省市区多重级联想到的,react和jquery的差别
bee1314
jquery UI react
在我们的前端项目里经常会用到级联的select,比如省市区这样。通常这种级联大多是动态的。比如先加载了省,点击省加载市,点击市加载区。然后数据通常ajax返回。如果没有数据则说明到了叶子节点。 针对这种场景,如果我们使用jquery来实现,要考虑很多的问题,数据部分,以及大量的dom操作。比如这个页面上显示了某个区,这时候我切换省,要把市重新初始化数据,然后区域的部分要从页面
Eclipse快捷键大全
bijian1013
java eclipse 快捷键
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt+↑ 当前行和上面一行交互位置(同上)Alt+← 前一个编辑的页面Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)Alt+En
js 笔记 函数
征客丶
JavaScript
一、函数的使用
1.1、定义函数变量
var vName = funcation(params){
}
1.2、函数的调用
函数变量的调用: vName(params);
函数定义时自发调用:(function(params){})(params);
1.3、函数中变量赋值
var a = 'a';
var ff
【Scala四】分析Spark源代码总结的Scala语法二
bit1129
scala
1. Some操作
在下面的代码中,使用了Some操作:if (self.partitioner == Some(partitioner)),那么Some(partitioner)表示什么含义?首先partitioner是方法combineByKey传入的变量,
Some的文档说明:
/** Class `Some[A]` represents existin
java 匿名内部类
BlueSkator
java匿名内部类
组合优先于继承
Java的匿名类,就是提供了一个快捷方便的手段,令继承关系可以方便地变成组合关系
继承只有一个时候才能用,当你要求子类的实例可以替代父类实例的位置时才可以用继承。
在Java中内部类主要分为成员内部类、局部内部类、匿名内部类、静态内部类。
内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相
盗版win装在MAC有害发热,苹果的东西不值得买,win应该不用
ljy325
游戏 apple windows XP OS
Mac mini 型号: MC270CH-A RMB:5,688
Apple 对windows的产品支持不好,有以下问题:
1.装完了xp,发现机身很热虽然没有运行任何程序!貌似显卡跑游戏发热一样,按照那样的发热量,那部机子损耗很大,使用寿命受到严重的影响!
2.反观安装了Mac os的展示机,发热量很小,运行了1天温度也没有那么高
&nbs
读《研磨设计模式》-代码笔记-生成器模式-Builder
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/**
* 生成器模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示(GoF)
* 个人理解:
* 构建一个复杂的对象,对于创建者(Builder)来说,一是要有数据来源(rawData),二是要返回构
JIRA与SVN插件安装
chenyu19891124
SVN jira
JIRA安装好后提交代码并要显示在JIRA上,这得需要用SVN的插件才能看见开发人员提交的代码。
1.下载svn与jira插件安装包,解压后在安装包(atlassian-jira-subversion-plugin-0.10.1)
2.解压出来的包里下的lib文件夹下的jar拷贝到(C:\Program Files\Atlassian\JIRA 4.3.4\atlassian-jira\WEB
常用数学思想方法
comsci
工作
对于搞工程和技术的朋友来讲,在工作中常常遇到一些实际问题,而采用常规的思维方式无法很好的解决这些问题,那么这个时候我们就需要用数学语言和数学工具,而使用数学工具的前提却是用数学思想的方法来描述问题。。下面转帖几种常用的数学思想方法,仅供学习和参考
函数思想
把某一数学问题用函数表示出来,并且利用函数探究这个问题的一般规律。这是最基本、最常用的数学方法
pl/sql集合类型
daizj
oracle 集合 type pl/sql
--集合类型
/*
单行单列的数据,使用标量变量
单行多列数据,使用记录
单列多行数据,使用集合(。。。)
*集合:类似于数组也就是。pl/sql集合类型包括索引表(pl/sql table)、嵌套表(Nested Table)、变长数组(VARRAY)等
*/
/*
--集合方法
&n
[Ofbiz]ofbiz初用
dinguangx
电商 ofbiz
从github下载最新的ofbiz(截止2015-7-13),从源码进行ofbiz的试用
1. 加载测试库
ofbiz内置derby,通过下面的命令初始化测试库
./ant load-demo (与load-seed有一些区别)
2. 启动内置tomcat
./ant start
或
./startofbiz.sh
或
java -jar ofbiz.jar
&
结构体中最后一个元素是长度为0的数组
dcj3sjt126com
c gcc
在Linux源代码中,有很多的结构体最后都定义了一个元素个数为0个的数组,如/usr/include/linux/if_pppox.h中有这样一个结构体: struct pppoe_tag { __u16 tag_type; __u16 tag_len; &n
Linux cp 实现强行覆盖
dcj3sjt126com
linux
发现在Fedora 10 /ubutun 里面用cp -fr src dest,即使加了-f也是不能强行覆盖的,这时怎么回事的呢?一两个文件还好说,就输几个yes吧,但是要是n多文件怎么办,那还不输死人呢?下面提供三种解决办法。 方法一
我们输入alias命令,看看系统给cp起了一个什么别名。
[root@localhost ~]# aliasalias cp=’cp -i’a
Memcached(一)、HelloWorld
frank1234
memcached
一、简介
高性能的架构离不开缓存,分布式缓存中的佼佼者当属memcached,它通过客户端将不同的key hash到不同的memcached服务器中,而获取的时候也到相同的服务器中获取,由于不需要做集群同步,也就省去了集群间同步的开销和延迟,所以它相对于ehcache等缓存来说能更好的支持分布式应用,具有更强的横向伸缩能力。
二、客户端
选择一个memcached客户端,我这里用的是memc
Search in Rotated Sorted Array II
hcx2013
search
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given ta
Spring4新特性——更好的Java泛型操作API
jinnianshilongnian
spring4 generic type
Spring4新特性——泛型限定式依赖注入
Spring4新特性——核心容器的其他改进
Spring4新特性——Web开发的增强
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——Groovy Bean定义DSL
Spring4新特性——更好的Java泛型操作API
Spring4新
CentOS安装JDK
liuxingguome
centos
1、行卸载原来的:
[root@localhost opt]# rpm -qa | grep java
tzdata-java-2014g-1.el6.noarch
java-1.7.0-openjdk-1.7.0.65-2.5.1.2.el6_5.x86_64
java-1.6.0-openjdk-1.6.0.0-11.1.13.4.el6.x86_64
[root@localhost
二分搜索专题2-在有序二维数组中搜索一个元素
OpenMind
二维数组 算法 二分搜索
1,设二维数组p的每行每列都按照下标递增的顺序递增。
用数学语言描述如下:p满足
(1),对任意的x1,x2,y,如果x1<x2,则p(x1,y)<p(x2,y);
(2),对任意的x,y1,y2, 如果y1<y2,则p(x,y1)<p(x,y2);
2,问题:
给定满足1的数组p和一个整数k,求是否存在x0,y0使得p(x0,y0)=k?
3,算法分析:
(
java 随机数 Math与Random
SaraWon
java Math Random
今天需要在程序中产生随机数,知道有两种方法可以使用,但是使用Math和Random的区别还不是特别清楚,看到一篇文章是关于的,觉得写的还挺不错的,原文地址是
http://www.oschina.net/question/157182_45274?sort=default&p=1#answers
产生1到10之间的随机数的两种实现方式:
//Math
Math.roun
oracle创建表空间
tugn
oracle
create temporary tablespace TXSJ_TEMP
tempfile 'E:\Oracle\oradata\TXSJ_TEMP.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent m
使用Java8实现自己的个性化搜索引擎
yangshangchuan
java superword 搜索引擎 java8 全文检索
需要对249本软件著作实现句子级别全文检索,这些著作均为PDF文件,不使用现有的框架如lucene,自己实现的方法如下:
1、从PDF文件中提取文本,这里的重点是如何最大可能地还原文本。提取之后的文本,一个句子一行保存为文本文件。
2、将所有文本文件合并为一个单一的文本文件,这样,每一个句子就有一个唯一行号。
3、对每一行文本进行分词,建立倒排表,倒排表的格式为:词=包含该词的总行数N=行号