From 2e272d3ce88e9c48ed4a2a7f60f384d9070a604a Mon Sep 17 00:00:00 2001 From: qhwa Date: Sun, 4 Mar 2012 09:59:20 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0spec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- professorx/spec.md | 71 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/professorx/spec.md b/professorx/spec.md index 79e4adf..1f26681 100644 --- a/professorx/spec.md +++ b/professorx/spec.md @@ -1,3 +1,72 @@ professor X : X 教授 -功能介绍: X教授是battleship中的数据分析和呈现模块,负责提供仪表板显示和各种报表输出。 +功能介绍: X教授是battleship中的数据保存、分析和呈现模块,负责提供仪表板显示和各种报表输出。 + +独立于界面之外,prefessorX以restful API的方式提供数据输入和输出的服务 + +## 数据输入 + + # 相对地改变字段的值 + post /<任务id>/<字段名称> + + # 设置字段为新的数值 + update /<任务id>/<字段名称> + + # 删除字段 + delete /<任务id>/<字段名称> + + # 删除任务 + delete /<任务id> + + +例如,如果有任务browser-stat, 字段ie6, 下列请求后ie6字段的值分别为: + +`{ value: x }` 代表form中的数值 + + post /browser-stat/ie6 # => 0 + post /browser-stat/ie6 + { value : 5 } # => 5 + post /browser-stat/ie6 + { value : 10 } # => 15 + post /browser-stat/ie6 + { value : -4 } # => 11 + update /browser-stat/ie6 + { value : 200 } # => 200 + delete /browser-stat/ie6 # => null + post /browser-stat/ie6 + { value : 15.4 } # => 15.4 + +### 输入以前的数据 +以上都是输入当前的数据,存储的时候会以Time.now()来存储时间。我们也可以指定记录的时间: + + post /browser-stat/ie6 + { value: 5, at: "2011-04-01 18:34:53" } + + update /browser-stat/ie6 + { value: 430, at: "2012-04-01 18:34:53" } + +## 数据输出 + + # 返回任务所有字段的当前值 + get /<任务id> + + # 返回任务在指定时刻所有字段的值 + get /<任务id>/at/<时刻> + + # 返回当前值 + get /<任务id>/<字段名称> + + # 返回字段在指定时刻的值 + get /<任务id>/<字段名称>/at/<时刻> + +## 任务管理 + + # 新增任务 + post /tasks + + # 修改任务 + update /tasks + + # 删除任务 + delete /tasks + From 69898cd4b33de48d1972fc5de81cce29b8841376 Mon Sep 17 00:00:00 2001 From: qhwa Date: Sun, 4 Mar 2012 10:40:45 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0jasmine=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- professorx-test/spec.md | 3 -- professorx/spec/data-api.spec.js | 73 ++++++++++++++++++++++++++ professorx/{spec.md => spec/readme.md} | 0 3 files changed, 73 insertions(+), 3 deletions(-) delete mode 100644 professorx-test/spec.md create mode 100644 professorx/spec/data-api.spec.js rename professorx/{spec.md => spec/readme.md} (100%) diff --git a/professorx-test/spec.md b/professorx-test/spec.md deleted file mode 100644 index 15b37fe..0000000 --- a/professorx-test/spec.md +++ /dev/null @@ -1,3 +0,0 @@ -professorxģ - -ܣṩԪ \ No newline at end of file diff --git a/professorx/spec/data-api.spec.js b/professorx/spec/data-api.spec.js new file mode 100644 index 0000000..12f02dd --- /dev/null +++ b/professorx/spec/data-api.spec.js @@ -0,0 +1,73 @@ +/* + * 数据输入和输出接口测试 + * 使用jasmine测试框架编写 + * + * @usage: + * 1. install jasmine: + * npm install jasmine-node + * 2. cd to project folder, and run + * jasmine . + */ + +describe("professor x", function() { + + var task = 'action'; + + afterEach(function(){ + removeTask( task ); + }); + + it("收到请求时可以创建数据", function(){ + post( task, 'click' ); + expect( get( task, 'click') ).toEqual(0); + + post( task, 'doubleclick' ); + expect( get( task, 'doubleclick') ).toEqual(0); + }); + + it("可以通过请求增加或减少数据", function(){ + + describe("原先没有的数据也可以正确设值", function(){ + post( task, 'click', { value: 5 } ); + expect( get( task, 'click' ) ).toEqual( 5 ); + }); + + post( task, 'click', { value: 10 } ); + expect( get( task, 'click' ) ).toEqual( 15 ); + + post( task, 'click', { value: -10 } ); + expect( get( task, 'click' ) ).toEqual( 5 ); + + post( task, 'click', { value: 1.5 } ); + expect( get( task, 'click' ) ).toEqual( 6.5 ); + }); + + it("可以通过请求更新原有的值", function(){ + + describe("原先没有的数据也可以正确设值", function(){ + update( task, 'click', { value : 100 } ); + expect( get( task, 'click' ) ).toEqual( 100 ); + }); + + update( task, 'click', { value : 150 } ); + expect( get( task, 'click' ) ).toEqual( 150 ); + }); + + + function post( task, field, param ){ + //TODO: implement it + } + + function update( task, field, param ){ + //TODO: implement it + } + + function get( task, field, time ){ + //TODO: implement it + } + + function removeTask( task ){ + //TODO: implement it + } + +}); diff --git a/professorx/spec.md b/professorx/spec/readme.md similarity index 100% rename from professorx/spec.md rename to professorx/spec/readme.md From 7025fbc3a403eef55b49e0282cfa060f9082adbc Mon Sep 17 00:00:00 2001 From: qhwa Date: Sun, 4 Mar 2012 11:02:21 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- professorx/spec/data-api.spec.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/professorx/spec/data-api.spec.js b/professorx/spec/data-api.spec.js index 12f02dd..c031002 100644 --- a/professorx/spec/data-api.spec.js +++ b/professorx/spec/data-api.spec.js @@ -40,6 +40,24 @@ describe("professor x", function() { post( task, 'click', { value: 1.5 } ); expect( get( task, 'click' ) ).toEqual( 6.5 ); + + describe("可以设置数据变化的时刻", function(){ + + describe("过去的变化会影响现在", function(){ + post( task, 'click', { value: 3, at: Date.now() - 5 * 3600 * 1000 } ); + expect( get( task, 'click' ) ).toEqual( 9.5 ); + }); + + describe("可以获取过去的数据", function(){ + var time = Date.now() - 4 * 3600 * 1000; + expect( get( task, 'click', time ) ).toEqual( 3 ); + + describe("超过了创建的时间,应该返回null", function(){ + time -= 2 * 3600 * 1000; + expect( get( task, 'click', time ) ).toBeNull(); + }); + }); + }); }); it("可以通过请求更新原有的值", function(){ @@ -51,6 +69,19 @@ describe("professor x", function() { update( task, 'click', { value : 150 } ); expect( get( task, 'click' ) ).toEqual( 150 ); + + describe("可以设置数据更新的时刻", function(){ + var time = Date.now() - 4 * 3600 * 1000; + update( task, 'click', { value: 500, at: time } ); + + describe("可以正确获取过去更新的数据",function(){ + expect( get( task, 'click', time + 1000 ) ).toEqual( 500 ); + }); + + describe("过去设置的数据对现在的update没有影响", function(){ + expect( get( task, 'click' ) ).toEqual( 150 ); + }); + }); }); From 84289f9ead808241bec916825e12e5fff935d80e Mon Sep 17 00:00:00 2001 From: qhwa Date: Mon, 5 Mar 2012 20:27:41 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0http=20action=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- professorx/spec/data-api.spec.js | 10 ++++---- professorx/spec/readme.md | 40 ++++++++++++++++---------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/professorx/spec/data-api.spec.js b/professorx/spec/data-api.spec.js index c031002..a54b45a 100644 --- a/professorx/spec/data-api.spec.js +++ b/professorx/spec/data-api.spec.js @@ -63,22 +63,22 @@ describe("professor x", function() { it("可以通过请求更新原有的值", function(){ describe("原先没有的数据也可以正确设值", function(){ - update( task, 'click', { value : 100 } ); + put( task, 'click', { value : 100 } ); expect( get( task, 'click' ) ).toEqual( 100 ); }); - update( task, 'click', { value : 150 } ); + put( task, 'click', { value : 150 } ); expect( get( task, 'click' ) ).toEqual( 150 ); describe("可以设置数据更新的时刻", function(){ var time = Date.now() - 4 * 3600 * 1000; - update( task, 'click', { value: 500, at: time } ); + put( task, 'click', { value: 500, at: time } ); describe("可以正确获取过去更新的数据",function(){ expect( get( task, 'click', time + 1000 ) ).toEqual( 500 ); }); - describe("过去设置的数据对现在的update没有影响", function(){ + describe("过去设置的数据对现在的put没有影响", function(){ expect( get( task, 'click' ) ).toEqual( 150 ); }); }); @@ -89,7 +89,7 @@ describe("professor x", function() { //TODO: implement it } - function update( task, field, param ){ + function put( task, field, param ){ //TODO: implement it } diff --git a/professorx/spec/readme.md b/professorx/spec/readme.md index 1f26681..5da68b6 100644 --- a/professorx/spec/readme.md +++ b/professorx/spec/readme.md @@ -7,66 +7,66 @@ ## 数据输入 # 相对地改变字段的值 - post /<任务id>/<字段名称> + POST /<任务id>/<字段名称> # 设置字段为新的数值 - update /<任务id>/<字段名称> + PUT /<任务id>/<字段名称> # 删除字段 - delete /<任务id>/<字段名称> + DELETE /<任务id>/<字段名称> # 删除任务 - delete /<任务id> + DELETE /<任务id> 例如,如果有任务browser-stat, 字段ie6, 下列请求后ie6字段的值分别为: `{ value: x }` 代表form中的数值 - post /browser-stat/ie6 # => 0 - post /browser-stat/ie6 + POST /browser-stat/ie6 # => 0 + POST /browser-stat/ie6 { value : 5 } # => 5 - post /browser-stat/ie6 + POST /browser-stat/ie6 { value : 10 } # => 15 - post /browser-stat/ie6 + POST /browser-stat/ie6 { value : -4 } # => 11 - update /browser-stat/ie6 + PUT /browser-stat/ie6 { value : 200 } # => 200 - delete /browser-stat/ie6 # => null - post /browser-stat/ie6 + DELETE /browser-stat/ie6 # => null + POST /browser-stat/ie6 { value : 15.4 } # => 15.4 ### 输入以前的数据 以上都是输入当前的数据,存储的时候会以Time.now()来存储时间。我们也可以指定记录的时间: - post /browser-stat/ie6 + POST /browser-stat/ie6 { value: 5, at: "2011-04-01 18:34:53" } - update /browser-stat/ie6 + PUT /browser-stat/ie6 { value: 430, at: "2012-04-01 18:34:53" } ## 数据输出 # 返回任务所有字段的当前值 - get /<任务id> + GET /<任务id> # 返回任务在指定时刻所有字段的值 - get /<任务id>/at/<时刻> + GET /<任务id>/at/<时刻> # 返回当前值 - get /<任务id>/<字段名称> + GET /<任务id>/<字段名称> # 返回字段在指定时刻的值 - get /<任务id>/<字段名称>/at/<时刻> + GET /<任务id>/<字段名称>/at/<时刻> ## 任务管理 # 新增任务 - post /tasks + POST /tasks # 修改任务 - update /tasks + PUT /tasks # 删除任务 - delete /tasks + DELETE /tasks From 2d8c2d23cc2e2a8a441101bf1a139fd7634c4933 Mon Sep 17 00:00:00 2001 From: qhwa Date: Wed, 7 Mar 2012 13:17:38 +0800 Subject: [PATCH 5/8] update describe and it --- professorx/spec/data-api.spec.js | 58 +++++++++++++++++++------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/professorx/spec/data-api.spec.js b/professorx/spec/data-api.spec.js index a54b45a..fcf6ae2 100644 --- a/professorx/spec/data-api.spec.js +++ b/professorx/spec/data-api.spec.js @@ -25,60 +25,70 @@ describe("professor x", function() { expect( get( task, 'doubleclick') ).toEqual(0); }); - it("可以通过请求增加或减少数据", function(){ + describe("可以通过请求增加或减少数据", function(){ - describe("原先没有的数据也可以正确设值", function(){ + it("原先没有的数据也可以正确设值", function(){ post( task, 'click', { value: 5 } ); expect( get( task, 'click' ) ).toEqual( 5 ); }); - post( task, 'click', { value: 10 } ); - expect( get( task, 'click' ) ).toEqual( 15 ); + it("在原有的数据基础上进行正常增减", function(){ + post( task, 'click', { value: 10 } ); + expect( get( task, 'click' ) ).toEqual( 15 ); - post( task, 'click', { value: -10 } ); - expect( get( task, 'click' ) ).toEqual( 5 ); + post( task, 'click', { value: -10 } ); + expect( get( task, 'click' ) ).toEqual( 5 ); - post( task, 'click', { value: 1.5 } ); - expect( get( task, 'click' ) ).toEqual( 6.5 ); + post( task, 'click', { value: 1.5 } ); + expect( get( task, 'click' ) ).toEqual( 6.5 ); + }); describe("可以设置数据变化的时刻", function(){ - describe("过去的变化会影响现在", function(){ + it("能够将过去的变化反映在当前值", function(){ post( task, 'click', { value: 3, at: Date.now() - 5 * 3600 * 1000 } ); expect( get( task, 'click' ) ).toEqual( 9.5 ); }); - describe("可以获取过去的数据", function(){ - var time = Date.now() - 4 * 3600 * 1000; - expect( get( task, 'click', time ) ).toEqual( 3 ); + describe("此时去获取值", function(){ + it("可以返回过去时刻的值", function(){ + var time = Date.now() - 4 * 3600 * 1000; + expect( get( task, 'click', time ) ).toEqual( 3 ); + }); - describe("超过了创建的时间,应该返回null", function(){ - time -= 2 * 3600 * 1000; - expect( get( task, 'click', time ) ).toBeNull(); + describe("如果超过了创建的时间", function(){ + it("应该返回null", function(){ + time -= 2 * 3600 * 1000; + expect( get( task, 'click', time ) ).toBeNull(); + }); }); }); }); }); - it("可以通过请求更新原有的值", function(){ + describe("通过请求更新原有的值", function(){ - describe("原先没有的数据也可以正确设值", function(){ + it("原先没有的数据也可以正确设值", function(){ put( task, 'click', { value : 100 } ); expect( get( task, 'click' ) ).toEqual( 100 ); }); - put( task, 'click', { value : 150 } ); - expect( get( task, 'click' ) ).toEqual( 150 ); + it("可以返回正确的value (在已有的数值基础上)", function(){ + put( task, 'click', { value : 150 } ); + expect( get( task, 'click' ) ).toEqual( 150 ); + }); - describe("可以设置数据更新的时刻", function(){ - var time = Date.now() - 4 * 3600 * 1000; - put( task, 'click', { value: 500, at: time } ); + describe("设置数据更新的时刻", function(){ + it("可以返回过去时刻的值", function(){ + var time = Date.now() - 4 * 3600 * 1000; + put( task, 'click', { value: 500, at: time } ); + }); - describe("可以正确获取过去更新的数据",function(){ + it("可以正确获取过去更新的数据",function(){ expect( get( task, 'click', time + 1000 ) ).toEqual( 500 ); }); - describe("过去设置的数据对现在的put没有影响", function(){ + it("过去设置的数据对现在的put没有影响", function(){ expect( get( task, 'click' ) ).toEqual( 150 ); }); }); From a7dcc085d881aaa19d7e911035752f38043ec2ef Mon Sep 17 00:00:00 2001 From: qhwa Date: Wed, 7 Mar 2012 13:27:13 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- professorx/spec/data-api.spec.js | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/professorx/spec/data-api.spec.js b/professorx/spec/data-api.spec.js index fcf6ae2..a508ce1 100644 --- a/professorx/spec/data-api.spec.js +++ b/professorx/spec/data-api.spec.js @@ -17,19 +17,14 @@ describe("professor x", function() { removeTask( task ); }); - it("收到请求时可以创建数据", function(){ - post( task, 'click' ); - expect( get( task, 'click') ).toEqual(0); - - post( task, 'doubleclick' ); - expect( get( task, 'doubleclick') ).toEqual(0); - }); - - describe("可以通过请求增加或减少数据", function(){ + describe("POST: 可以通过请求增加或减少数据", function(){ it("原先没有的数据也可以正确设值", function(){ post( task, 'click', { value: 5 } ); expect( get( task, 'click' ) ).toEqual( 5 ); + + post( task, 'doubleclick' ); + expect( get( task, 'doubleclick') ).toEqual(0); }); it("在原有的数据基础上进行正常增减", function(){ @@ -66,7 +61,7 @@ describe("professor x", function() { }); }); - describe("通过请求更新原有的值", function(){ + describe("PUT: 通过请求更新原有的值", function(){ it("原先没有的数据也可以正确设值", function(){ put( task, 'click', { value : 100 } ); @@ -79,8 +74,9 @@ describe("professor x", function() { }); describe("设置数据更新的时刻", function(){ + var time = Date.now() - 4 * 3600 * 1000; + it("可以返回过去时刻的值", function(){ - var time = Date.now() - 4 * 3600 * 1000; put( task, 'click', { value: 500, at: time } ); }); From 0922e3dda61119fc97c7e6f3ed1f15c574a91180 Mon Sep 17 00:00:00 2001 From: qhwa Date: Wed, 7 Mar 2012 13:32:02 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84describe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- professorx/spec/data-api.spec.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/professorx/spec/data-api.spec.js b/professorx/spec/data-api.spec.js index a508ce1..caaf67a 100644 --- a/professorx/spec/data-api.spec.js +++ b/professorx/spec/data-api.spec.js @@ -51,11 +51,9 @@ describe("professor x", function() { expect( get( task, 'click', time ) ).toEqual( 3 ); }); - describe("如果超过了创建的时间", function(){ - it("应该返回null", function(){ - time -= 2 * 3600 * 1000; - expect( get( task, 'click', time ) ).toBeNull(); - }); + it("应该返回null, 如果超过了创建的时间", function(){ + time -= 2 * 3600 * 1000; + expect( get( task, 'click', time ) ).toBeNull(); }); }); }); From 92aa4ae551e2c2c4238ca941e69ea1ed48b9acda Mon Sep 17 00:00:00 2001 From: qhwa Date: Sun, 18 Mar 2012 16:37:03 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- professorx/spec/data-api.spec.js | 79 +++++-------------------- professorx/spec/readme.md | 99 +++++++++++++++++--------------- 2 files changed, 68 insertions(+), 110 deletions(-) diff --git a/professorx/spec/data-api.spec.js b/professorx/spec/data-api.spec.js index caaf67a..8000998 100644 --- a/professorx/spec/data-api.spec.js +++ b/professorx/spec/data-api.spec.js @@ -11,85 +11,32 @@ describe("professor x", function() { - var task = 'action'; + var task = '10bec59'; afterEach(function(){ removeTask( task ); }); - describe("POST: 可以通过请求增加或减少数据", function(){ + describe("数据输入", function(){ it("原先没有的数据也可以正确设值", function(){ - post( task, 'click', { value: 5 } ); - expect( get( task, 'click' ) ).toEqual( 5 ); - - post( task, 'doubleclick' ); - expect( get( task, 'doubleclick') ).toEqual(0); - }); - - it("在原有的数据基础上进行正常增减", function(){ - post( task, 'click', { value: 10 } ); - expect( get( task, 'click' ) ).toEqual( 15 ); - - post( task, 'click', { value: -10 } ); - expect( get( task, 'click' ) ).toEqual( 5 ); - - post( task, 'click', { value: 1.5 } ); - expect( get( task, 'click' ) ).toEqual( 6.5 ); - }); - - describe("可以设置数据变化的时刻", function(){ - - it("能够将过去的变化反映在当前值", function(){ - post( task, 'click', { value: 3, at: Date.now() - 5 * 3600 * 1000 } ); - expect( get( task, 'click' ) ).toEqual( 9.5 ); - }); - - describe("此时去获取值", function(){ - it("可以返回过去时刻的值", function(){ - var time = Date.now() - 4 * 3600 * 1000; - expect( get( task, 'click', time ) ).toEqual( 3 ); - }); - - it("应该返回null, 如果超过了创建的时间", function(){ - time -= 2 * 3600 * 1000; - expect( get( task, 'click', time ) ).toBeNull(); - }); - }); + beancon( task ); + expect( get( task, '*' ).count ).toEqual( 1 ); }); - }); - - describe("PUT: 通过请求更新原有的值", function(){ - it("原先没有的数据也可以正确设值", function(){ - put( task, 'click', { value : 100 } ); - expect( get( task, 'click' ) ).toEqual( 100 ); - }); + it("在原有的数据继续统计", function(){ + beancon( task ); + expect( get( task, '*' ).count ).toEqual( 1 ); - it("可以返回正确的value (在已有的数值基础上)", function(){ - put( task, 'click', { value : 150 } ); - expect( get( task, 'click' ) ).toEqual( 150 ); + beancon( task, { name: 'qhwa' } ); + expect( get( task, '*' ).count ).toEqual( 2 ); + expect( get( task, 'name' ).count ).toEqual( 1 ); }); - describe("设置数据更新的时刻", function(){ - var time = Date.now() - 4 * 3600 * 1000; - - it("可以返回过去时刻的值", function(){ - put( task, 'click', { value: 500, at: time } ); - }); - - it("可以正确获取过去更新的数据",function(){ - expect( get( task, 'click', time + 1000 ) ).toEqual( 500 ); - }); - - it("过去设置的数据对现在的put没有影响", function(){ - expect( get( task, 'click' ) ).toEqual( 150 ); - }); - }); }); - function post( task, field, param ){ + function beacon( task, obj ){ //TODO: implement it } @@ -99,6 +46,10 @@ describe("professor x", function() { function get( task, field, time ){ //TODO: implement it + { + count: 0, + total: 0 + } } function removeTask( task ){ diff --git a/professorx/spec/readme.md b/professorx/spec/readme.md index 5da68b6..a1359b2 100644 --- a/professorx/spec/readme.md +++ b/professorx/spec/readme.md @@ -4,69 +4,76 @@ 独立于界面之外,prefessorX以restful API的方式提供数据输入和输出的服务 -## 数据输入 +数据输入 +-------- - # 相对地改变字段的值 - POST /<任务id>/<字段名称> +客户端将要记录的数据封装成一个json字符串,经过base64编码后传给服务器。 - # 设置字段为新的数值 - PUT /<任务id>/<字段名称> +### json 数据格式 - # 删除字段 - DELETE /<任务id>/<字段名称> +必须包含tid字段: - # 删除任务 - DELETE /<任务id> + { + "tid": <任务id>, + "key": value + } +其他数据可以是单层,也可以多层包装,例如: -例如,如果有任务browser-stat, 字段ie6, 下列请求后ie6字段的值分别为: + { + "tid" : "10bec59", //tid必须 -`{ value: x }` 代表form中的数值 + "browser" : { //可以使用object + "shell" : "Sogou", + "core" : { //可以多层 + name : "trident", + version : "5" + } + }, - POST /browser-stat/ie6 # => 0 - POST /browser-stat/ie6 - { value : 5 } # => 5 - POST /browser-stat/ie6 - { value : 10 } # => 15 - POST /browser-stat/ie6 - { value : -4 } # => 11 - PUT /browser-stat/ie6 - { value : 200 } # => 200 - DELETE /browser-stat/ie6 # => null - POST /browser-stat/ie6 - { value : 15.4 } # => 15.4 + "screen" : { + "w" : 1920, + "h" : 1200 + }, -### 输入以前的数据 -以上都是输入当前的数据,存储的时候会以Time.now()来存储时间。我们也可以指定记录的时间: + "flash" : "11.0 DEBUG" //单层 + } - POST /browser-stat/ie6 - { value: 5, at: "2011-04-01 18:34:53" } +也可以没有其他key,只传一个tid - PUT /browser-stat/ie6 - { value: 430, at: "2012-04-01 18:34:53" } + { "tid": "10bec59" } -## 数据输出 +### base64 编码 - # 返回任务所有字段的当前值 - GET /<任务id> +对json字符串以base64编码 - # 返回任务在指定时刻所有字段的值 - GET /<任务id>/at/<时刻> +### 发送到服务器 - # 返回当前值 - GET /<任务id>/<字段名称> + GET /beacon?data= - # 返回字段在指定时刻的值 - GET /<任务id>/<字段名称>/at/<时刻> +数据统计和查询 +-------------- -## 任务管理 + GET /task/<任务id>/<查询类型>/<查询条件 base64> - # 新增任务 - POST /tasks +### 查询类型 - # 修改任务 - PUT /tasks +* info : 简要信息,包括count,last_seen信息 - # 删除任务 - DELETE /tasks - + { + count: 数量, + last_seen: 最后一次更新时间 + } + +* count : 求数量 +* summ : 求总和 +* average : 求平均值 + +### 查询条件 +类css3选择器语法 + +* \* : 默认条件,查询所有记录(此时可以省略查询条件) +* browser : 查询含有browser字段的记录 +* browser.core.name=trident : 查询符合条件的记录 +* browser.core.name=trident && browser.shell=360SE : 查询符合条件的记录 +* flash.version > 10