理解Frappe基础知识


一、Frappe框架和bench工作台

​Bench 是用于管理 Frappe 应用程序和网站的命令行工具。

用Bench创建 frappe-bench 目录 

让我们用Bench创建包含我们的应用程序和网站的项目文件夹。运行以下命令:

bench init frappe-bench

这将创建一个以当前工作目录命名的目录frappe-bench。它将执行以下操作:

  1. env在目录下创建一个python虚拟环境。
  2. 获取并安装frappe应用程序作为 Python 包。
  3. 安装的节点模块frappe。
  4. 构建静态资产。
  • 总体目录结构

    • env :Python虚拟环境,一台机器多套系统独立并存,如开发、测试、生产,或13开发版,13正式版
            一套机器上允许装多套的erp系统,而且彼此独立。独立的原理是依据python的虚拟环境实现的,而且比如实际开发中要装多套系统,13、14,测试、开发等用来验证。

      • config:Redis和Nginx配置文件

        • logs:进程日志文件(web应用,工作进程)
          程序运行过程中出错了,出错过程中的内部变量的信息变化

          • sites:站点目录
            一个站点对应一个数据库,比如一个公司需要不同的系统,但是apps是共用的
            • assets: 生产环境Nginx管理的静态资源(js,html,css,图片)文件
            • apps.txt:已安装应用清单​
            • commonsiteconfig.json: 通用站点配置文件
          • apps: 应用目录
                       可以这样理解,我们开发的一个app首先要安装到python,变成一个包,可以调用(import)的包。这些包还是需要安装到具体站点的,有可能说一个系统里面有个十个app,一个站点只用了五个,另外 一个站点用了十个,这样是可行的。每个站点用了那些app,是需要单独安装激活一下的。 
          • Procfile: 开发模式进程清单
          •  

          二、apps和sites的概念

          1、apps的概念 

          ​​在 Frappe 中,App(应用程序) 是框架中的一个关键概念。App 是一个完整的软件包,它包含一组相关的模块、文档类型(DocType)、页面、脚本、报表等,用于实现某个特定的业务或功能。简单来说,App 是应用的顶层结构,是一系列功能模块的集合,它们共同构成一个功能完整的应用。​
          • Frappe App 的目录结构
            • 一个典型的 Frappe App 目录结构如下所示
          • myapp:主应用的名称目录,包含应用的代码和资源。
            • init.py:初始化文件,标志着这是一个 Python 包。
            • config/:配置文件夹,包含应用的一些全局设置。
            • modules.txt:列出应用中包含的模块(Module)。
            • **public/**:用于存放静态资源(如 JavaScript、CSS、图片等)。
            • templates/:存放 Jinja 模板文件,用于渲染页面。
            • www/:用于定义 Web 路由和页面。
            • patches.txt:记录数据库迁移的变更和升级路径。
          • hooks.py:Frappe 应用的钩子文件,用于注册各种事件(如表单提交、定时任务等)。
          • requirements.txt:定义应用依赖的 Python 库。
          • setup.py:应用的安装脚本,使用 Python 的 setuptools 进行打包和发布。
          • MANIFEST.in:用于定义在打包时需要包含的文件列表。
          • App、Module 与 DocType 的关系
            • App 是最高层次的封装,包含多个模块(Module),每个模块负责某个特定的业务领域。
            • Module 是 App 中的逻辑分组,每个模块下可能有多个 DocType(类似于数据库表的定义)。
            • DocType 是模块中的核心数据结构,定义了系统中的业务实体和表单视图。
          • Frappe App 的创建
            • 在 Frappe 中,创建一个新的应用程序非常简单。你可以通过命令行工具 bench 来创建应用:
              • bench new-app myapp
            • 这个命令会生成一个新的 Frappe 应用程序,包含标准的目录结构和文件。在创建完 App 后,你可以将它安装到某个 Frappe 站点中:
              • bench --site sitename install-app myapp
            • 这时,你的应用就会成为这个站点的一部分,并且可以在其中运行和使用。
          •  

          2、sites的概念 

          ​bench new-site (你的站点名)

            ​此命令将创建一个新的数据库,因此您需要输入 MySQL 根密码。它还会要求设置管理员用户的密码,只需设置一个您不会忘记的密码即可。这以后会很有用。现在,您将library.localhost在sites目录中拥有一个名为的新文件夹。

          ​bench允许您创建多个站点,并通过同一端口在浏览器中分别访问它们。这就是我们在 bench 中所说的多租户支持。

          三、DocType的创建、功能、类型

          ​ DocType 类似于其他框架中的 Model。除了定义属性之外,它还定义 Model 的行为。

          解释:DocType 不仅仅像其他框架中的 Model 只是定义数据结构和属性(即数据库中的表和字段),它还通过配置和代码,定义了这个 Model 在系统中的行为和功能 

          ​ 理解:DocType对比传统的MVC,更像是M和C的结合(定义数据的属性和结构,加上数据的验证和处理逻辑,再者定义行为,如触发器和权限控制) ​

          1、DocType的创建 


          • 1、启用开发者模式
            • 在创建 DocType 之前,我们需要在工作台上启用开发者模式。这将在我们创建 doctype 时启用样板创建,并且我们可以使用我们的应用将它们跟踪到版本控制中
            • 转到终端并退出工作台服务器(如果它已在运行)frappe-bench,然后从目录中运行以下命令:
              bench set-config -g developer_mode true ; bench start
          •  
          • 2、创建DocType导航到DocType列表。此列表将包括与框架捆绑在一起的 DocType、已安装的 Frappe 应用程序的一部分以及您可以为每个站点创建的自定义 DocType。
            • 1、我们创建一个Aricle的DocType列表,选择模块Library Management


            • 2、在Fiedls里创建八个字段,并且设置他们的数据类型
              • Article Name (Data, Mandatory)
              • Image (Attach Image)
              • Author (Data)
              • Description (Text Editor)
              • ISBN (Data)
              • Status (Select) - Enter two options: Issued and Available (Type Issued, hit enter, then type Available)
              • Publisher (Data)
          •  

          2、DocType的功能


          • DocType的命名
            • Ⅰ、在我们创建了一个DocType,并且新增了一个记录后。我们在这个DocType 的List里会发现这条记录Name的值是一个哈希值


            • Ⅱ、现在我们回到DocType里对Article这个DocType做一些设置,在Article页面的Setting里的Naming设置中,我们在Naming Rule里选择By fieldname(通过字段名),Auto Name字段里填入(field:article_name),现在我们创建一个新的Article时,Article的Article Name就不会被转为哈希值


            • Ⅲ、我们可以在数据库中检查是否生效
              select * from tabArticle;
              • 成功

          3、DocType的类型

          DocTypes的链接:
          • 1. 关联的 DocTypes 是指在其他 DocTypes 中作为 Link 字段关联的 DocTypes。所有的 DocTypes 都可以进行关联。我们可以根据它们存储的数据类型,将 DocTypes 大致分为主数据和事务性数据。‘Article’(文章)、‘Library Member’(图书馆会员)是主数据的例子,因为它们表示的是一个实体(有形的或虚拟的)。‘Library Membership’(图书馆会员资格)是存储事务性数据的 Doctype 的例子。
          • 2. 这时我们设置‘Library Membership’(图书馆会员资格)表单的Full Name字段时,通过Fetch From(找到表单),链接到‘Library Member’(图书馆会员)表单。然后选择‘Library Member’(图书馆会员)表单的Full Name(Data)字段

          四、控制器

          ​     设置好后确保服务器端脚本已启用bench set-config -g server_script_enabled true,然后重新启动bench

          ​​​  Controller 是一个普通的 Python 类,它从frappe.model.Document基类扩展而来。此基类是 DocType 的核心逻辑。它处理如何从数据库加载值、如何解析值并将其保存回数据库。


          五、表单脚本和网页浏览页面

          ​ 表单脚本是客户端 JavaScript 代码,可增强表单的用户体验 (UX)

          ​表单脚本可让您向表单添加客户端逻辑。您可以编写表单脚本来自动获取值、添加验证或向表单添加上下文操作。 还可以通过在系统中创建客户端脚本来编写表单脚本。如果逻辑特定于您的站点,则应该编写客户端脚本。如果您想跨站点共享表单脚本,则必须通过应用程序包含它们。

          理解Frappe基础知识
          谢坪川 2024年10月30日
          分析这篇文章

          存档
          登录 留下评论
          ERPNext业务流程---会计模块