Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

doc: add website hosting and laf-cli #972

Merged
merged 5 commits into from
Mar 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/.vitepress/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const NavConfig = [
{
text: "在线体验",
// target: "_self",
link: "https://console.lafyun.com/",
link: "https://laf.dev/",
},
];

Expand Down Expand Up @@ -112,8 +112,8 @@ const guideSiderbarConfig = [
{
text: "静态网站托管",
items: [
{ text: "静态托管简介", link: "/guide/website-hosting/" },
{ text: "快速开始", link: "/guide/website-hosting/quick-start" },
{ text: "快速开始", link: "/guide/website-hosting/" },
// { text: "快速开始", link: "/guide/website-hosting/quick-start" },
],
},
{
zuoFeng59556 marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
Binary file added docs/doc-images/add-polocy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/doc-images/creat-bucket.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/doc-images/creat-polocy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/doc-images/creat-token.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/doc-images/open-website.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/doc-images/polocy-db-data.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/doc-images/website-hosting.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
203 changes: 113 additions & 90 deletions docs/guide/cli/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,136 +7,159 @@ title: laf-cli 命令行工具

## 简介

`laf-cli` 提供本地开发环境相关能力的支持:

- 云函数:支持在本地运行、拉取、部署云函数
- 云存储:支持从本地上传、下载云存储文件
- 应用:初始化、查看、启动、停止应用服务

`laf-cli` 可以让你实现本地开发同步 Web 端,用你最熟悉的开发工具,更加高效。

## 安装

```bash
```
# 要求 node 版本 >= 16
npm i laf-cli -g
```
cli 的主要功能就是把在 laf web 上的操作集成到命令行里,下面我们根据 web 端的操作来一个个演示。


## 登录
想要执行登录操作我们需要先拿到我们的 PAT(访问凭证)。

```bash
laf login -u username -p password
```
![](../../doc-images/creat-token.png)

默认登录 `lafyun.com`,如果要登录私有部署的 laf 可通过 `-r` 参数指定:
生成 token 之后我们复制放在 laf login 后面执行此命令即可登录。
```
laf login [pat]
```
默认登录 `laf.dev`,如果要登录私有部署的 laf 可通过 `-r` 参数指定:

`laf login -u username -p password -r https://console.lafyun.com`

`laf login [pat] -r https://laf.dev`

## 查看应用列表
### 退出登录

```bash
laf list
```


## 启停应用

```bash
# 启动应用
laf start APPID

# 停止应用
laf stop APPID

# 重启应用
laf restart APPID
laf logout
```


## 在本地初始化应用

在你的本地项目目录下执行:

```bash
laf init -s APPID
## App
在 web 端登录之后我们会看到我们的 app 列表,那么在 cli 中想查看 app 列表只需要执行。
```

执行后会在当前目录生成一个文件夹 `@laf`,该文件夹下包含了 laf 应用的云函数代码等文件。

`-s` 参数指定初始化时从远程拉取云函数代码,如果不指定,则只会同步应用的基本信息。

`APPID` 应是你已经创建应用的 ID,可通过 `laf list` 查看。


## 拉取云函数

从远程拉取云函数到本地:

```bash

# 拉取所有云函数
laf fn pull

# 拉取一个云函数
laf fn pull FUNCTION_NAME

laf app list
```
### 初始化 app
初始化需要用到 appid ,我们可以在 web 端首页拿到。
这里稍微解释一下,初始化 app 是指在你运行这个命令的目录下生成模版文件,默认是空的,如果想把 web 端的东西同步过来需要加上 -s 。
::: tip
建议在一个空的目录下尝试此命令。
:::
```
laf app init [appid]
```

## 依赖

## 推送云函数

推送本地云函数到远程:

```bash

# 推送所有云函数
laf fn push

# 推送一个云函数
laf fn push FUNCTION_NAME

我们可以通过 pull 命令把 web 端的依赖拉到本地,然后 npm i 即可。
```
laf dep pull
```
如果我们想添加依赖可以使用 add ,注意这里的 add 是在 web 端和本地同时添加这个依赖,添加之后 npm i 即可使用。
```
laf dep add [dependencyName]
```
如果我们的依赖文件,或者说整个本地文件都是从其他地方拷贝过来的,可以通过 push 命令把 dependency.yaml 文件中的所有依赖都安装到 web 端。
```
laf dep push
```


## 调试云函数

用于调试「未保存」「未发布」的云函数:
## 云函数
新建云函数,此命令是在本地和 web 同时创建云函数。
```
laf func create [funcName]
```
删除云函数,同新建一样本地和 web 同时删除。
```
laf func del [funcName]
```
查看云函数列表。
```
laf func list
```
更新 web 端云函数代码到本地。
```
laf func pull [funcName]
```
推送本地云函数代码到 web 。
```
laf func push [funcName]
```
执行云函数,执行结果会打印在命令行,日志需要在 web 上查看。
```
laf func exec [funcName]
```

```bash
## 存储

```bash
laf fn invoke FUNCTION_NAME --param '{"name": "laf"}'
查看 bucket 列表。
```
laf storage list
```

新建 bucket 。
```
laf storage create [bucketName]
```

## 发布云函数
删除 bucket 。
```
laf storage dle [bucketName]
```

发布云函数:
更新 bucket 权限。
```
laf storage update [bucketName]
```

```bash
laf fn publish FUNCTION_NAME
下载 bucket 文件到本地。
```
laf storage pull [outPath]
```

## 上传云存储文件
上传本地文件到 bucket 。
```
laf storage push [inPath]
```

将本地目录 `./dist/` 内的文件上传到 `www` Bucket 中:
## 访问策略

```bash
laf oss push ./dist/ www
查看所有访问策略。
```
laf policy list
```

## 下载云存储文件
拉取访问策略到本地,参数 policyName 是可选,不填代表拉取全部。
```
laf policy pull [policyName]
```

下载云存储 bucket 内的文件到本地:
推送访问策略到 web,参数 policyName 是可选,不填代表推送全部。
```
laf policy push [policyName]
```

```bash
laf oss pull www ./dist/
## 网站托管
查看托管列表。
```
laf website list
```

开启网站托管,此命令是开启 [bucketName] 的网站托管。
```
laf website create [bucketName]
```

## 其它说明
关闭网站托管,此命令是关闭 [bucketName] 的网站托管。
```
laf website del [bucketName]
```

1. laf cli 还不支持查看应用/云函数日志,正在开发中;
2. laf cli 版本不稳定,以上文档可能更新并不及时,可通过 `laf -h` `laf fn pull -h` 来查看具体说明;
3. laf cli 从 laf 0.8.5 开始支持,`system-server` 服务版本低于 0.8.5 不支持 laf cli;
自定义域名,此命令是为已开启网站托管的 [bucketName] 设置自定义域名。
```
laf website custom [bucketName] [domain]
```
zuoFeng59556 marked this conversation as resolved.
Show resolved Hide resolved
zuoFeng59556 marked this conversation as resolved.
Show resolved Hide resolved
106 changes: 106 additions & 0 deletions docs/guide/db/policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,109 @@ title: 访问策略

# {{ $frontmatter.title }}

前端可使用 [laf-client-sdk](https://github.com/labring/laf/tree/main/packages/client-sdk) “直连”数据库,无需与服务端对接口。

访问策略用来对客户端对数据库的操作进行安全控制,一个访问策略由多个集合的访问规则组成,每个集合可配置读写操作权限的访问规则。

开发者可以为应用创建多个访问策略,以供不同的客户端使用。

通常应用可创建两个访问策略:

- `app` 用于用户端客户端的访问策略,一般可以是 App、小程序、H5 等
- `admin` 用于应用的后台管理的访问策略

## 创建策略
首先我们切换到集合页面,按照下面步骤为 user 集合添加一个访问策略。
:::tip
如果你还没有 user 集合就先创建一个。
:::

![](../../doc-images/creat-polocy.png)

![](../../doc-images/add-polocy.png)

做完这两步之后,我们就成功的创建了一个访问策略,并且把策略放在了 user 集合上。
这里我们解释一下规则内容:
```js
{
"read": true, // 查询权限
"count": true, // 计数权限
"update": false, // 修改权限
"remove": false, // 删除权限
"add": false // 新增权限
}
```
我们把值设为 true 则代表允许,false 则为不允许,按照我们刚刚默认的规则,前端可以直接对我们的集合进行`查询`和`计数`操作,而增 删 改,是不允许的。
这里还有另外一个值得留意的地方,就是"入口地址" 刚刚我们设置的策略名称为 app ,那么入口地址就是 /proxy/app ,接下来演示一下如何使用。

## 前端 “直连”
在演示之前我们先往 user 集合中加一点数据。

![](../../doc-images/polocy-db-data.png)

我们来到前端项目,这里使用 Vue 项目来演示,其他项目同理。
### 首先安装 SDK :
```bash
npm i laf-client-sdk
```

### 然后创建 cloud 对像
这里注意了,我们多填写一个参数 dbProxyUrl ,那么它的值就是我们刚刚强调的入口地址“/proxy/app”
```js
import { Cloud } from "laf-client-sdk";

const cloud = new Cloud({
baseUrl: "https:/<APP_ID>.laf.dev", // <APP_ID> 在首页应用列表获取
getAccessToken: () => "", // 这里不需要授权,先填空
dbProxyUrl: "/proxy/app", // 这里就填写我们刚刚强调的“入口地址”
})
```
创建完 cloud 对像之后我们尝试一下在前端直接发起查询。
```js
async function get() {
const res = await cloud.database().collection("user").get();
console.log(res);
// {
// "data": [
// {
// "_id": "641d22292de2b789c963e5fd",
// "name": "jack"
// },
// {
// "_id": "641e87d52c9ce609db4d6047",
// "name": "rose"
// }
// ],
// "ok": true
// }
}
```
现在我们来试试 count。

```js
async function get() {
const res = await cloud.database().collection("user").count();
console.log(res);
// {
// "total": 2,
// "ok": true
// }
}
```
可以看到,简单的查询计数我们已经不需要写云函数,直接在前端即可实现,如果你想体验 `增删改` 可以修改对应策略的权限为 true ,但这是一个很危险的行为。

## 实践建议

初识访问规则,可能会觉其烦琐难以掌握,而且容易写错,或是对其安全性不自信、自知,所以根据我们在大量项目中的实践经验,给出一些建议:

- 最小权限原则,即只给客户端必要的访问权限,只开放给客户端必要的集合;

- 即便只开放 `read` 权限,也可能节省 30%~ 50% 的后端接口;
- 再配合一些基本的 `condition` 判断,可有效减少 70%~ 90% 的后端接口;

- 事务性的数据操作、复杂的表单提交,建议使用云函数实现:

- 云函数与客户端 SDK 接口一致,简单、轻量、快捷,无二次学习成本,调试更容易、无部署负担
- 云函数中访问数据库,无需编写访问规则,因为云函数是服务端执行的可信代码

- 访问规则虽然也可以完成很多复杂的验证,但是除非你非常熟练的掌握了它,否则建议用云函数来实现这部分逻辑
zuoFeng59556 marked this conversation as resolved.
Show resolved Hide resolved
Loading