首页
免费后端云服务
关于
推荐
免费图床源码
Search
1
小程序后端入门系列视频教程【一-微信开发工具介绍】
9,722 阅读
2
微信小程序三级联动之多列选择器
9,606 阅读
3
小程序开发免费后端之神秘利器分享
9,536 阅读
4
Golang-开发企业级资源权限管理【第一步表设计】-1
9,081 阅读
5
学会微信服务端开发第一步
8,979 阅读
日常记录
日常
随笔
Bmob后端云
从零开始学物联网
Serverless实战驾校小程序
心邮
Serverless
向量数据库
登录
Search
Magic
累计撰写
124
篇文章
累计收到
80
条评论
首页
栏目
日常记录
日常
随笔
Bmob后端云
从零开始学物联网
Serverless实战驾校小程序
心邮
Serverless
向量数据库
页面
免费后端云服务
关于
推荐
免费图床源码
搜索到
124
篇与
的结果
2015-07-03
微信小程序会员卡开发跳坑
微信小程序会员卡开发跳坑最近看好多人问,小程序里面怎么显示会员卡,然客户领取后,去对应店铺核销。本身以为会很简单,最后费了好大心思才找到对应文档。 会员卡是见过微信最差的文档了,没说明参数从哪里获取。这篇文章带大家跳坑看了一下文档,大概是这样一个函数,可以让用户领取会员卡wx.navigateToMiniProgram({ appId: 'wxeb490c6f9b154ef9', //固定为此 appid,不可改动 extraData: data, // 包括 encrypt_card_id, outer_str, biz三个字段,须从 step3 中获得的链接中获取参数 success: function() { }, fail: function() { }, complete: function() { } })这里的 extraData: data, // 包括 encrypt_card_id, outer_str, biz三个字段,须从 step3 中获得的链,是关键。 extraData,值文档说的第三步,在文档里面很难找到第三步获取开卡组件参数内容。也找不多哪个接口有返回这三个参数 encrypt_card_id, outer_str, biz。文档上面有个开卡组件文档,我们打开https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&key=1479824356&version=1&lang=zh_CN&platform=2&token=既然开卡组件文档没有,那我们去公众号文档,会员卡相关文档看下。找到卡券-小程序打通https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1499332673_Unm7V找到:接口1:获取开卡插件参数红色箭头返回的URL,就带了我们需要的encrypt_card_id, outer_str, biz 三个参数, 只是文档没有说明,这个是url里面带的值,而不是返回的参数,所以给查找带来了麻烦。我们试试(这里之前记得先调用公众号access_token接口,然后去公众号后台拿到卡片ID)真的拿到了,我们需要的三参数, 然后通过url解析,得到参数。wx.navigateToMiniProgram({ appId: 'wxeb490c6f9b154ef9', //固定为此 appid,不可改动 extraData: data, // 包括 encrypt_card_id, outer_str, biz三个字段,须从 step3 中获得的链接中获取参数 success: function() { }, fail: function() { }, complete: function() { } })小程序里做个按钮,领取会员卡。点击事件执行上面代码提示此小程序未绑定公众账号此时我们登陆公众账号,绑定这个小程序。绑定后,继续提示错误"navigateToMiniProgram:fail appId "wxeb490c6f9b154ef9" is not in navigateToMiniProgramAppIdList"看英文的意思是说小程序wxeb490c6f9b154ef9未绑定此公众号。 这里wxeb490c6f9b154ef9 并不是我们自己的一个小程序appid ,而是文档规定必须填写的wxeb490c6f9b154ef9,这个是官方的一个小程序appid, 原理是我们执行调整小程序,跳转到官方小程序领取会员卡。比较麻烦的是,绑定官方开卡这个小程序,需要官方同意才可以,这里添加了绑定,官方2天没同意,已经失效。到此,就实现了微信小程序,跳转到卡卷小程序,领取会员卡的开发过程。
2015年07月03日
4,004 阅读
0 评论
37 点赞
2015-02-25
Golang-开发企业级资源权限管理【第一步表设计】
我们做企业级系统,权限控制主要分三类。【功能权限】:对菜单栏目进行权限控制,查询,增加,删除,修改功能,一般来说这种对资源的权限控制模型可以做到比较统一(用户、角色、资源)。【数据权限】:哪些人能看到哪些数据,例如淘宝本人只能看自己订单,北京地区部门领导可以看到电器类部门订单, 最高领导能看到人所有订单等等。 这种跟业务高度相关,(网络上资料暂时比较少)原理主要是对SQL语句添加where 条件【字段权限】:订单能看到哪些字段,如供应商,看不到内部价、 出厂价等信息。 (网络上资料暂时比较少)实现原理跟数据权限控制是一致的。对SQL语句添加select 条件这次,我们主要讲解最常用的功能权限控制的实现过程,这类WEB权限控制,在任意后端语言上都可以实现Java、Golang、PHP、Nodejs、Python等等,主要理解其数据模型。我们先看最终实现的功能效果。1.角色管理页面这里可以新增角色,删除角色, 注意的是,这里有一个最高权限角色超级管理员,不允许删除,还有一个批量导入管理员默认角色。2.新增角色,编辑角色这里把系统大部分资源路由进入权限控制,说的大部分是因为有些页面权限是不需要进行控制,例如登陆、注册、以及后台一些下拉选项(读取的数据库接口)。3.管理员列表4.给管理员分配权限涉及数据表1.用户表用户表主要增加字段 rolesId 角色ID,了解这个用户是哪个角色。2.角色表角色表主要记录这个角色的名称,描述CREATE TABLE `t_roles` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色名称', `desc` varchar(50) NOT NULL DEFAULT '' COMMENT '描述', `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8mb4 COMMENT='角色表';3.路由表这个表主要添加平台所有需要控制的路由方法,也可以不建表,写到配置文件里面,因为开发完需要控制的权限是固定的。上图:新增编辑角色,显示的就是这个表的内容CREATE TABLE `t_roles_tree` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL DEFAULT '' COMMENT '路由名称', `path` varchar(50) NOT NULL COMMENT '路径', `methods` varchar(50) NOT NULL COMMENT '方法', `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `parentId` varchar(50) NOT NULL DEFAULT '' COMMENT '级别', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COMMENT='系统所有路由表';4.权限表权限表记录了,这个角色有哪些权限。 核心字段为 [角色ID,资源url, 方法]。这里用casbin 实现,因为casbin封装了很多验证函数,节省了一部分工作量。CREATE TABLE `casbin_rule` ( `id` int(11) NOT NULL AUTO_INCREMENT, `p_type` varchar(255) NOT NULL DEFAULT '', `v0` varchar(255) NOT NULL DEFAULT '' COMMENT '角色', `v1` varchar(255) NOT NULL DEFAULT '' COMMENT 'Url', `v2` varchar(255) NOT NULL DEFAULT '' COMMENT '方法', `v3` varchar(255) NOT NULL DEFAULT '', `v4` varchar(255) NOT NULL DEFAULT '', `v5` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb4;这一篇最后介绍下 Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。并指出主流后端语言,目前Casbin权限控制支持的语言有Go Java Node.js PHP Python C# Delphi,使用Casbin可以极大提高权限控制开发效率。当然你不用这个库,自己设计表,实现原理是一样。
2015年02月25日
4,152 阅读
0 评论
17 点赞
2015-02-07
faas-云函数使用技巧
Faas(Functions-as-a-Service ) 函数即服务,四大升级,助力移动开发。云函数支持小程序语法云函数升级,支持JavaScript语法操作数据库,以后会JavaScript,或者小程序开发,即可开发云函数,不再需要学习新的云函数语法。升级一:语法升级查询2条用户信息小程序,H5写法const query = Bmob.Query("_User"); query.limit(2) query.find().then(res => { console.log(res) }).catch(err => { console.log(err) });云函数写法function onRequest (request, response, modules) { //系统内置代码 let Bmob = modules.oBmob; const query = Bmob.Query("_User"); query.limit(2) query.find().then(res => { const b = JSON.stringify(res) response.send(b); }).catch(err => { const e = JSON.stringify(err); response.end(e) }); } 运行效果http://cloud.bmob.cn/c8bed465c9e6a524/aabb升级二:web预览升级1.外观升级曾经云函数,返回直接返回一个json数据不美观,也不好看。现在可视化展现接口细节。如果用浏览器直接打开一个 API 地址通常会得到一坨神奇的 JSON。使用 restc 之后不仅格式化并高亮了结果,而且还可以看到 HTTP 响应头。并且支持参数调试对比:2.功能升级参数调试介绍:云函数代码,接收参数name,点击send,打印:欢迎使用Bmob function onRequest(request, response, modules) { //获取SDK客户端上传的name参数 var name = request.body.name; if(name == 'bmob') response.end('欢迎使用Bmob'); else response.end('输入错误,请重新输入'); }这里感谢下饿了么团队,开源这么好用的HTTP 服务器中间件。升级三:开发调试升级我们用网页编写云函数时,经常函数没写完,不小心忘记保存关闭了网页,代码需要重新写。新出的Bmob云函数本地开发调试工具,不再会发生这种问题。本地开发工具绑定Bmob应用,写好代码,命令自动上传,并返回函数结果。使用文档地址:https://github.com/bmob/bmobup升级四:函数模板服务年初,我们推出了函数模板服务,当你需要写一些常用功能代码时,可以使用我们的函数模板服务。例如你想开发公众号,有菜单管理函数、自动回复函数, 如果你想开发小程序,有手机号解密函数模板,如果你先采集数据,有数据采集模板。如果你写了个功能,觉得大家可能用得上,也可以发布分享给大家使用,大家创建的时候只需要选择需要的模板即可。大家对云函数有更多需求,可以给我提建议喔。
2015年02月07日
4,551 阅读
0 评论
31 点赞
2014-12-20
jQuery诞生记-原理与机制
一、看似偶然的东西实际是必然会发生的我大学时候在图书馆翻过一本很破旧的书,讲生物理论的,主要内容就是探讨生命的产生是偶然还是必然。里面很多亚里士多德都看不懂的公式计算什么的,还有模拟原始地球环境出现了有机物的实验什么的。总之,书论述的观点是:“在当时的地球环境下,生命的产生是必然的!”无数次机会的偶然条件、无数次化合物的相遇反应等必定会产生有机物,再有N多偶然,有机物必然形成了有机体……这种理论类似于,你是个过马路非常小心的人,且你万寿无疆,除了怕被汽车撞。给你100万年的寿命,你最后必然还是被车撞死。如果以这种理论来看jQuery的出现,结论也应该是必然的 !二、需求、动力、发展、事物产生与jQuery的诞生一个成熟的东西显然不是一口气就出来的,所谓“一铲子挖不了一口井”,我想jQuery的原作者再天才,也是循序渐进过来的,如何个循序渐进法,我想,很有可能就是需求驱动而产生的,好比上图刀削面机器人,据说现在已经第八代了!** 1. gelElementById太长了** 页面上有个按钮,还有个图片,我想点击按钮图片隐藏,如下HTML: 点击我 ![](xxx.jpg) 于是,我的脚本可能就这样: var button = document.getElementById("button") , image = document.getElementById("image") button.onclick = function() { image.style.display = "none"; }; 有何问题?人几乎都是天生的“懒惰者”,document.getElementById名称长且重复出现,好像到了公司发现卡没带又回家重新拿卡的感觉,我希望越简单越好。恩,我很喜欢钱,$这个符号我很喜欢,我打算改造一番,简化我的工作: var $ = function(id) { return document.getElementById(id); };$("button").onclick = function() { $("image").style.display = "none"; }; 这里的$()就是最简单的包装器,只是返回的是原生的DOM对象。2. 我需要一个简洁的暗号,就像“芝麻开门” 后来页面复杂了,点击一个按钮,有2张图片要隐藏。 $("button").onclick = function() { $("image1").style.display = "none"; $("image2").style.display = "none"; }; 好像又看见长长的重复的东西,xxx.style.display = "none",为什么每次开门都要从包里找到钥匙、对准插口插进去、还要左扭扭右扭扭呢?一次还好,天天经常老是这样怎受得了。设想,要是有个芝麻开门的暗号就好了,“open开”,声音识别,门自动开了,多省心。这里每次隐藏都要xxx.style.display = "none",比每天拿钥匙开门还要烦,我希望有一个快捷的方式,例如,“hide隐”,语句识别,元素自动隐藏,多省心。就是要变成下面的效果: $("button").onclick = function() { $("image1").hide(); $("image2").hide(); }; ** 3. 如何识别“芝麻开门”的暗号** $("image1")本质是个DOM元素,$("image1").hide()也就是在DOM元素上扩展一个hide方法,调用即隐藏。哦,扩展,立马想到了JS中的prototype原型。//zxx: 老板,现在满大街什么菜最便宜。老板:原型啊,都泛滥了! HTMLElement.prototype.hide = function() { this.style.display = "none"; }; 上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-hide.html)应该不会被人看到吧……虽然在身体上钻了个窟窿插进入了一个方法,毕竟浏览器有有效果啊,切肤之痛就不算什么了。但是,我们是在泱泱天朝,很多IE6~IE8老顽固,这些老东西不认识HTMLElement,对于HTMLElement自残扩展之法根本理解不了,而这些老家伙掌管了半壁江山。唉,面对现实,元素直接扩展是行不通了。因此,由于兼容性,我们需要想其他扩展方法。** 4. 条条大路通罗马,此处不留爷,自有留爷处** 虽IE6~IE8不识HTMLElement原型扩展,但是,Function的原型扩展其认识啊。管不管用,暂时不得而知,先随便搞个简单的试试呗~ var F = function() {}; F.prototype.hide = function() { this?.style.display = "none"; }; new F().hide(); // 这个实现隐藏? 本文至少还有一半的内容,但是,全文的最难点就在这里的,对new F()的认识和理解。上面的代码,new F()您可以看做是this?.style这里的this. 您可能会跳起来抢答道:“那new F()的return值 =DOM元素不就完事OK啦!—— this.style.hide = new F().style.hide = DOM.style.hide”!只要new表达式之后的constructor返回(return)一个引用对象(数组,对象,函数等),都将覆盖new创建的匿名对象,如果返回(return)一个原始类型(无return时其实为return原始类型undefined),那么就返回new创建的匿名对象。上面的引用来自。什么意思呢?说白了就是,newF()如果没有返回值(Undefined类型),或返回值是5种基本型(Undefined类型、Null类型、Boolean类型、Number类型、String类型)之一,则newF()我们可以看成是原型扩展方法中的this; 如果返回是是数组啊、对象啊什么的,则返回值就是这些对象本身,此时new F() ≠ this。举例说明: var F = function(id) { return document.getElementById(id); }; new F("image1") == document.getElementById("image1"); // true 说明看上去返回DOM对象,实际确实就是DOM对象 var F = function(id) { return id; }; new F("image1") == "image1"; // false 说明看上去返回字符串值,实际并不是字符串 回到上面天真的想法。要想使用prototype.hide方法中的this, 偶们就不能让F函数有乱七八糟的返回值。因此,new F()直接返回DOM是不可取的,但我们可以借助this间接调用。比方说: var F = function(id) { this.element = document.getElementById(id); }; F.prototype.hide = function() { this.element.style.display = "none"; }; new F("image").hide(); // 看你还不隐藏 上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-hide2.html)应该不会被人看到吧……** 5. 我不喜欢太暴露** F()中的this.element实际上将element这个属性直接暴露在了new F("image")上! new F("image").hasOwnProperty("element"); // true 太暴露了,我不喜欢~~如何隐藏?代码如下: var F = function(id) { return this.getElementById(id); }; F.prototype.getElementById = function(id) { this.element = document.getElementById(id); return this; }; F.prototype.hide = function() { this.element.style.display = "none"; }; new F("image").hide(); // 看你还不隐藏 元素获取方法放在prototype上,通过F()执行。你可能会奇怪了,你刚明明说“newF()直接返回DOM是不可取的”,怎么现在又有return呢?大家务必擦亮眼睛,F.prototype.getElementById的返回值是this,也就是newF()的返回值是this. 形象点就是new F("image")出了一拳,又反弹到自己脸上了。于是乎,现在就没有直接暴露的API了。上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-hide3.html)应该不会被人看到吧……** 6. 我不喜欢new, 我喜欢$** new F("image")这种写法我好不喜欢,我喜欢$, 我就是喜欢$, 我要换掉。好吧,把new什么什么藏在$方法中把~ var $ = function(id) { return new F(id); }; 于是,上面的图片隐藏的直接执行代码就是: $("image").hide(); 上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-hide4.html)应该不会被人看到吧……IE6浏览器也是支持的哦!是不是已经有些jQuery的样子啦!** 7. 你怎么就一种姿势啊,人家都腻了诶** 循序渐进到现在,都是拿id来举例的,实际应用,我们可能要使用类名啊,标签名啊什么的,现在,为了接下来的继续,有必要支持多个“姿势”。在IE8+浏览器中,我们有选择器API,document.querySelector与document.querySelectorAll,前者返回唯一Node,后者为NodeList集合。大统一起见,我们使用后者。于是,就有: var F = function(selector, context) { return this.getNodeList(selector, context); }; F.prototype.getNodeList = function(selector, context) { context = context || document; this.element = context.querySelectorAll(selector); return this; }; var $ = function(selector, context) { return new F(selector, context); }; 此时,我们就可以使用各种选择器了,例如,$("body #image"), this.element就是选择的元素们。** 8. IE6/IE7肿么办?** IE6/IE7不认识querySelectorAll,咋办?jQuery就使用了一个比较强大的选择器框架-Sizzle.知道就好,重在演示原理,因此,下面还是使用原生的选择器API示意,故demo效果需要IE8+浏览器下查看。** 8. 遍历是个麻烦事** this.element此时类型是NodeList, 因此,直接this.element.style.xxx的做法一定是报错,看来有必要循环下: F.prototype.hide = function() { var i=0, length = this.element.length; for (; i 于是乎: $("img").hide(); // 页面所有图片都隐藏啦! 上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-hide5.html)应该不会被人看到吧……单纯一个hide方法还可以应付,再来个show方法,岂不是还要循环遍历一次,岂不是要烦死~因此,急需一个遍历包装器元素的方法,姑且叫做each吧~于是有: F.prototype.each = function(fn) { var i=0, length = this.element.length; for (; i.each(function() { this.style.display = "none"; }); }; $("img").hide(); // 页面所有图片都隐藏啦! 上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-hide6.html)应该不会被人看到吧……** 9. 我不喜欢this.element, 可以去掉吗?** 现在包装器对象结构类似这样: F.prototype = { element: [NodeList], each: function() {}, hide: function() {} } element看上去好碍眼,就不能去掉吗?可以啊,宝贝,NodeList是个类数组结构,我们把它以数值索引形式分配到对象中就好啦!一来去除冗余element属性,二来让原型对象成为类数组结构,可以有一些特殊的功能。于是,F.prototype.getNodeList需要换一个名字了,比方说初始化init, 于是有: F.prototype.init = function(selector, context) { var nodeList = (context || document).querySelectorAll(selector); this.length = nodeList.length; for (var i=0; ithis[i] = nodeList[i]; } return this; }; 此时,each方法中,就没有烦人碍眼的this.element[i]出现了,而是直接的this[i]. F.prototype.each = function(fn) { var i=0, length = this.length; for (; ithis[i], i, this[i]); } return this; }; 我们也可以直接使用索引访问包装器中的DOM元素。例如:$("img")[0]就是第一张图片啦!上面代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-hide7.html)应该不会被人看到吧……** 10. 我是完美主义者,我特不喜欢F名称,可以换掉吗?** F这个名称从头到尾出现,我好不喜欢的来,我要换成$, 我就是要换成$符号……这个……$已经用了啊,再用冲突的吧。再说,你又不是狐后,耍无赖也没用啊……好吧,想想其他办法吧。一步一步来,那我把所有的F换成$.fn.就有:上图代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-hide7.html)应该不会被人看到吧……显然,运行是OK的。似乎也非常有jQuery的模样了,但是,实际上,跟jQuery比还是有差别的,有个较大的差别。如果是上图代码所示的JS结构,则包装器对象要扩展新方法,每个都需要再写一个原型的。例如,扩展一个attr方法,则要写成: $.fn.prototype.attr = function() { // ...}; 又看到prototype了,高级的东西应该要隐藏住,否则会给人难以上手的感觉。那该怎么办呢?御姐不是好惹的。脑子动一下就知道了,把F.prototype换成$.fn不久好了。这样,扩展新方法的时候,直接就是 $.fn.attr = function() { // ...}; 至此,就使用上讲,与jQuery非常接近了。 但是,还有几个F怎么办呢,总不能就像下面这样放着吧: var $ = function(selector, context) { return new F(selector, context); }; var F = function(selector, context) { return this.init(selector, context); }; $.fn = F.prototype; $.fn.init = function(selector, context) { // ... return this; }; $.fn.each = function(fn) { // ...}; $.fn.hide = function() { // ...}; 数学中,我们都学过合并同类项。仔细观察上面的的代码: $()返回的是new F(),而newF()又是返回的对象的引用。擦,这返回来返回去的,参数又是一样的,我们是不是可以一次性返回,然后再做些手脚,让$.fn.init返回的this依然能够正确指向。于是,一番调整有: var $ = function(selector, context) { return new $.fn.init(selector, context); }; var F = function() { }; $.fn = F.prototype; $.fn.init = function(selector, context) { // ... return this; };// ... 上面代码显然是有问题的,new的是$.fn.init, $.fn.init的返回值是this.也就是$()的返回值是$.fn.init的原型对象,尼玛$.fn.init的prototype原型现在就是个光杆司令啊,哟,正好,$.fn对应的原型方法,除了init没用外,其他hide(),each()就是我们需要的。因此,我们需要加上这么一行: $.fn.init.prototype = $.fn 于是,$()的返回值从$.fn.init.prototype一下子变成$.fn,正好就是我们一开始的扩展方法。于是乎,大功告成。慢着……上面明明还有残留的F呢!哦,那个啊。F是任意函数,$本身就是函数,因此,直接使用$替换就可以了: var $ = function(selector, context) { return new $.fn.init(selector, context); }; var F = function() { }; // 这个直接删除 $.fn = $.prototype; $.fn.init = function(selector, context) { // ... return this; };// ... 上图代码的[demo地址](http://www.zhangxinxu.com/study/201307/image-hide9.html)应该不会被人看到吧……实际上,如果你不是非得一个$行便天下的话,到了上面进阶第9步就足够了。jQuery在第10步的处理是为了彰显其$用得如此的出神入化,代码完美,令人惊叹!至此,jQuery大核心已经一步一步走完了,可以看到,所有的这些进阶都是根据需求、实际开发需要来的,慢慢完善,慢慢扩充的!** 11. 每个扩展方法都要$.fn.xxxx, 好闹心的来** $.fn.css = function() {} $.fn.attr = function() {} $.fn.data = function() {}// ... 每个扩展前面都有个$.fn, 好讨厌的感觉,就不能合并吗?于是,jQuery搞了个extend方法。 $.fn.extend({ css: function() {}, attr: function() {}, data: function() {}, // ...}); ** 12. $()不仅可以是选择器字符串,还可以是DOM** 在init方法中,判断第一个参数,如果是节点,直接this[0] = this_node. over!以下13~?都是完善啊,补充啊,兼容性处理啊什么的,没有价值,到此为止!三、排了很长队的结束语网上也有其他一些介绍jQuery原理或机制的文章,可能当事人自己理解,而阅读者本来就不懂,说来说去,越说越绕,可能更不懂了。jQuery是很优秀,好比身为灵长类的人类。但是,其诞生显然是从简单开始的。因此,要了解人类,可以通过追溯其起源。如果你是上帝,要让你造一个人,你会怎么造,是一口气出来?女娲造人还要捏泥人呢!不妨从单细胞生物还是,随着自然进化,淘汰,自然而然,就会出现人类,上帝他就是这么干的。jQuery的诞生也大致如此,要想了解jQuery,可以试试踏着本文jQuery的成长足迹,一点一点逐步深入,您就会了解为何jQuery要这么设计,它是如何设计的等。
2014年12月20日
8 阅读
0 评论
0 点赞
2014-10-23
nagios 实现Mysql 主从同步状态的监控
一、系统环境**主机名IPnagios192.168.15.111mysql_s192.168.15.21二、操作步骤**2.1 mysql_s端的配置2.1.1编写check_mysql_slave监控脚本cd /usr/local/nagios/libexec #切换到nagios监控插件所在目录vim check_mysql_slave #开始编写 mysql_slave监控脚本 注意:监控脚本中的mysql账户一定要新建一个,并设置有限的权限。**2.1.2给脚本增加可执行权限chmod 755 check_mysql_slave-rwxr-xr-x 1 root root 471 Oct 16 12:59 check_mysql_slave2.1.3编辑 nrpe的配置文件vim /usr/local/nagios/libexec/etc/nrpe.cfg +204#添加监控mysql主从同步状态的命令command[check_mysql_slave]=/usr/local/nagios/libexec/check_mysql_slave2.1.4重新启动 nrpe 服务2.1.5执行脚本测试输出[root@mysql_s libexec]# ./check_mysql_slaveOK mysql_s is running2.2 nagios端的配置:*2.2.1修改已有的* /usr/local/nagios/etc/objects/service.cfg配置文件define service {use generic-servicehost_name mysql_slaveservice_description check_21_mysql_replication_statuscheck_command check_nrpe!check_mysql_slavemax_check_attempts 3normal_check_interval 2retry_check_interval 2check_period 24x7notification_interval 10notification_period 24x7notification_options w,u,c,rcontact_groups adminsprocess_perf_data 1}2.2.2重启nagios**[root@nagios objects]# /etc/init.d/nagios checkconfig #检查配置文件是否有误[root@nagios objects]# /etc/init.d/nagios reload #重新加载配置文件Running configuration check...done.Stopping nagios: done.Starting nagios: done.说明:如果nagios reload完毕,监控页面尚未出现检测结果,可以手动测试/usr/local/nagios/libexec/check_nrpe -H 192.168.15.21 -c check_mysql_slave2.2.3**最终效果图 **
2014年10月23日
6 阅读
0 评论
0 点赞
1
...
17
18
19
...
25