从svn到git

两者都是优秀的版本管理工具(giter请不要鄙视svner)

  • svn上手非常容易,操作简单
  • git功能强大,但是要熟练使用分支不算容易

git因为是分布式的,所以其核心就是分支(只有master分支情况下和svn差不多?),分支的意义在于,可以将项目代码按照功能、模块拆分成不同的分支。比如这个产品要加一个支付功能和一个登陆功能,可以创建两个分支,交给不同的开发人员并行开发。登陆功能先开发完,测试无误后合并改分支到master分支,master分支部署上线。支付功能虽然没有开发完成,但是在另一条分支上,所以产品上线和功能开发完全不受影响。这才是分布式开发的高效模式。

被git坑了一个星期之后决心把官方文档看一下,结合实践经验进行了整理。


新手常见问题

  1. 如何查看有哪些分支?
    git branch -a

  2. 如何强制检出/切换分支或分支指定文件
    git checkout <branch> [file] [-f]
    强制更新,以branch版本的代码为主

  3. 提交代码出现冲突冲突怎么办?
    hint: Updates were rejected because the tip of your current branch is behind
    hint: its remote counterpart. Integrate the remote changes (e.g.
    hint: 'git pull ...') before pushing again.
    hint: See the 'Note about fast-forwards' in 'git push --help' for details.
    先切换分支,然后拉取分支上最新的代码覆盖到本地
    git pull
    添加或者提交代码,解决冲突之后
    git push

  4. 如何新建分支
    git checkout -b <branch_name>
    本地建立 branch 並立即切換到新分支
    git branch -m <new_name>
    修改分支名称

  5. 从远程仓库拉取代码到本地仓库,并建立跟踪关系
    git clone http://xxx.git
    或者
    get clone git@xxx.git
    然后
    git checkout -b <本地新分支名> <对应的远程分支名>

  6. 远程仓库新建了一个分支,如何更新远程分支信息
    git fetch <remote base>

  7. 如何在远程仓库新建一个分支
    git branch <branch name>
    新建一个本地分支,按照正常流程提交完代码后,推送到远程
    git push <remote base> <local branch>:<remote branch>

实用指令

reset

git reset [file]
取消暂存

remote

查看远程仓库名

git remote -v
查看远程仓库url

git remote add <basename> <url>
新增远程仓库

git remote show <basename>
查看远程仓库详细信息

git remote rename <old basename> <new basename>
重命名远程仓库

pull

相当于fetch和merge

push

git push [remote_branch] [local_branch]
推送本地仓库代码到远程仓库,相当于svn的commit

git push <remote base> [tag name]
推送本地标签到远程仓库

git push <remote base> <remote branch>:<local branch>
将本地分支推送到指定的远程分支

git push <remote base> --delete <remote branch>
删除远程分支

tag

查看标签(用来标记标志性的稳定版本信息)

git tag -l '[expression]'
查看那符合正则表达式的

git tag -a <tag name> -m <comment>
添加带注释的标签

git tag -a <tag name> <md5>
对某个版本打标签

git tag [tag name]
如果没有标签名,则为查看所有标签。带标签名则为新建标签

merge

git merge <branch name>
将其他分支合并到本分支

commit

git commit -a -m 'xx'
暂存并提交

branch

git branch
查看本地仓库分支

git branch -v
查看本地仓库分支最后一次提交情况

git branch -vv
查看分支跟踪情况

git branch <branch name>
新建分支

git branch -d <branch name>
删除分支

git branch [--merged | --no-merged]
查看已合并|未合并的本地仓库分支

git branch -u <remote base>/<remote branch>
修改当前跟踪分支

commit

git commit -a -m 'xx'
提交并且暂存暂存的方法

checkout

git checkout -- [file]
恢复文件

git checkout -b [branchname] [tagname]
在特定的版本上创建一个新的分支并切换到此分支

git checkout -b [local branch] [remote base]/[remote branch]
将远程分支检出到本地分支

git checkout --track <remote base>/<remote branch>
让当前分支跟踪远程分支

git checkout --track <remote base>/<remote branch>
git checkout -b <local branch> <remote base>/<remote branch>
让当前分支跟踪到远程分支。两条命令作用基本一致,不同的是第二条命令可以重命名检出的分支。

rebase

git rebase [basebranch]
变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。

小技巧

查看配置

git config -1

设置别名

git config --global alias.<name> <commend>

保存用户名和密码

对于http(s)协议,可以用下面命令临时缓存

git config --global credential.helper cache
开启linux缓存
git config --global credential.helper wincred
开启windows缓存

对于ssh协议,可以用ssh key,具体教程网上很多

权威教程

Redux 可以被描述成三大基础原则:

单一数据源

整个应用的 state 被储存在一棵 object tree 中,它只有一个单一的 store 。

这让同构应用开发变得非常容易。来自服务端的 state 可以轻而易举地被序列化并融合到没有额外代码影响的客户端上。
由于是单一的 state tree ,调试也变得非常容易。你也可以把应用的 state 保存下来加快开发速度。
此外,受益于单一的 state tree ,以前难以实现的像“撤销/重做”这类的功能也变得轻而易举。

1
2
3
4
5
6
7
8
9
10
11
console.log(store.getState());

{
visibilityFilter: 'SHOW_ALL',
todos: [{
text: 'Consider using Redux',
completed: true,
}, {
text: 'Keep all state in a single tree',
completed: false
}]

State 是只读的

惟一改变 state 的办法就是触发 action,action 是一个描述要发生什么的对象。

这让视图和网络请求不能直接修改 state,相反只能表达出需要修改的意图。
因为所有的修改都被集中化处理,且严格按照顺序一个接一个执行,因此没有模棱两可的情况需要提防。
Action 就是普通对象而已,因此它们可以被日志打印、序列化、储存、后期调试或测试时回放出来。

1
2
3
4
5
6
7
8
9
 store.dispatch({
type: 'COMPLETE_TODO',
index: 1
});

store.dispatch({
type: 'SET_VISIBILITY_FILTER',
filter: 'SHOW_COMPLETED'
});

为何而来

随着 JavaScript 单页应用开发日趋复杂,JavaScript 需要管理比任何时候都多的 state (状态)。
这些 state 可能包括服务器响应、缓存数据、本地生成尚未持久化到服务器的数据,也包括 UI 状态,
如激活的路由,被选中的标签,是否显示加载中动效或者分页器等等。

管理不断变化的 state 非常难。如果一个 model 的变化会引起另一个 model 变化,那么当 view 变化时,
就可能引起对应 model 以及另一个 model 的变化,依次地,可能会引起另一个 view 的变化。直至你搞不清楚到底发生了什么。
state 在什么时候,为什么,如何变化已然不受控制。 当系统变得错综复杂的时候,想重现问题或者添加新功能就会变得举步维艰。

如果这还不够糟糕,考虑一些来自前端开发领域的新需求,如更新调优、服务端渲染、路由跳转前请求数据等等。
我们前端开发者正在经受前所未有的复杂性,我们是时候该放弃了吗?

这里的复杂性很大程度上来自于:我们总是将两个难以厘清的概念混在一起:变化和异步。
我称它们为曼妥思糖与可乐。如果把二者都分开,能做的很好,但混到一起,就变得一团糟。
一些库如 React 试图在视图层禁止异步和直接操作 DOM 来解决这个问题。
美中不足的是,React 依旧把处理 state 中数据的问题留给了你自己。

跟随 Flux、CQRS 和 Event Sourcing 的脚步,通过限制更新发生的时间和方式,
Redux 试图让 state 的变化变得可预测,而这些限制条件反映在 Redux 的 三大原则中。

最近在做项目的时候,一直出现 客户端时间不对的问题,鉴于顺应 上个前端开发的布道,在设置时间方面,也一直按照以往的惯例.
由于时间是海外客户,在取服务器时间的接口上,总是比北京时间提早8小时,于是希望服务器接口返回的时间是格林威治时间,
根据客户端的时区转换时间。

gg接口
GetDateTimeUtc 返回UTC标准时间毫秒
GetDateTimeStamp 返回标准UTC时间戳

## 服务接口返回格林威治时间

1
2
3
4
5
6
7
8
9
10
11
12
$.ajax({
type: "POST",
url: "/App_Services/wsDefault.asmx/GetDateTimeStamp",
dataType: "json",
contentType: "application/json;utf-8",
timeout: 10000,
error: function () { },
success: function (msg) {
if (msg)
ajaxInit(parseFloat(msg.d));
}
});

根据客户端的时区获取时差

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
29
30
31
32
33
function clientTimeZoneT() {
//获得时区偏移量
var timeOffset = new Date().getTimezoneOffset();
//获得时区小时偏移基数
var hour = parseInt(timeOffset / 60);
//获得时区分钟偏移基数
var munite = timeOffset % 60;
var prefix = "-";
if (hour < 0 || munite < 0) {
prefix = "+";
hour = -hour;
if (munite < 0) {
munite = -munite;
}
}
hour += " ";
munite += " ";
if (hour.length == 2) {
hour = "0" + hour;
}
if (munite.length == 2) {
munite = "0" + munite;
}
var TimeZone = prefix + hour + munite;

var TimeZoneJ = {
TimeZone: TimeZone,
Minute:timeOffset,
millisecond: -(timeOffset*60*1000)
}

return TimeZoneJ;
}

clientTimeZoneT 函数 返回一个 json 对象
TimeZone 时区差
Minute 相差分钟数
millisecond 毫秒数 :为了和服务器返回的时间做对应客户端时间

JavaScript getTimezoneOffset() 方法

返回格林威治时间和本地时间之间的时差:

1
2
var d = new Date()
var n = d.getTimezoneOffset();

n 输出结果:

1
-480

定义和用法

getTimezoneOffset() 方法可返回格林威治时间和本地时间之间的时差,以分钟为单位。
例如,如果时区为 GMT+2, 将返回-120 。
注意: 由于使用夏令时的惯例,该方法的返回值不是一个常量。
提示: 协调世界时,又称世界统一时间,世界标准时间,国际协调时间,简称UTC(Universal Coordinated Time)。
注意: UTC 时间即是 GMT(格林尼治) 时间。

返回值

Number : 本地时间与 GMT 时间之间的时间差,以分钟为单位。

最终方案

选择了 GetDateTimeStamp 返回标准UTC时间戳

遇到的坑 是 GetDateTimeStamp 给我返回的是 10 位数的 时间戳 哈哈 ,所以需要给返回的值 * 1000

可以看到一下代码 返回的时间戳 * 1000 后在交给 js 处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$.ajax({
type: "POST",
url: "/App_Services/wsDefault.asmx/GetDateTimeStamp",
dataType: "json",
contentType: "application/json;utf-8",
timeout: 10000,
error: function () { },
success: function (msg) {
var millisecond = parseInt(clientTimeZoneT().millisecond);
var HDateTime = parseFloat(msg.d * 1000);
if (msg)
ajaxInit(HDateTime);
}
});

loopback 插入数据库

mongodb 篇

上几节相信大家的项目都可以运行起来了,下面就开始 玩玩 mongodb 这个家伙吧

在玩之前希望测试一下是否已经 连接到 mongodb

可以登录 启动 StrongLoop 的 api 平台

1
$ slc arc

StrongLoop api 平台

点击 大大的按钮 看到 Success 就正常已经正常连接到 mongodb 了

配置 datasources.json 内容如下

根据您 mongodb 的 配置 填入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"db": {
"name": "db",
"connector": "memory"
},
"mongodb": {
"host": "127.0.0.1",
"port": 27017,
"password": "",
"name": "mongodb",
"connector": "mongodb",
"url": "mongodb://localhost:27017/panli-auth",
"user": ""
}
}

配置 model-config.json

这里我吧 dataSource 都改成了 ‘mongodb’

mongodb 的数据源 在 datasources.json 的文件里配置好了 上面已经配置了

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
29
30
31
32
33
34
35
36
{
"_meta": {
"sources": [
"loopback/common/models",
"loopback/server/models",
"../common/models",
"./models"
],
"mixins": [
"loopback/common/mixins",
"loopback/server/mixins",
"../common/mixins",
"./mixins"
]
},
"AccessToken": {
"dataSource": "mongodb",
"public": false
},
"ACL": {
"dataSource": "mongodb",
"public": false
},
"RoleMapping": {
"dataSource": "mongodb",
"public": false
},
"Role": {
"dataSource": "mongodb",
"public": false
},
"PanUser": {
"dataSource": "mongodb",
"public": true
}
}

scl run 运行应用

1
2
3
4
5
6
7
8
E:\zan\www\strongloop\loopback\panli-auth>slc run
INFO strong-agent v2.0.2 profiling app 'panli-auth' pid '7752'
INFO strong-agent[7752] started profiling agent
INFO supervisor reporting metrics to `internal:`
supervisor running without clustering (unsupervised)
Swagger: skipping unknown type "ObjectID".
Web server listening at: http://localhost:3000
Browse your REST API at http://localhost:3000/explorer

浏览器打开 http://localhost:3000/explorer

在这里 我们可以测试接口的数据

下面演示一下

api gif

上面是演示注册用户的api 接口 post 提交 http://localhost:3000/api/users

在文本框内输入三个必填项 username , email 和 password

1
2
3
4
5
{
"username":"za2",
"email":"zz@z2.com",
"password":"qq123"
}

提交后 在下面的 Response Body 可以看到 我们注册的用户信息了

1
2
3
4
5
{
"username": "za2",
"email": "zz@z2.com",
"id": "5631dc4d59ab85481e474aec"
}

看到 id 的键值 就可以知道 他插入到了 mongodb 了

我还是不相信我的眼睛 , 吓得我 跑到 mongodb 瞧一瞧 嘻嘻!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> show dbs
local 0.078GB
panli-auth 0.078GB
test 0.078GB
> use panli-auth
switched to db panli-auth
> show tables
PanUser
system.indexes
> show collections
PanUser
system.indexes
> db.PanUser.find()
{ "_id" : ObjectId("5631d38859ab85481e474aeb"), "username" : "za", "password" :
"$2a$10$OnuNv/YTPSYzYUi9S9UJ3eArmRmZQbRCyBnqt6xxozYEjSMIE2PTK", "email" : "zz@z.
com" }

{ "_id" : ObjectId("5631dc4d59ab85481e474aec"), "username" : "za2", "password" :
"$2a$10$9q5X4y570Ti3SdfMg4ANr.dHOdjZpPW3.JOxE5GB2U6t9XCngZyVq", "email" : "zz@z
2.com" }

>

可以看到 数据以及躺在 mongodb 里啦

如果有不对的地方,请大神 指错, 我也是一边学习 一边 写的

模型(model)添加新属性

命令行方式

  • cd 到项目根目录下 slc loopback:property

选择属性添加到哪个模型里 - 我选择了上节创建的 PanUser 模型

1
2
3
4
5
6
7
8
9
10
E:\zan\www\strongloop\loopback\panli-auth>slc loopback:property
? Select the model:

Change
Checkpoint
Email
> PanUser
Role
RoleMapping
Scope
(Move up and down to reveal more choices)

要添加属性的名称 输入 age 选择 number 字段类型

1
2
3
4
5
6
7
8
9
10
11
? Select the model: PanUser
? Enter the property name: age
? Property type:
string
> number
boolean
object
array
date
buffer
(Move up and down to reveal more choices)

是否必填 输入 N

1
2
3
4
? Select the model: PanUser
? Enter the property name: age
? Property type: number
? Required? No

到此 为 模型(model)添加新属性 结束

web在线网页方式

忽视吧 哈哈…

StrongLoop API平台 傻瓜式操作

如果有不对的地方,请大神 指错, 我也是一边学习 一边 写的

创建新模型(model)

如果您还在停留在手工创建 模型(model),是不是感觉很不爽 !
是的,StrongLoop 给我们带来的更加规范的模式!下面进入正题

命令行方式

  • cd 到项目根目录下 slc loopback:model

接下来会进入交互模式

这里是输入模型名称 我输入了 PanUser (我理解为数据库的表名!! 惭愧了 (^__^) 嘻嘻……)

1
? Enter the model name: PanUser

下面选择 模型(model) 的 存放数据源, 由于在前面我已经创建了 mongodb 的数据源 (为数据持久化)

如果您还没有创建数据源的话,可能选项只有 一个 db (memory) 存放在内存中

这里我选择了 mongodb (mongodb) 第二个选择

1
2
3
4
? Select the data-source to attach PanUser to:
(no data-source)
> db (memory)
mongodb (mongodb)

接下来我们要选择 模型继承类 ,这里我们想建立一个用户系统,
PanUser 这个模型 继续 loopback 自身内建的 User
一直下拉 选择 User 回车

1
2
3
4
5
6
7
8
9
10
11
? Enter the model name: PanUser
? Select the data-source to attach PanUser to: mongodb (mongodb)
? Select model's base class (Use arrow keys)
Model
> PersistedModel
ACL
AccessToken
Application
Change
Checkpoint
(Move up and down to reveal more choices)

回车后我们看到了 如下

1
2
3
4
? Enter the model name: PanUser
? Select the data-source to attach PanUser to: mongodb (mongodb)
? Select model's base class User
? Expose PanUser via the REST API? (Y/n) -- Y键回车 暴露这个接口

下面填写 REST 接口 的 url 地址 – 我填写了 users

1
2
3
4
5
? Enter the model name: PanUser
? Select the data-source to attach PanUser to: mongodb (mongodb)
? Select model's base class User
? Expose PanUser via the REST API? Yes
? Custom plural form (used to build REST URL): users

主要配置都完成了 当输入完 REST 接口 的 url 地址 回车后,
就该添加字段了 ,由于 PanUser 已经继承了 loopback 的 User
所以 一些该有的字段 都已经有了 例如 username email password 等等
这里我输入了 fullname

1
2
3
4
5
6
7
8
9
10
E:\zan\www\strongloop\loopback\panli-auth>slc loopback:model
? Enter the model name: PanUser
? Select the data-source to attach PanUser to: mongodb (mongodb)
? Select model's base class User
? Expose PanUser via the REST API? Yes
? Custom plural form (used to build REST URL): users
Let's add some PanUser properties now.

Enter an empty property name when done.
? Property name: fullname

选择 字段类型 ‘string’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Enter an empty property name when done.
? Property name: fullname
(!) generator#invoke() is deprecated. Use generator#composeWith() - see http:
eoman.io/authoring/composability.html
invoke loopback:property
? Property type: (Use arrow keys)
> string
number
boolean
object
array
date

buffer
(Move up and down to reveal more choices)

是否必填 no

1
2
3
4
5
6
? Property type: string
? Required? No

Let's add another PanUser property.
Enter an empty property name when done.

? Property name:

接下来会继续增加字段 这里就不增加了 按下 ctrl+c 退出交互

有人会问 以上命令都做了哪些 设置呢?

在项目根目录下 多了 一个 common 文件夹 结构如下

common

可以看到 models 增加了 2个文件 pan-user.jspan-user.json

pan-user.js 可以写入我们的业务逻辑

pan-user.json 是模型配置参数

还有一个地方做了修改 在 server/model-config.json 下 可以看到 增加了如下配置

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
29
30
31
32
33
34
35
36
37
38
39
{
"_meta": {
"sources": [
"loopback/common/models",
"loopback/server/models",
"../common/models",
"./models"
],
"mixins": [
"loopback/common/mixins",
"loopback/server/mixins",
"../common/mixins",
"./mixins"
]
},
"User": {
"dataSource": "db"
},
"AccessToken": {
"dataSource": "db",
"public": false
},
"ACL": {
"dataSource": "db",
"public": false
},
"RoleMapping": {
"dataSource": "db",
"public": false
},
"Role": {
"dataSource": "db",
"public": false
},
"PanUser": {
"dataSource": "mongodb",
"public": true
}
}

在最后面 增加 了 PanUser;
这个在 我们手工 写入 model 时 是不能忘记的

web在线网页方式

如果您看过了 第三季的 话, 我想这里就很简单了
如果您没有看,可以看一下上一节的 操作

model

可以看到 这里已经显示了 刚才 我们用命令行的方式 添加的 PanUser

这里都是傻瓜式操作了,大家自己玩玩吧! O(∩_∩)O哈哈

如果有不对的地方,请大神 指错, 我也是一边学习 一边 写的

配置数据库连接

Loopback 提供了 多种连接数据库的 方案 一下分别是 命令行 和 StrongLoop 为我们提供的管理系统

命令行方式

  • cd 到项目根目录下 slc loopback:datasource

接下来会进入交互模式

1
2
? Enter the data-source name: mongodb
? Select the connector for mongodb: MongoDB (supported by StrongLoop)

这里我 选了 mongodb

下面是选择界面

1
2
3
4
5
6
7
8
9
10
? Enter the data-source name: mysql
? Select the connector for mysql:
In-memory db (supported by StrongLoop)
Email (supported by StrongLoop)
> MySQL (supported by StrongLoop)
PostgreSQL (supported by StrongLoop)
Oracle (supported by StrongLoop)
Microsoft SQL (supported by StrongLoop)
MongoDB (supported by StrongLoop)
(Move up and down to reveal more choices)

操作后会在项目目录下的 server/datasources.json 文件里增加 我们的 数据源

1
2
3
4
5
6
7
8
9
10
{
"db": {
"name": "db",
"connector": "memory"
},
"mongodb": {
"name": "mongodb",
"connector": "mongodb"
}
}

在这里 需要我们手动添加 mongodb 的连接配置信息 加入 host, port, database, username和password等项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"db": {
"name": "db",
"connector": "memory"
},
"mongodb": {
"name": "mongodb",
"connector": "mongodb",
"host": "127.0.0.1",
"database": "devDB",
"username": "devUser",
"password": "devPassword",
"port": 27017
}
}

web在线网页方式

StrongLoop 为我们提供非常方便的 在线管理您的应用后台

如果您是克隆了 同事的项目 请记得 先全局安装 npm i -g strongloop

到我们的项目根目录下 slc arc 命令

会自动打开浏览器进入管理界面

1
2
3
E:\zan\www\strongloop\loopback\panli-auth>slc arc
Loading workspace E:\zan\www\strongloop\loopback\panli-auth
StrongLoop Arc is running here: http://localhost:24033/#/

loopback login

这里需要到 strongloop 的官网注册一个帐号 才可以登录后台 ,至于为什么,目前还不清楚,很抱歉,哈哈!

注册好后 我们输出帐号登录来到了 非常漂亮的后台

loopback main page

由于刚才敲入的 是 mongodb 的 数据源 所以 在 左侧的 导航 会看到 Data Sources 会有2个数据源
第一个 db 表示 内存 一开始项目初始化的时候数据都是存放在 内存中的。
第二个 mongodb 是要链接本地mongodb 数据库的 下面是我的配置

mongodb 数据库

点击 Test Connection 按钮 如果出现 绿色 的 Success 提示 说明 连接数据库成功 ,你可以开心的耍了

如果有不对的地方,请大神 指错, 我也是一边学习 一边 写的

祝你顺利完成!

(^__^) 嘻嘻……

安装数据库驱动

LoopBack 不是所有的事情都帮你做了,你还需要手动安装一下你需要的数据库

目前 LoopBack 支持如下数据库:

mongodb

1
$ npm install loopback-connector-mongodb --save

出处详情
https://docs.strongloop.com/display/public/LB/MongoDB+connector

mysql

1
$ npm install loopback-connector-mysql --save

出处详情
https://docs.strongloop.com/display/public/LB/MySQL+connector

oracle

1
$ npm install loopback-connector-oracle --save

出处详情
https://docs.strongloop.com/display/public/LB/Oracle+connector

postgresql

1
$ npm install loopback-connector-postgresql --save

出处详情
https://docs.strongloop.com/display/public/LB/PostgreSQL+connector

SQL+Server

1
$ npm install loopback-connector-mssql --save

出处详情
https://docs.strongloop.com/display/public/LB/SQL+Server+connector

Install StrongLoop 安装到全局

1
$ npm install -g strongloop

Create app 创建一个应用

Create a “Hello World” LoopBack application.

创建一个 “Hello World” 的 LoopBack 应用

1
2
3
$ slc loopback
[?] Enter a directory name where to create the project: hello-world
[?] What\'s the name of your application? hello-world

Create models 为应用创建一个模型

1
2
$ cd hello-world
$ slc loopback:model

接下来会交互 模型的 值 按照您的需求输入

1
2
3
4
5
[?] Enter the model name: person
[?] Select the data-source to attach person to: db (memory)
[?] Expose person via the REST API? Yes
[?] Custom plural form (used to build REST URL): people
Let's add some person properties now.

创建模型的字段名称

1
2
Enter an empty property name when done.
[?] Property name: firstname

选择字段类型 上下键切换

1
2
3
4
5
6
7
8
9
10
 [?] Property type: (Use arrow keys)
❯ string
number
boolean
object
array
date

buffer
geopoint
(other)

是否是必填 默认为 N

1
[?] Required? (y/N) y

Run the application 运行 这个应用

1
2
3
$ node .
Browse your REST API at http://0.0.0.0:3000/explorer
Web server listening at: http://0.0.0.0:3000/

浏览器打开 http://localhost:3000/explorer

就可以看到 所有 http 请求的 api 接口 ,这里提供了很方便的测试,棒棒的