下载地址是: www.jeasyui.com/download
当前版本是1.6.7 是由 jquery ui 扩展而来的.php
像jquery ui, bootstrap, jquery easyui三者都是相似的ui框架, 感受 easyui如其名同样, 是最简单最宜用的, 并且包含的 前端组件是最全面的. 当jquery ui和easyui的 tabs dialog等组件名称有 冲突(相同时), 能够css
定制jQuery组件,只保留jQueryUI中的Tabs, Dialog. (其余的如DatatimePicker等使用EasyUI重写);这样咱们会获得一个只有40K的jQueryUI文件. 而后 将精简后的jQueryUI加载到EasyUI引用以后,这样EasyUI的Tabs和Dialog就会被复写。html
easyui 比jquey ui 要"重一些", 因此 jquery ui适合前台,easyui适合后台,但我想何须添加2个库呢,直接一个easyui不就好了,反正也不大多少.前端
如何选择 bootstrap和 easyui?
bootstrap侧重于css, 侧重于前端, 样式很美观精美, 可是js/组件功能不是很全面充足, 而easyui则 侧重于 后台, 有不少强大的js, 因此作后台通常用easyui.mysql
所谓的web开发有不少ui框架, 可是就这样定了, 前端用bootstrap的css, 后台用 easyui的各类组件, 或用easyui的 bootstrap主题jquery
====================================web
js中有两个函数,之前很混淆, 其实仍是很简单的:
setTimeout是只执行一次, 而setInterval是重复屡次周期性的执行回调函数。 两个函数的时间都是以 毫秒为单位, 好比 1000, 2000表示1秒, 2秒
setInterval 会返回一个 定时器的句柄handle, 这个句柄就是 用来关闭定时器的, 用 clearInterval
Interval是 inter + val (inter value) 间隔值的意思ajax
easyui有不少组件能够方便的和后台php之间进行数据交换, 获取后台的数据装载到组件中, 主要是经过 "href或url"属性来实现的. 并且是ajax方式, 还有loading效果, 这一点很重要也很方便, 虽然都写得来,可是不必本身去写, 能够更专一于业务代码的书写.
php中 , (包括全部的语言中), 都要善于使用 "等待/ 延时, 延迟"的语句, 并非 全部的代码都必需要一开始就执行, 有的时候, 须要 "等一下" 再执行! 必定要有这样的意识! php中用 sleep($second秒数)函数 来等待sql
因为eu=easyui 在构造 组件的时候, 不须要本身去写大量的 html, 因此 很是简洁和方便(相比 bootstrap那样要记忆大量的类名而言)thinkphp
在eu, bs等框架中, 所谓的 "折叠" 面板, 折叠就是 面板上有一个 按钮, 经过这个按钮, 能够显示和隐藏 面板的 内容部分: 这个是经过 css的 属性 : display: none 来实现的. (display的属性不少, 有 block, inline等等, 也有none 这个属性, 表示不显示)
div和p元素的自动增高? 和最小高度?
div和p自己就是 自动增高的, 不须要设置.
只是当div和p中 的内容不多的时候, 他的高度会塌陷, 你能够设置固定的 尺寸, 也能够设置一个 最小高度, 这样 即便内容不多, 也能保证 不塌陷.
最小高度 也是一个标准的css属性: 浏览器都支持, 好比:div { min-height: 200px; }
=================================
好比: $json = ''; while(...) {... ; $json .= $row; } echo $json;
打印数组的效果,因为浏览器 会 忽略源代码中的 回车键enter, 使得数组的输出挤在同一行, 这时能够配合 “查看页面源代码 ” 来查看, 在源代码中就会显示得 比较 "可读". 更加清晰。
好比 print_r($json 数组)
-> "查看页面源代码"
在大多数框架中,当元素支持ajax 后台数据获取和交换的时候, 使用 url和 href属性的时候, 是从后台获取数据的。 为了可以看到、模拟出 在实际远程、慢速http网络中的 等待载入loading... 的效果,一般能够在后台php文件中, 用 sleep(waitSecond);
来写。 要灵活的, 善于使用 sleep函数 。
php的后台 文件 、不是函数, 用来向 前台页面提供 ajax返回数据的时候, 不是用的 return语句(return语句是 函数返回时用的), 而是用的 echo语句输出: 非输出语句 对前台是没有影响的, 只有echo语句的结果才有效
字符串截取函数再也不疑惑: 在php中 用substr(start, len),索引从0开始; 在mysql中 用substring , 索引 从1 开始; 而在JavaScript中 用substr和substring 两个函数, 前者是 substr(start, len),后者是 substring(start, end);
重要的是, php中 若是要表示 "只取字符前面多少个字符= =去掉字符串最后面几个字符" 此时使用
substr($json, 0, len)
,可是也可使用substr($json, 0, -1/- 去掉最后的结尾字符的个数, 好比 -2, -3等等) 去掉字符串最后的一个字符
会更简洁。 比substr($json, 0 , $len-1)
更简洁并且没必要知道字符串的长度了。
一般 什么叫异步的? 就是 回调函数 就是 异步的!
======================================
$ ('#节点'). 组件名('方法名', [参数])
可是 消息框组件messager 比较特殊, 他的方法调用不依赖于dom中的节点, 直接用 $ 来调用。 并且方法调用 是普通的 函数名加 参数的方式,好比: 警告框的调用是: $. messager. alert('标题名', '警告内容', '图标的名称error, warning, info, question' , function(){..回调函数 }
其余消息框的 回调函数, 有一个 r 参数, r表示的是 response 回应, 即你按的是 哪一个 “ok” 仍是 “cancel” 按钮, 因此 有 if(r) {...}
分页的原理是:页面的pagination 其实是一个 div, 显示的内容 你是能够自定义的。 根据 预先设置的pageSize, pageList 和 当前你选定的页面序号 pageNumber, 来决定当前页要显示的内容。 关键是每页显示的内容 是从后台url.php页面ajax过来的, url.php要传递回来的数据包括两个, 一个是 记录的总条数totals, 这样来决定分多少页; 另外一个是rows: [{...}, {....}, {...}] 的json数组,来决定每一次返回的是哪些不一样的记录数据。 所以, 在url.php中, 就是根据从前端传递过去的这些 pageSize, pageList 和 当前你选定的页面序号 pageNumber 参数, (这些参数 默认的是 经过 post方法 传递到后台的), 你能够在 firebug中 看到 前台页面传递到 后台的 参数, 你就 在 url.php的后台页面中 去 $_POST['参数']
获取到这些参数, 而后 使用 thinkphp的 find 方法, select方法等去 limit () 链式操做去 获取数据库中的 记录 ,而后 把这些记录 赋值给 rows 变量. 那么这个 rows就会 返回到 前台页面显示出来了.
eu中的组件 在 进行一些操做(主要 是 显示/隐藏 操做) 后, 可能会形成 位置的 错位, 为了恢复到 原来的位置 状态, 能够调用 它的 resize 方法, 好比 : $('acc').accordion('resize');
eu中的通用的思想, 能够设置通用的 "默认设置 / 属性" : $.fn.resizable.disabled = true;
通用的默认方法有: disable, enable, options , 注意这个是没有 ed的
通用的事件有: onStart, onStop等...
属性 是 disabled , 带ed的, 表示 状态, 方法是 动词, 好比 enable, 是 表示 去作什么, 而事件 是表示 当 什么的时候 去作什么 动做, 因此 也是 : on + 动词, 好比: onSelect等
eu的方法, 都是 在 对应 的 组件名称 后 ( '方法名', [参数]), 好比: $('prog'). progressbar('setValue', 60);
eu中的 宽度和 高度等 表示 数值的 , 使用的格式 都是 纯数字的, 不须要在后面 加px了, 好比: width: 500
eu中的组件,比 bs的使用方法 要 简单 得多, 基本上 你不须要 去记忆那么多复杂的 class, 你只须要写html结构就行了, 并且 绝大多数 都是使用的 div 结构, 只有 少数的几个 组件使用 是 a 标签 好比 linkbutton 组件等.
注意, accordion 组件的 单词写法, 两个 字母 都是 o, 最后一个不是 字母a.
panel和window等组件, 从外形上来讲, 都差很少, 都有标题栏和客户区, 主要仍是一个 语义上的差异: 它们 默认 提供的方法和事件 不一样. 你也能够把 panel经过定义 一些自定义的属性,改形成 window, 可是这样作就不合适.
若是你从 语义上 来讲, 就是须要的 一个 window, 那么你就是用window 组件, 而不要是用 panel, 若是你并不须要 窗口的事件和方法, 那么你就只使用 panel就行了.
panel组件是不少组件的基础, 都依赖于它, 如tabs, accordion(分类组件), 这些组件其实是 多个panel 的组合.
所以, 这些组件就会有两种属性和方法, 一个是 组件自身的 独有的方法和属性; 另外一个是从 panel继承来的属性.
ajax从后台获取的交换数据文件, 能够是任意的文件,不必定 必须是 php文件, 任何的 txt, html, asp,jsp文件都是能够的, 只要是有 "输出" 内容的 均可以!
tabs组件 在eu中是 很简单的,其索引是从 0 开始, 并且 并非必需要有一个选项卡被选中的, 能够都不被选中的.
凡是onBefore... 的均可以在 事件的函数 代码中, 根据不一样的 状况返回 false, 那么对应的 ... 事件 将不会被执行;而 on... 的事件 一般是 指 相应的事件/动做 完成以后 执行的, 而不是指 事件正在执行的同时 去执行 on...函数体, 由于js 不可能 在 事件正在执行的时候, 去执行js代码,因此onload是指所有的 document文档都被加载完成后, 才去执行的代码,而不多是 一边加载文档dom , 一边去执行js代码的。 跟 onAfter...做用是同样的, 而一般不少组件都没有提供 onAfter...事件
location.href , 好比document.click(function(){...});
因此 要注意 区分 window和 document的 关系, 不要把它们搞混了。window.alert(...) 就写 alert(....)
=========================================
onStartDrag等事件, 是做为 { 属性中的选项} 来使用的, 放在 初始化方法 Draggable里面的,
而方法 好比 Disable等 则是 放在 初始化 方法 外面的, 跟初始化 方法 是 并立 平齐的.
要修改 kindeditor的 背景, 须要在css文件中的 项目 : .ke-container 和 .ke-edit-textarea 中 进行修改
如何设置 kindeditor 的 文本框区域 自动 随内容 增高?
在create方法的选项中: afterCreate: function(){ this.loadPlugin('autoheight'); }, myeditor. edit.setHeight(500); /////// 注意: kindeditor 的 myeditor是 整个editor组件对象, 其中的 可编辑区 是myeditor的一个属性: edit, 它也是一个对象, 有相关的方法... 或者: editor.edit.setHeight("600"); var autoheight = editor .edit.doc.body. scrollHeight; editor.edit.setHeight(autoheight);
const 常量 是属于 类, 而不是属于 某个具体的对象的, 因此 要用 类名 来引用 好比: const INSERT_MODE=1; 引用时 className::INSERT_MODE
一般使用的场合是: 若是只是在类的内部, 要定义几种并列的情形, 有几种选择, 想用数字来区分, 可是为了便于 记忆和 表义, 就可使用 类的 常量来作.
若是要在 全局都使用 的常量, 就使用 全局 常量, 使用 define来定义
tp的命名范围: 定义一个变量 $_scope 注意不是 命名空间, 实际的目的, 是将前面 的多个连贯操做换了一个方式, 将多个连贯操做封装 /集合到一块儿了的意思.
对tp 的查询结果 也能够 强制 使用索引, 即便用 index连贯操做. 方法是: $user->index('user') -> select();
要注意 这个索引 字段 必须是 实实在在的/ 已经在 数据库的数据表上 建立了 对应的 字段 'user' 的 索引了.
$user->token(false/true是否采用 令牌随机数验证) -> create();
token的原理?
token就是 令牌, 实际上就是 session 中的一个随机数, 随机id.其最大特色是随机性, 不可预测, 通常黑客或软件没法猜想出来.
token主要用于两个地方: 放在表单 重复提交; 防止 anti csrf攻击(cross server/site request fault 跨站点请求伪造)
二者在原理上都是经过 session token 来实现的, 当客户端请求页面时, 服务器会生成一个随机数token, 而且将token放到服务器上session当中, 而后将token放在发给用户的数据文件中,( 通常是用 hidden隐藏表单的方式), 下次客户端提交请求时, toke 会随表单一块儿提交到服务器.
若是用于 防止表单重复提交, 则在服务器端第一次验证相同事后, 会将 session中的token值更新一次, 因此 当用户重复提交时, 后面的验证就会失败, 由于用户提交的表单中的token没变, 但服务器端session中的token已经改变了.
strict连贯操做 "是否严格检查", 是 tp的3.2.3 新增的, 主要是 用于 设置 在 新增/更新(add操做和 save)记录时, 判断 数据源中的字段 是否 跟数据表中的 字段 (个数和类型 )是否 彻底一致, 若是 不一致, 在strict(false)时, 会忽略 数据表中没有 而数据源中 有的字段, 若是strict(true)时, 则会 抛出异常.
$user -> strict(true) -> add($data);
====================================
关联模型
关联模型中 有两个表, 当前模型类所对应的表, 或者说,mysql当前正在操做的/执行的表, 叫 主表, 参照表, 那么另外一个表(被关联的/被躺枪的表)叫 关联表.
关联表的关联 一般用 mapping 来表示
==================================================
查询惟一数据的时候, 是 使用distinct 关键字, 这个distinct至关于一个 形容词, 修饰语, 用来 修饰 要查询的字段 , 是 惟一的, 不能重复. 若是 使用 "distinct * " 而又有 id 主键的话, 将不能 过滤惟一性字段的值 , 由于有主键id自己就是 惟一的了.
要注意的是, distinct 是 根据 distinct 后面全部字段 合起来时 的数据 一块儿 来判断 是不是相同的. 而不是 紧挨着 distinct关键字的那个字段. 好比: distinct name, 则只会看name字段 是否相同的惟一性, 若是 是 distinct name, age 则会 判断 只有当 name和age两个 字段的 值 都相同时 , 才认为是 相同记录, 被 过滤掉, 若是 只是 name相同, 而age不一样, 则认为是两条 不一样的记录, 不会被 distinct 所过滤.
避免在最高层使用 distinct 应该是一条基本规则 。缘由在于,即便咱们遗漏了链接的某个条件, distinct 也会使查询 " 看似正确 " 地执行 —— 无能否认,发现重复数据容易,发现数据不许确很难,因此避免在最高层使用 distinct 应该是一条基本规则。 发现结果不正确更难.....
mysql> select * from user; +----+----------+------+ | id | name | age | +----+----------+------+ | 1 | zhangsan | 20 | | 2 | lisi | 30 | | 3 | jack | 20 | | 4 | mike | 20 | | 5 | jack | 10 | | 6 | ??? | 10 | | 7 | jack | 10 | +----+----------+------+ 7 rows in set (0.00 sec) mysql> select distinct name, age from user; +----------+------+ | name | age | +----------+------+ | zhangsan | 20 | | lisi | 30 | | jack | 20 | // 这里的 两个 jack age 会认为是不一样的记录 | mike | 20 | | jack | 10 | | ??? | 10 | +----------+------+ 6 rows in set (0.00 sec) mysql> select distinct name from user; +----------+ | name | +----------+ | zhangsan | | lisi | | jack | // 这里的两个 jack 被 distinct所过滤 | mike | | ??? | +----------+ 5 rows in set (0.00 sec) mysql>