初探Backbone

Backbone简介

中文API:http://www.css88.com/doc/backbone/

英文API:http://backbonejs.org/

Backbone是构建javascript应用程序的一个优秀的类库。他简洁、轻量级、功能实在。

backbone采用MVC模式,本身提供了模型、控制器和视图从而我们应用程序的骨架便形成。

backbone依赖于underscore,他是一个类库,提供了60多个函数处理数组操作、函数绑定,以及javascript模板机制。

于是我们来个图看看几个好基友吧:

有了初步印象后,我们来一步步看看他都干了些神马。

模型

模型是保存应用程序数据的地方。我们可以把模型看做对应用程序原始数据的精心抽象,并且添加了一些工具函数和事件。

我们可以使用Backbone.Model的extend方法来创建Backbone模型:

var User = Backbone.Model.extend({initialize: function () { }
});

extend的第一个参数是一个对象,他成为了模型实例的属性;

第二个参数是可选的类属性的哈希,通过多次调用extend可以生成模型的子类,他们将继承父亲所有类和实例属性:

复制代码
var User = Backbone.Model.extend({//实例属性instanceProperty: 'foo'
}, {//类属性classProperty: 'bar'
});
assertEqual(User.instanceProperty, 'foo');
assertEqual(User.classProperty, 'bar');
复制代码

当模型实例化时,他的initialize方法可以接受任意实例参数,其工作原理是backbone模型本身就是构造函数,所以可以使用new生成实例:

复制代码
var User = Backbone.Model.extend({initialize: function (name) {this.set({name: name});}
});
var user = new User('刀狂剑痴');
assertEqual(user.get('name'), '刀狂剑痴');
复制代码

Ps: assertEqual判断相等

模型和属性

使用set和get方法设置获取实例的属性:

var user = new User();
user.set({ name: '叶小钗' });
user.get('name'); //叶小钗
user.attributes;//{name: '叶小钗'}

我们看到其实user.arributes是一个对象字面量,我们不会直接操作他,因为我们使用get/set方法可以进行我们的验证流程。

我们使用validate方法来校验一个实例属性,默认情况没有任何验证,若是我们需要验证的话:

复制代码
var User = Backbone.Model.extend({validate: function (attr) {if (!attr.name || attr.name.length < 3) {return '名称长度过短';}}
});
复制代码

如果属性合法,validate不会理睬之,不合法可以返回错误字符串或者Error对象,校验失败get/set方法就会触发error事件:

复制代码
var user = new User();
user.bind('error', function (model, error) {//错误处理
});
user.set({ name: '0' });
//给特定集合添加一个错误处理程序
user.set({ name: '0' }, { error: function (model, error) { } });
复制代码

使用hash名为default的对象来指定默认属性,在创建一个实例模型时,任何没有指定值的属性都会被设置为默认值:

var Chat = Backbone.Model.extend({defaults: { name: '叶小钗'}
});
assertEqual((new Chat).get('name'), '叶小钗');

集合

在backbone中,模型实例的数据存放在多个集合中,为什么模型之间要使用独立的集合,其原因有点复杂,但在实际中我们经常这么做(虽然我还没做过)。

例如创建Twitter需要两个集合followers和followees,两者都有User的实例填充数据,虽然两个集合都是来自同一模型,但是各自包含了不同的实例数组,所以独立形成集合。

针对模型,可以通过扩展backbone.collection来创建一个集合:

var Users = Backbone.Collection.extend({model: User
});

在上面的例子中,我们覆盖了model属性来指定与集合相关联的模型(这里是User模型),虽然这个步骤不是必须的,但是为该集合设置一个默认的模型指向往往能派上大用场。

通常集合会包含单个模型的一个实例,而不是不同模型的多个实例。

在创建一个集合时,可以传递一个模型数组,比如backbone模型,如果定义了一个初始化实例函数,在初始化时就会调用之:

var users = new Users([{ name: '叶小钗' }, { name: '素还真'}]);

另一种方法是使用add方法为集合添加模型:

users.add({ name: '叶小钗' });
users.add([{ name: '叶小钗' }, { name: '素还真' }]);

在为集合添加模型时会触发add事件:

复制代码
users.bind('add', function (user) {//...
});
//移除一个模型
users.bind('remove', function (user) {//...
});
//根据模型id获取模型
var user = users.get('moduleId');
//集合中模型被修改后出发change事件
var user = new User({ name: '叶小钗' });
var users = new Backbone.Collection();
users.bind('change', function (rec) {
//改变一个记录
});
users.add(user);
user.set({ name; '素还真'});
复制代码

控制集合内部顺序

一个集合内部元素顺序可以通过comparator方法控制,该方法的返回值便是你希望集合内部排序的规则:

var Users = Backbone.Collection.extend({comparator: function (user) {return user.get('name');}
});

返回值可以是值或者数字,具体例子我们下次有机会来试试看。

视图

backbone的视图并不是模板,而是一些控制类,他们处理模型的表现。

在很多MVC中视图一般指html或者模板,他们在控制器中处理事件和渲染,但backbone中视图:

视图代表一个UI逻辑块,负责一个简单的DOM内容
var UserView = Backbone.View.extend({initialize: function () { },render: function () { }
});

不管视图有没有被插入页面,每个视图都知道当前的Dom元素,即this.el,el是从视图的tagName、className或者id等属性中创建的元素,没有这些值el就是空div:

var UserView = Backbone.View.extend({tagName: 'span',className: 'users'
});
var userView = new UserView();//<span class="users"></span>

若是希望视图绑定到页面上已存在的元素上,直接指定el就好(必须在页面加载后才能指定哦,不然找不到):

var UserView = Backbone.View.extend({el: $('.usets')
});
//也可以实例化一个视图时传递el(tagName、className\id)
new UserView({ id: 'id' });

渲染视图

每个视图都有一个render方法,默认情况下没有任何操作,一旦视图需要重绘便会调render方法,不同的视图用不同功能的函数来覆盖函数,以处理模板渲染,并使用新的html来更新el:

复制代码
var TodoView = Backbone.View.extend({template: _.template($('#tmpt').html()),render: function () {$(this.el).html(this.template(this.model.toJSON()));return this;}
});
复制代码

backbone本身并不知道我们是怎么渲染视图的,我们可以自己生产元素也可以使用模板类库(一般用这个)。

在前面的代码中,我们使用了this.model的本地属性,他指向一个模型实例,在实例化时传递到视图中,模型的toJSON方法实际上返回模型未加工时的原始属性,可以在模板中使用:

new TodoView({ model: new Todo });

委托事件

通过委托,backbone的视图提供了一种添加事件到el的简单快捷的方法:

复制代码
var TodoView = Backbone.View.extend({events: {'change input[type=checkbox]': 'toggleDone','click .destroy': 'clear'},toggoleDone: function () { },clear; function () {}
});
复制代码

events对象为{'eventType selector': 'callback'}这种格式,selector是可选的,不提供便绑定值el上。

委托利用了事件冒泡机制,意思是可以一直触发而不管el内容是否改变(估计类似于delegate吧)。

上面的callback事件触发时,他的上下文是视图当前上下午,所以this中的this.model/el都可以使用。

绑定和上下文

事实上,每当视图的模型发生变化时,就会触发change事件,然后调用该函数,这就意味这应用程序的视图及HTML和与之对应的模型数据是同步的。

复制代码
var TodoView = Backbone.View.extend({initialize: function () {_.bindAll(this, 'render', 'close');this.model.bind('change', this.render);},close: function () { }
});
复制代码

需要注意在回调函数中的上下文已经改变,Underscore提供一个函数:

_.bindAll(context, func);

他将函数名字和一个上下文绑定,bindAll保证了所有给定的函数总是在指定的上下文中被调用,因为函数上下文总在胡乱变化,这样做很有用。

模型销毁需要视图绑定delete事件,触发时删除el即可:

复制代码
var TodoView = Backbone.View.extend({initialize: function () {_.bindAll(this, 'render', 'close');this.model.bind('change', this.render);this.model.bind('delete', this.remove);},remove: function () { $(this.el).remove() }
});
复制代码

控制器

backbone的控制器将应用程序的状态和url的hash片段关联在一起,使url地址可分享,也可以作为书签使用。

本质上,控制器是一些路由和函数组成,当导航到这些路由时那些函数便调用:

复制代码
routes : {'help': 'help', //#help'search/:query': 'search', //#search/kiwis'search/:query/p:page': 'search', //#search/kiwis/p7'file/*peth': 'file' //#file/any/path.txt
}
复制代码

参数以“:”开始,然后是参数名,当路由被调用时,所有参数都会传递到他的函数,*为通配符,和参数一将和匹配的值一起传递到路由的函数中。

路由是以哈希对象中定义顺序倒叙进行解析的,来创建一个控制器吧:

复制代码
var PageController = Backbone.Controller.extend({routes: {'help': 'help', //#help'search/:query': 'search', //#search/kiwis'search/:query/p:page': 'search', //#search/kiwis/p7'file/*peth': 'file' //#file/any/path.txt
    },index: function () { },help: function () { },search: function () { }
});
复制代码

当用户被导航到“http://....com#search/param”时,不管手输还是后退都会调用search函数,并传递其参数param

若是希望ajax与seo更加友好,路由前缀就必须是“!/”,同时服务器端还需要做一点调整。

服务器同步

默认情况下,模型发生变化(保存),backbone就会使用ajax与服务器通讯(Backbone.sync),成功便更新客户端模型。

要使用这个属性便需要定义url,并且在服务器端处理rest形式请求,backbone会处理余下任务:

var User = Backbone.Model.extend({url: '/users'
});

url既可以是一个字符串也可以是一个函数返回字符串,backbone增删查改几个函数对应映射:

create => post /collection
read => get /collection[/id]
update => put /collection/id
delete => delete /collection/id

例如,我们要创建一个User实例,backbone会发送一个post请求道/uesrs,更新一个user实例,会发送至/users/id节点,服务器响应时会返回一个json格式的对象

若是要使用save(attr, option)函数将模型保存至服务器,可以随意传递一个由属性和请求项组成的hash对象,若是模型有id,假设该模型在服务器上以存在,存在就是put请求,不然就post请求添加数据:

复制代码
var user = new User();
user.set({ name: '叶小钗' });
user.save(null, {success: function () {//保存成功
    }
});
复制代码

所有save都是异步的,通过success或者failure来监听ajax回调,我们一般与jquery合用了。

填充集合

我们已经知道了如何创建/更新模型,但是第一次我们如何获取模型数据呢?

这就是backbone集合出现的原因,他们用来请求远程数据并保存至本地,和模型类似,必须给集合指定一个url来设置其数据源,若是没有则默认使用与之关联的模型url:

var Followers = Backbone.Collection.extend({model: User,url: '/user'
});
//fetch用于刷新模型,该函数会请求数据,若是远程数据和当前模型不一致,将触发change事件
Followers.fetch();

集合的fetch函数将发送一个get请求道服务器,获取远程数据,最后刷新集合触发refresh事件。

可以使用refresh函数手动刷新集合,传入一个模型对象即可,在第一次设置页面时候用这个方法很方便,这里和页面加载后发送get请求不一样,我们可以传递json对象给refresh,而预先填充到集合中,比如:

Users.refresh({name; ''});

自定义行为

在backbone视图读取或者保存模型到服务器时都会调用backbone.sync方法,我们可以覆盖该方法来改变其默认行为(存入xml、本地存储):

复制代码
/*
method 便是crud方法(create、read、update、delete)
model 需要保存的模型
options 请求可选项,包括成功失败函数
*/
Backbone.sync = function (method, model, options) {options.success(model);
};
复制代码

每个模型或者集合只能覆盖各自的sync函数。

我们来看一个扩展HTML5本地存储的例子:

复制代码
//所有待完成的项都保存至本地存储命名空间“todos”中
Toto.prototype.localStorage = new Store('todos');
//重写backbone.sync
Backbone.sync = function (method, model, options) {var resp, store = model.localStorage || model.collection.localStorage;switch (method) {case 'read': resp = model.id ? store.find(model) : store.findAll(); break;case 'create': resp = store.create(model); break;case 'update': resp = store.update(model); break;case 'delete': resp = store.destroy(model); break;}if (resp) {options.success(resp);} else {options.error('not find');}
}
复制代码

简单实战-官方版

首先,我们来看一个官方给出的例子:

具体代码各位可以去下载,其中用到了很多类库我们也暂时不去管它,我们现在就来试试能不能做。

这是一个简单的to-do列表应用程序,我们希望能进行增删查改操作,在页面刷新后仍能保持数据。

页面结构(核心)

复制代码
 1 <html lang="en">
 2 <head>
 3     <meta charset="utf-8">
 4     <title>Backbone.js Todos</title>
 5     <link rel="stylesheet" href="todos.css" />
 6 </head>
 7 <body>
 8     <div id="todoapp">
 9         <header>
10             <h1>
11                 Todos</h1>
12             <input id="new-todo" type="text" placeholder="What needs to be done?">
13         </header>
14         <section id="main">
15             <input id="toggle-all" type="checkbox">
16             <label for="toggle-all">
17                 Mark all as complete</label>
18             <ul id="todo-list">
19             </ul>
20         </section>
21     </div>
22     <script src="js/json2.js" type="text/javascript"></script>
23     <script src="js/jquery.js" type="text/javascript"></script>
24     <script src="js/underscore.js" type="text/javascript"></script>
25     <script src="js/backbone.js" type="text/javascript"></script>
26     <script src="js/backbone.localStorage.js" type="text/javascript"></script>
27     <script src="js/todos.js" type="text/javascript"></script>
28 </body>
29 </html>
复制代码

页面结构很简单,其核心为:

一个文本框(#new-todo),用于创建新to-do

一个列表(#todo-list),用于展示

下面是基本的Todo模型,其拥有content与done属性,同时提供toggle方法设置done属性:

复制代码
//todo是备忘录的意思哦
var Toto = Backbone.Model.extend({defaults: {done: false},toggle: function () {//设置做了点击就没做,设置没做点击就做了...this.save({ done: !this.get('done') });}
});
复制代码

然后我们定义一个todo的集合,也是保存todo模型的地方:

复制代码
var TodoList = Backbone.Collection.extend({model: Todo,localStorage: new Store('todos'), //所有项目保存至todos命名空间//过滤已完成的项目done: function () {return this.filter(function (todo) {return todo.get('done');});},remaining: function () {return this.without.applay(this, this.done);}
});
var Todos = new TodoList();
复制代码

因为这里用的是本地存储所以引入了backbone.localstorage,下一步我们做用于显示的视图

复制代码
 1 var TodoView = Backbone.View.extend({
 2     tagName: 'li', //视图时一个个li标签
 3     template: $('#item-template').template(), //获取模板
 4     events: {
 5         'change .check': 'toggleDone',
 6         'dblclick .todo-content': 'edit',
 7         'click .todo-destroy': 'destroy',
 8         'keypress .todo-input': 'updateOnEnter',
 9         'blur .todo-input': 'close'
10     },
11     initialize: function () {
12         //确保在正确作用域
13         _.bindAll(this, 'render', 'close', 'remove');
14         //监听存储模板修改以确定是否修改el
15         this.model.bind('change', this.render);
16         this.model.bind('destroy', this.render);
17     },
18     render: function () {
19         //使用存储模板更新el
20         var el = jQuery.tmpl(this.template, this.model.toJSON());
21         $(this.el).html(el);
22         return this;
23     },
24     tiggleDone: function () {
25         this.model.toggle();
26     },
27     edit: function () {
28         $(this.el).addClass('editing');
29         this.input.focus();
30     },
31     close: function () {//关闭编剧状态
32         this.model.save({ content: this.input.val() });
33         $(this.el).removeClass('editing');
34     },
35     //按下回车键结束编辑
36     updateOnEnter: function (e) {
37         if (e.keyCode == 13)
38             e.target.blur();
39     },
40     remove: function () {
41         $(this.el).remove();
42     },
43     destroy: function () {
44         this.model.destroy();
45     }
46 });
复制代码

我们将血多事件委托给管理更新,完成和删除todo视图,例如每当复选框变化toggleDone就会调用,并切换done属性,最后又会触发change事件,导致视图重新渲染。

来看看我们的模板:

复制代码
<script type="text/template" id="item-template">
<div class="view"><input class="toggle" type="checkbox" <%= done ? 'checked="checked"' : '' %> /><label><%- title %></label><a class="destroy"></a>
</div>
<input class="edit" type="text" value="<%- title %>" />
</script>
<script type="text/template" id="stats-template">
<% if (done) { %><a id="clear-completed">Clear <%= done %> completed <%= done == 1 ? 'item' : 'items' %></a>
<% } %>
<div class="todo-count"><b><%= remaining %></b> <%= remaining == 1 ? 'item' : 'items' %> left</div>
</script>
复制代码

PS:我这里写了大概思想,有不一致的地方各位看看就行。

最后我们来一个终止:

复制代码
 1 var AppView = Backbone.View.extend({
 2     el: #('#todoapp'),//绑定至现有骨架
 3     events: {
 4         'keypress #new-todo': 'createOnEnter',
 5         'click .todo-clear a': 'clearCompleted'
 6     },
 7     /*
 8     初始化时,将相关事件绑定给todos集合,当添加或者修改集合中元素时触发事件,
 9     通过载入可能存在本地存储中的记录来初始化数据
10     */
11     initailize: function () {
12         _.bindAll(this, 'addOne', 'addAll', 'render');
13         this.input = this.$('#new-todo');
14         Todos.bind('add', this.addOne);
15         Todos.bind('refresh', this.addAll);
16         Todos.fetch();
17     },
18     addOne: function (todo) {
19         var view = new TodoView({model: todo});
20         this.$('#todo-list').append(view.render().el);
21     },
22     //......
23 });
24 
25 var App = new AppView();
复制代码

当页面首次加载后,Todos集合将填充数据,然后触发refresh事件,将调研addAll来获取todo模型,生成todoview视图,并将它们添加至#todo-list中。

当有新的todo模型添加至Todos时,会触发add事件,调用addOne做到最后的视图更新。


转载自:http://www.cnblogs.com/yexiaochai/archive/2013/07/27/3219402.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

订单量的监控

要解决的问题 : 1.在电商项目中,如何准确的知道当前订单量是正常的 2.如何在订单量突变后快速感知 解决思路 : 实现一个关于订单量的监控系统,将历史数据与实时数据做对比,因为每天的订单量,基本都是一个相似的变化范围,比如凌晨4点的单量是一天中最少的,节假日的单量要小于工…

基于abtest思想的流量切换(nginx lua redis)

使用前提: 项目重构了,旧项目还在线上运行,新项目准备替换线上的旧项目 最终目标: 要实现实时切换新旧项目,保证如果新项目上线后有问题,可以立刻快速的将流量切回旧项目 方案: 关于abtest的基本原理本文不再多说,本文重点是实践&#xff0c;先看图 如上图所示,用户访问的…

JavaScript内部实现

前言 JavaScript 的核心 ECMAScript 描述了该语言的语法和基本对象&#xff1b; DOM 描述了处理网页内容的方法和接口&#xff1b; BOM 描述了与浏览器进行交互的方法和接口。 ECMAScript、DOM 和 BOM 尽管 ECMAScript 是一个重要的标准&#xff0c;但它并不是 JavaScript 唯一…

流式计算storm核心组件介绍以及入门案例---跟着就能在本地跑起来的storm项目

关于storm的基础,参照我这篇文章:流式计算storm 关于并发和并行,参照我这篇文章:并发和并行 关于storm的并行度解释,参照我这篇文章:storm的并行度解释 关于storm的流分组策略,参照我这篇文章:storm的流分组策略 关于storm的消息可靠机制,参照我这篇文章:storm的消息可靠机制 …

nginx使用gzip压缩文件---lz77算法---Haffman编码

为了提高页面的响应速度,可以从设置 nginx 的 gzip 和缓存这2方面入手,而为ttf,js,css等文件开启 gzip 和缓存能大大减少带宽的消耗. HTTP 的内容编码机制 Accept-Encoding 和 Content-Encoding 是 HTTP 中用来对[采用何种编码格式传输正文]进行协定的一对头部字段. 它的工作…

Javascript模块化编程

随着网站逐渐变成"互联网应用程序"&#xff0c;嵌入网页的Javascript代码越来越庞大&#xff0c;越来越复杂。 网页越来越像桌面程序&#xff0c;需要一个团队分工协作、进度管理、单元测试等等......开发者不得不使用软件工程的方法&#xff0c;管理网页的业务逻辑。…

zookeeper基础整理

zookeeper简述 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件 ZooKeeper 使用 Java 所编写&#xff0c;但是支持 Java 和 C 两种编程语言。 提供的功能包括&#xf…

JS模块化编程require.js简介

一、为什么要用require.js&#xff1f; 最早的时候&#xff0c;所有Javascript代码都写在一个文件里面&#xff0c;只要加载这一个文件就够了。后来&#xff0c;代码越来越多&#xff0c;一个文件不够了&#xff0c;必须分成多个文件&#xff0c;依次加载。下面的网页代码&…

CSS position属性

目前几乎所有主流的浏览器都支持position属性&#xff08;"inherit"除外&#xff0c;"inherit"不支持所有包括IE8和之前版本IE浏览器&#xff0c;IE9、IE10还没测试过&#xff09;&#xff0c;以下是w3school对position五个值的解释&#xff1a; 其中absol…

storm的并行度的解释--- ( 看完就能理解 )

关于storm的基础,参照我这篇文章:流式计算storm 关于并发和并行,参照我这篇文章:并发和并行 关于storm的并行度解释,参照我这篇文章:storm的并行度解释 关于storm的流分组策略,参照我这篇文章:storm的流分组策略 关于storm的消息可靠机制,参照我这篇文章:storm的消息可靠机…

JS--Console.log()详解

对于JavaScript程序的调试&#xff0c;相比于alert()&#xff0c;使用console.log()是一种更好的方式&#xff0c;原因在于&#xff1a;alert()函数会阻断JavaScript程序的执行&#xff0c;从而造成副作用&#xff1b;而console.log()仅在控制台中打印相关信息&#xff0c;因此…

订单单量监控v2

前段时间做了一个订单单量监控的项目,已经投入使用了,现在总结一下 前期的想法参考这篇文章 整体使用了storm实时计算框架和redis数据库,还有kafka消息队列 先上效果图,我们可以后期将数据展示出来,明显发现某天00点有单量突变的情况,明显是促销活动导致单量增加了 而后面的报…

iOS中的MVC设计模式

一、MVC概述模型&#xff0d;视图&#xff0d;控制器&#xff08;MVC&#xff09;是Xerox PARC在二十世纪八十年代为编程语言Smalltalk&#xff0d;80发明的一种软件设计模式&#xff0c;已被广泛使用。后来被推荐为Oracle旗下Sun公司Java EE平台的设计模式&#xff0c;并且受到…

iOS-MVVM-模式介绍

一、MVVM概述 MVVM 到底是什么&#xff1f;我们首先看一下MVC架构&#xff1a;我们看到的是一个典型的 MVC 设置。Model 呈现数据&#xff0c;View 呈现用户界面&#xff0c;而 View Controller 调节它两者之间的交互。Cool&#xff01;稍微考虑一下&#xff0c;虽然 View 和 …

[数据库]---mysql数据库 使用binlog+canal或binlake进行数据库的复制

前言 在进行冷热分离的时候&#xff0c;需要将数据实时的复制在历史数据库中&#xff0c;我们使用的是binlogcanal的思想,将每次数据库数据的变更转换成消息发出来,然后再操作这些消息达到数据复制的 在京东,实现同样功能的组件&#xff0c;叫binlake 接下来详细说下: 1.Binl…

MAC下配置ZSH

MAC下面的终端是神器。而且苹果非常贴心的为我们准备好了ZSH。 可惜ZSH不是很好用&#xff0c;需要配合一些插件和模板&#xff1a;oh-my-zsh将bash切换为zsh chsh -s /bin/zsh其实还可以用which来定位&#xff08;特别是ubuntu的童鞋&#xff09; chsh -s which zsh 直接用zsh…

MAC下使用OpenSSL生成私钥和公钥

MAC OS自带了OpenSSL,直接在命令行里使用OPENSSL就可以。打开命令行工具&#xff0c;然后输入 openssl打开openssl&#xff0c;接着只要三句命令就可以搞定。1、打开Terminal--cd 到指定文件夹&#xff0c;如桌面Mac:~/Desktop $ openssl2、第一句命令&#xff1a;生成私钥&…

idea插件开发(01)---最简单的helloworld版,不需要知道原理,先跟我做一个最简单的弹框插件

前言 用了那么多idea插件,也想自己做一个插件,下面就是入门版本 你不需要先知道所有的概念,先跟着我的步骤做一个小;例子,后面再说原理 相关概念看后面一篇 本次以windos系统为例 开始 1.你得安装一个环境,供idea插件的开发使用 下载地址: https://www.jetbrains.com/idea/…

苹果封装的对称加密和非对称加密API

一、信息摘要算法5&#xff1a;MD51.系统库位置&#xff1a;<CommonCrypto/CommonHMAC.h>。2.非加密算法&#xff0c;属于哈希散列&#xff0c;不可逆&#xff0c;用于检验数据完整性。二、安全散列(哈希)算法SHA&#xff1a; 1.包含的散列算法&#xff1a;SHA-1&#xf…

ECC椭圆曲线加密算法原理

比特币使用椭圆曲线算法生成公钥和私钥&#xff0c;选择的是secp256k1曲线。与RSA&#xff08;Ron Rivest&#xff0c;Adi Shamir&#xff0c;Len Adleman三位天才的名字&#xff09;一样&#xff0c;ECC&#xff08;Elliptic Curves Cryptography&#xff0c;椭圆曲线加密&…