为什么选择Frappe框架?

Frappe 的诞生是为了驱动我们的旗舰产品 ERPNext
Frappe 的核心理念是尽可能少写代码。我们更倾向于
配置而非代码。如果一个功能是通用的并且我们需要它,我们就会把它直接
集成到框架中。

这使得我们能够用一个小型开发团队构建并维护像 ERP 这样
拥有数千个功能的复杂应用。

快速应用开发

搭建好 Frappe 框架后,你可以迅速进入高效工作状态。创建
模型、编写控制器代码以及更新视图,这些都由框架
自动处理。

功能齐全,开箱即用

现代 Web 应用可能需要的一切,框架中很可能
已经内置了。PDF 生成、邮件、短信、网页……
应有尽有。如果 Frappe 框架中缺少了什么,我们可能
现在就已经在开发它了 :)

易于部署

Bench 是管理 Frappe 所有事务的一体化工具。它负责应用
更新、数据库迁移、生成 nginx 和 supervisor 的配置、
搭建新应用以及更多功能。

多租户支持

Bench 原生支持多租户。这意味着你可以在同一套代码基础上
启动多个应用实例,并各自使用独立的数据库。它还支持
基于端口的多租户模式,你可以为不同版本的应用
设置多个 bench 环境。

可扩展架构

通过创建你自己的应用,可以在 Frappe 之上构建强大的扩展。应用可以
自带模型,也可以修改 Frappe 中现有的模型。

什么是Frappe框架?

Frappe 是一个用 Python 和 Javascript 编写的全栈式 Web 框架,功能全面,开箱即用。

它是驱动 ERPNext 的底层框架。该框架非常通用,可用于构建数据库驱动的应用程序。

元数据驱动

在 Frappe 中,元数据是一等公民。它用于生成数据库表、设计表单以及配置许多功能。元数据存储在一个称为 DocType 的模型中。

我们以名为 ToDo 的 DocType 为例。它将包含诸如 statusdatedescription 之类的字段。

以下是 todo.json 可能的样子:

{
 "name": "ToDo",
 "module": "Desk",
 "field_order": [
  "status",
  "date",
  "description"
 ],
 "fields": [
  {
   "default": "Open",
   "fieldname": "status",
   "fieldtype": "Select",
   "in_global_search": 1,
   "in_list_view": 1,
   "in_standard_filter": 1,
   "label": "Status",
   "options": "Open
Closed"
  },
  {
   "fieldname": "date",
   "fieldtype": "Date",
   "in_standard_filter": 1,
   "label": "Due Date"
  },
  {
   "fieldname": "description",
   "fieldtype": "Text Editor",
   "in_global_search": 1,
   "label": "Description",
   "reqd": 1
  }
 ]
}

这样的配置将生成一个数据库表,其表结构可能如下所示:

MariaDB [_baa0f26509a564b6]> desc tabToDo;
+-----------------------+--------------+------+-----+---------+-------+
| Field                 | Type         | Null | Key | Default | Extra |
+-----------------------+--------------+------+-----+---------+-------+
| name                  | varchar(140) | NO   | PRI | NULL    |       |
| creation              | datetime(6)  | YES  |     | NULL    |       |
| modified              | datetime(6)  | YES  | MUL | NULL    |       |
| modified_by           | varchar(140) | YES  |     | NULL    |       |
| owner                 | varchar(140) | YES  |     | NULL    |       |
| docstatus             | int(1)       | NO   |     | 0       |       |
| idx                   | int(8)       | NO   |     | 0       |       |
| status                | varchar(140) | YES  |     | Open    |       |
| description           | longtext     | YES  |     | NULL    |       |
| date                  | date         | YES  |     | NULL    |       |
+-----------------------+--------------+------+-----+---------+-------+

丰富的管理界面

Frappe 不仅管理后端,还附带了一个功能丰富的管理界面,称为 Desk。当您在 Frappe 中创建 DocType 时,系统会为其生成多个视图。以下是其中一些视图:

列表视图支持分页、筛选、排序和批量编辑记录。

列表视图

用于编辑记录的表单视图还支持文件附件、PDF 格式、评论、电子邮件等功能。

表单视图

报表生成器支持添加列、分组、筛选、排序,并将其保存为配置。

报表生成器

用户、角色和权限

Frappe 内置了用户和角色管理功能。用户是指可以登录系统并执行授权操作(如创建、更新或删除记录)的人。角色是对 DocType 及其允许执行的操作的映射。

Python、JS 和 MariaDB

Frappe 框架使用 Python 作为后端。它附带了一个简单而强大的 ORM,作为对 CRUD 操作的抽象。默认数据库是 MariaDB。Postgres 支持目前处于测试阶段。

doc = frappe.new_doc('ToDo')
doc.description = 'Buy Eggs'
doc.insert()

前端是使用 Javascript(jQuery)构建的单页应用程序(SPA)。

实时功能

Frappe 还支持使用 NodeJS 和 socketio 实现实时发布/订阅事件。

# server
frappe.publish_realtime('update_progress', {
    'progress': 42,
    'total': 100
})

# client
frappe.realtime.on('update_progress', (data) => {
    console.log(data)
});

后台任务

Frappe 还支持基于 Python RQ 的后台任务队列。

frappe.enqueue('frappe.job.run_job', arg1='Test', arg2='Test2')

电子邮件

Frappe 支持发送和接收电子邮件,这些邮件也可以关联到单个文档。

打印

Frappe 支持基于 Jinja 模板生成 PDF 打印格式。它还附带了一个拖放式的打印格式生成器。

打印预览

打印格式生成器

功能全面,开箱即用

Frappe 拥有构建现代复杂应用所必需的众多功能。这里仅介绍了基本功能。本指南的其余部分将更详细地介绍这些功能以及其他高级功能,请务必通读全文。