常规接口

1
2
3
4
5
get api/v1/orgs 获取所有组织机构
get api/v1/orgs/:id 获取特定组织机构
post api/v1/orgs 创建组织机构
put/patch api/v1/orgs/:id 更新组织机构
delete api/v1/orgs/:id 删除特定组织机构

查询规则

精确查询

1
get /buildings?name=研究生2号楼

查询建筑名称===研究生2号楼的建筑

模糊查询

1
get /buildings?search=研究生2号楼

模糊查询接口根据各资源特有的属性特征,默认选择特定几个字段进行查询。

阅读全文 »

团队开发过程中,项目达到一定规模,规范化就需要提上日程,这篇文章对JSDoc一些注释标记作简要使用说明。

最简单的注释

1
2
3
4
5
/**
*
* 这是能被JSDoc识别的最简单的注释
*
*/

一般场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 这是对findGirl函数方法的逻辑说明,如果找到合适的女孩,返回一个女孩对象
* @param {String} tall - 对这个女孩的身高要求
* @param {String} weigh - 对这个女孩的体重要求
* @return {Girl|null} 返回一个女孩对象,或者空
*/

function findGirl(tall,weigh){

}

/**
* @constructor
* @template Girl
*/

function Girl(){
this.name = 'Lucy',
this.tall = '165cm',
this.weigh = '52KG',
this.habit = 'reading、travel、planting'
}

上面是最一般的场景应用,花括号内,标识此方法函数接受或者返回的类型。

@param

@param的格式如下:

1
@param {Type} parameter - parameter's description

Type可以是JavaScript内建的类型如:Object、String、Array等,当然也可以使用更加复杂的类型,参见@param

@return

@return的使用和@param也基本相同,一样包含Type和一段简单的说明,具体参见@return

@private|@protected|@public

从单词就可以看出这些标记的作用,使用如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 就是一个演示函数
* @constructor
*/

function foo(){

/**
* @private
*/

function _innerMethod(){

}

/**
* @protected
*/

this._protectedMethod = function(){

}

/**
* @public
*/

this.publicMethod = function(){

}

}

能把以上几个用起来,就能极大提高项目的可维护性。

controller as的概念被越来越多人采用,我带领的小组,也全部使用John Pappa’s style guide所推荐的风格。$scope.$watch以前是直接监听绑定在\$scope下的内容,前段时间写的一个组件,在测试的时候没有问题,但是在实际使用中,却监测不到值,发现是对as 语法的理解不够深入,来记录下\$scope.\$watch监听as的方法。demo

Usage

阅读全文 »

Git Status

1
2
3
4
5
$ git status -s M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
  • ‘M’ 代表modified
  • ‘A’ 代表staged
  • ‘??’ 代表untracked

有两列,前列代表已经在stage中的状态,后面是代表当前working directory的状态,比如Rakefile是两个MM第一个代表在修改后已经staged了,第二个代表修改后还没有staged。下一次commit只会提交前一次staged的内容。

阅读全文 »

导言

团队在使用TFS自建Git仓库,对项目进行版本管理,所以此文章的内容,有一些方法可能不通用,就如pull request请求的处理,这个需要在TFS网站上进行,不过这些应该影响不大,请举一返三。

工作流程

简单介绍Git团队开发工作流程:

  • fetch 每天来coding前,先执行下,拉取下远程master分支最新的内容。
  • diff 拉取完成后,查看主分支更新情况。
  • merge 如没有问题,就将主分支合并到本地主分支内。
  • branch 创建分支,在分支内进行创作。
  • push 将分支推送到远程分支内。
  • pull reqeust 在TFS发起pull request请求。
阅读全文 »

IDs or Classes

classes should be applied to conceptually similar items that could appear in multiple places on the same page, whereas IDs should be applied to unique elements

有相同抽象概念的元素使用class,对唯一元素进行控制时使用id

Divs and spans

div actually stands for division and provides a way of dividing a document into meaningful areas.

Div不是随便用的,主要是将页面文档,分块成不同意义的区域。

Whereas divs can be used to group block-level elements, spans can be used to group or identify inline elements

Span主要是用在内联函数中。

Note to self

1
2
3
/* :@todo Remember to remove this rule before the site goes live */
/* @workaround: I managed to fix this problem in IE by setting a small negative margin but it's not pretty */
/* @bugfix: Rule breaks in IE 5.2 Mac */

对CSS内容进行注释,让样式更容易理解,也知道还有什么事没做,可参考CSSDoc

Margin collapsing

when two or more vertical margins meet, they will collapse to form a single margin. The height of this margin will equal the height of the larger of the two collapsed margins.

两个元素的边距叠加在一起,以最大的为准。

编码规范

缩进

统一使用一个tab进行缩进,一个tab规定使用4个字符。

语句

1
2
3
4
5
6
7
var i,
len;
for (i=0, len=10; i < len; i++) {
// code
}

return (size > 0 ? size : defaultSize);

注意,后跟一个空格,var申明对象的格式,和语句间的空格。

函数和变量

函数和变量的命名,选用的是 camelCase(驼峰) 规则。

  • 通常变量开头为 noun(名词) ,这是为了能与函数区分开。
  • 函数命名开头为 verb(动词)
阅读全文 »

路由

AngularJS实现路由系统有两个框架可供选择,自带的ngRouter和社区提供的UI-Router,下面只进行后者的使用介绍。

UI-Router 简单使用

使用UI-Router实现SPA(单页面应用程序)开发的好处在于,能共享页面和页面之间的状态,信息等,不再像传统前端页面之间的信息无法直接共享使用。相较于ngRouter,UI-Router更加强大。先来看一个简单的路由例子Live Demo

ui-sref 和 ui-view

Demo中的html页面有如下代码:

1
2
3
4
<div ng-app="app">
<a ui-sref="simple">Go to state</a>
<div ui-view></div>
</div>

阅读全文 »

one

我在书本中看到了别样的生活,它激励着人们,使人们胸怀大志,甚至不惜做一些违法乱章之事,仍然内心充满强烈的期待与渴望。而在我身边的这些碌碌之辈,我看出来他们既没有远大志向,也不会去触犯天条做一些惊世骇俗之事。他们苟且地活着,与书中所描绘的世界格格不入。在他们每一天的生活里,能有一些令人兴奋、觉得有意义的事吗?——我无从知道。我也极不愿意与他们同流合污……我很深切的明白自己这一点……

阅读全文 »

在JavaScript中经常会用到两个常用定时器,setTimeoutsetInterval,前者是一次性的,在设定时间后执行相应任务,后者是设置一个时间间隔重复执行相同的任务。他们俩也对应有相应的clear方法,用来取消操作。当调用set操作时,会返回一个定时器id,保存这个id可对其进行取消操作。

执行时间问题

虽然给相应的定时器设置相应的执行时间,但是严格上来说,是无法保证执行时间的准确性的,这跟JavaScript的运行机理有关,因为它是单线程的,所有任务就像火车一样,是串联着一个接一个的执行,定时器也不例外。

不同

setTimeout是在前一个回调执行完后,延时指定时间后再执行,而setInterval是不管前一个回调有没有执行完,都根据指定时间执行相应任务,所以这样就会有一个问题,当一个回调占用很多的时间,setInterval就有可能一次性执行很多缓存起来的任务。