All Projects → maslow → less-api

maslow / less-api

Licence: other
通过一套「访问控制规则」配置数据库访问,用一个 API 替代服务端 90% 的 APIs。

Programming Languages

typescript
32286 projects
javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to less-api

uni-load-refresh
uniapp 前端功能组件
Stars: ✭ 32 (-38.46%)
Mutual labels:  uniapp, uni-app
GroupbuyCoupon
涵盖外卖、话费、视频会员、加油卡、礼品卡等多种品类折扣权益,吃、喝、玩、乐、购五大消费场景覆盖的综合权益卡券小程序,用户折扣购、平台赚佣金,个人、企业流量变现平台。
Stars: ✭ 92 (+76.92%)
Mutual labels:  uniapp, unicloud
createName
基于uni-app+unicloud实现微信诗歌起名小程序-五格三才-周易起名-八字起名-宝宝起名-周易模块更新中
Stars: ✭ 154 (+196.15%)
Mutual labels:  uni-app, unicloud
uni-admin
基于 uni-app,uniCloud 的 admin 管理项目模板
Stars: ✭ 135 (+159.62%)
Mutual labels:  uni-app, unicloud
Thorui Uniapp
ThorUI组件库,轻量、简洁的移动端组件库。组件文档地址:https://thorui.cn/doc/ 。 最近更新时间:2021-10-01
Stars: ✭ 1,842 (+3442.31%)
Mutual labels:  uniapp, uni-app
Uni App
uni-app 是使用 Vue 语法开发小程序、H5、App的统一框架
Stars: ✭ 34,949 (+67109.62%)
Mutual labels:  uniapp, uni-app
hello-iui
⚙️ iui uniapp组件库演示示例【停止维护】
Stars: ✭ 20 (-61.54%)
Mutual labels:  uniapp, uni-app
Hello Uniapp
uni-app框架演示示例
Stars: ✭ 1,881 (+3517.31%)
Mutual labels:  uniapp, uni-app
app
专门为互联网人打造的题解神器,神器在手,工作不愁
Stars: ✭ 64 (+23.08%)
Mutual labels:  uniapp, unicloud
almost-components uniapp
uni-app 使用的多端组件集合,支持APP、H5、小程序
Stars: ✭ 37 (-28.85%)
Mutual labels:  uniapp, unicloud
mp-framework-benchmark
mp-framework-benchmark
Stars: ✭ 49 (-5.77%)
Mutual labels:  uniapp
uParse
📰适用于 uni-app/mpvue 的富文本解析自定义组件
Stars: ✭ 45 (-13.46%)
Mutual labels:  uni-app
uniapp-tailwind-uview-starter
利用uniapp+tailwindcss 3.x+uview 1.x+vue-cli搭建的一套基础模板,可以使用Webstorm或者vscode开发。集成miniprogram-ci自动部署
Stars: ✭ 73 (+40.38%)
Mutual labels:  uniapp
spa-custom-hooks
💯 Custom hook of business layer (asynchronous task notification solution), supporting various applets and Vue architectures (uni app, wepy, mpvue, etc.)
Stars: ✭ 307 (+490.38%)
Mutual labels:  uniapp
caoguo
golang,微信小程序,电商系统
Stars: ✭ 505 (+871.15%)
Mutual labels:  uniapp
mall-app
youlai-mall 微信小程序/H5/Android/iOS 移动应用端,uni-app终极跨平台前端框架。
Stars: ✭ 75 (+44.23%)
Mutual labels:  uni-app
uniapp-scaffold
基于Vue.js的跨平台小程序脚手架、设计语言、组件库及插拔式模板
Stars: ✭ 87 (+67.31%)
Mutual labels:  uni-app
leadshop
Leadshop是一款提供持续更新迭代服务的轻量级、高性能开源电商系统,前后端分离(uniapp +电商专用yii2.0),可视化DIY拖拽装修,旨在打造极致的用户体验! 支持微信小程序,公众号等
Stars: ✭ 168 (+223.08%)
Mutual labels:  uni-app
heytea
uniapp仿喜茶GO小程序前端模板(weapp + H5)(持续更新)
Stars: ✭ 202 (+288.46%)
Mutual labels:  uniapp
tcb-php-sdk
tencent cloud base sdk for php
Stars: ✭ 13 (-75%)
Mutual labels:  tcb

Deprecated Warning:

本仓库以及 less-api 将不再单独维护,less-api 现已升级合并到 laf 项目中,并更名为 database-proxy

介绍

`less-api` 是一个「超级API」,一个 API 替代服务端 90% 的传统 APIs。

通过一套「访问控制规则」配置数据库访问,让前端开发者“安全直连”数据库,再也不需要和服务端对接口了!

客户端使用 `less-api` 提供的 SDK,像在服务端操作数据库那样,在客户端直接读写相应的数据即可。

如果你了解微信小程序云开发,那么可以用 `less-api` 搭建自己的云开发。

`less-api` 可以让产品开发初期的时候, 投入极少(甚至0)服务端开发工作,随着业务的发展,
可以按需使用传统的 api 来部分代替,两者完全不冲突。

`less-api` 支持运行在自建服务器环境、腾讯云\阿里云云开发、unicloud、微信小程序云开发中。

在复杂架构的项目中, `less-api` 可以充当其中一个或多个微服务,承载部分数据操作请求。

谁适合使用 less-api ?

微信云开发用户

如果你喜欢微信云开发的极速开发体验,但又不想局限于微信平台,那么可以基于 less-api 搭建属于自己的云开发平台!

具体可了解 `less-framework` 和 `less-admin` (基于 less-api 实现的云开发框架和管理端)。

自建云开发,可以获取极速的云开发体验,同时没有技术选型时迁移平台的烦恼顾虑。

个人开发者、初创创业团队

无论你使用云开发还是自建服务器环境,在产品初期基于 `less-api` 可以极大减少服务端API的数量,
根据我们的实践经验,初期能节约 90% 的服务端API。

因此,在产品初期,团队可以专注于产品业务本身,快速推出最小可用产品(MVP),快速进行产品、市场验证。

随着业务的发展,可将部分复杂、性能、安全敏感的 API 用传统方式实现,`less-api` 继续承担一般的数据请求。

即便是应用重构,也可逐个替换原 `less-api` 负责的请求,重构过程不影响应用正常运行,持续发布的方式重构。

初心场景

最初 less-api 就是出于以下场景而设计的:

  • 用于快速开发 MVP,专注于客户端业务,极大程度减少服务端开发工作量
  • 自建属于自己的云开发环境,具体可了解 less-framework(基于 less-api 实现的云开发框架)

使用示例

    npm install less-api

服务端代码示例

const app = require('express')()
const { Proxy, MongoAccessor, Policy } = require('less-api')

app.use(express.json())

// design the access control policy rules
const rules = {
    categories: {
        "read": true,
        "update": "$admin == true",
        "add": "$admin == true",
        "remove": "$admin == true"
    }
}

// create an accessor
const accessor = new MongoAccessor('mydb', 'mongodb://localhost:27017', { directConnection: true })
accessor.init()

// create a policy
const policy = new Policy(accessor)
policy.load(rules)

// create an proxy
const proxy = new Proxy(accessor, policy)

app.post('/entry', async (req, res) => {
  const { role, uid } = parseToken(req.headers['authorization'])

  // parse params
  const params = proxy.parseParams(req.body)

  const injections = {
    $role: role,
    $userid: uid
  }

  // validate query
  const result = await proxy.validate(params, injections)
  if (result.errors) {
    return res.send({
      code: 1,
      error: result.errors
    })
  }

  // execute query
  const data = await proxy.execute(params)
  return res.send({
    code: 0,
    data
  })
})

app.listen(8080, () => console.log('listening on 8080'))

客户端使用

    npm install less-api-client
const cloud = require('less-api-client').init({
    entryUrl: 'http://localhost:8080/entry',
    getAccessToken: () => localStorage.getItem('access_token')
    environment: 'h5',
    // environment: 'uniapp', // uniapp
    // environment: 'wxmp'  // 微信小程序
})

const db = cloud.database()

// 查询文档
const cates = await db.collection('categories').get()

// 条件查询
const articles = await db.collection('articles')
    .where({status: 'published'})
    .orderBy({createdAt: 'asc'})
    .offset(0)
    .limit(20)
    .get()

// 更新
const updated = await db.collection('articles').doc('the-doc-id').update({
    title: 'new-title'
})

更多使用参考客户端使用文档

数据访问安全规则示例

简单示例 1:简单博客

{
    "categories": {
        "read": true,
        "update": "$admin === true",
        "add": "$admin === true",
        "remove": "$admin === true"
    },
    "articles": {
        "read": true,
        "update": "$admin === true",
        "add": "$admin === true",
        "remove": "$admin === true"
    }
}

简单示例 2:多用户博客

{
    "articles": {
        "read": true,
        "update": "$userid && $userid === query.createdBy",
        "add": "$userid && data.createdBy === $userid",
        "remove": "$userid === query.createBy || $admin === true"
    }
}

复杂示例 1: 数据验证

{
    "articles": {
        "add": {
            "condition": "$userid && data.createdBy === $userid"
        },
        "remove": "$userid === query.createBy || $admin === true",
        "$schema": {
            "title": {"length": [1, 64], "required": true},
            "content": {"length": [1, 4096]},
            "like": { "number": [0,], "default": 0}
        }
    }
}

复杂示例 2:更高级的数据验证

场景介绍: 用户之间站内消息表访问规则

{
    "messages": {
        "read": "$userid && ($userid === query.receiver || $userid === query.sender)",
        "update": {
            "condition": "$userid && $userid === query.receiver",
            "data": {
                "read": {"in": [true]}
            }
        },
        "add": {
            "condition": "$userid && $userid === data.sender",
             "data": {
                "read": {"in": [false]}
            }
        },
        "remove": false,
        "$schema": {
            "content": {"length": [1, 20480], "required": true},
            "receiver": {"exists": "/users/id"},
            "read": { "in": [true, false], "default": false }
        }
    }
}

运行测试

安装依赖

    npm i

单元测试

    npx mocha tests/units/*.test.js

数据库访问测试

Mongo

使用 Docker 启动个测试数据库,等待mongo 启动成功

    docker pull mongo
    docker run -p 27017:27017 --name mongotest -d mongo

执行测试用例

    npx mocha tests/mongo_db/*.test.js

停止&删除 Mongo 实例

    docker rm -f mongotest

MySQL

使用 Docker 启动个测试数据库,等待mongo 启动成功

    docker pull mysql
    docker run --name mysqltest -e MYSQL_ROOT_PASSWORD=kissme -e MYSQL_DATABASE=testdb -d -p 3306:3306 mysql

手动创建测试使用的数据表:

create table IF NOT EXISTS categories (
  id int not null auto_increment,
  name varchar(64) not null, 
  created_at int, 
  primary key(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

create table IF NOT EXISTS articles (
  id int not null auto_increment,
  title varchar(64) not null, 
  category_id int,
  content text,
  created_at int, 
  updated_at int,
  created_by int,
  primary key(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

执行测试用例

    npx mocha tests/mysql_db/*.test.js

停止&删除 Mongo 实例

    docker rm -f mysqltest

PostgreSQL

docker run --name pgdb -e POSTGRESQL_PASSWORD=kissme -e POSTGRESQL_DATABASE=testdb -p "5432:5432" -d  bitnami/postgresql

尚未支持 PostgreSQL。

执行所有测试用例

请确保已经运行 mongo 和 mysql 测试的实例;

npx mocha tests/**/*.test.js

TODO

  • 实现服务端应用内数据操作事件,可订阅相应事件,触发更多自定义的业务逻辑,如表冗余统计字段,或中间统计表的更新
  • 基于 Mongo 的change watch, 实现客户端可订阅数据变更通知,服务端通过 websocket 向客户端实时推送数据变更
  • 提供 Flutter (Dart) SDK (less-client-dart) [完成]
  • 支持 MySQL 等关系型数据库 [完成]
  • 支持 MySQL 联表查询(Join) [完成]
  • 支持 MongoDb 聚合
  • 支持 MongoDb 事务
  • 补充 schema 验证器的测试用例
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].