Frappe开发图书管理系统Ⅱ(入门)

Author Avatar
ZhuXing
发表:2024-11-27 09:43:00
修改:2024-11-27 12:43:51

Frappe开发图书管理系统Ⅱ

16、 DocType的类型

理解框架中不同类型的文档类型

1、 创建一个新的DocType Library Membership(会员资格)

它将启用**“Is Submittable”**。它将命名设置为 **“LMS.#####”(缩写)\*\*并限制为**图书管理员\*\*角色。此外,在“查看设置”部分中,标题字段应设置为full\_name。

	**library\_transaction.py**

Ⅰ、字段创建

	Library Member (Link, Mandatory)

		在选项里填入Library Member,并且保存后下一步里的Full Name才能正确找到Library Member表单

	Full Name (Data, Read Only)   关键:全名字段是只读字段,将自动从链接记录**图书馆成员**中的字段中**提取**。Library Member (library\_member)

链接字段图书馆成员类似于其他框架中的外键列。它允许您将值链接到另一个 DocType 中的记录。在本例中,它链接到图书馆成员 DocType 的记录。

  1. Full Name (Data)
  2. From Date (Date)
  3. To Date (Date)
  4. Paid (Check)
    Ⅱ、DocTypes的链接(重要)
    理解:
    1. 关联的 DocTypes 是指在其他 DocTypes 中作为 Link 字段(一定要设置为Link字段)关联的 DocTypes。所有的 DocTypes 都可以进行关联。我们可以根据它们存储的数据类型,将 DocTypes 大致分为主数据和事务性数据。‘Article’(文章)、‘Library Member’(图书馆会员)是主数据的例子,因为它们表示的是一个实体(有形的或虚拟的)。‘Library Membership’(图书馆会员资格)是存储事务性数据的 Doctype 的例子。
    2. 这时我们设置‘Library Membership’(图书馆会员资格)表单的Full Name字段时,通过Fetch From(找到表单),链接到‘Library Member’(图书馆会员)表单。然后选择‘Library Member’(图书馆会员)表单的Full Name(Data)字段
    3. 比如说我们现在有了一个叫Freight Booking的Doctype,我们现在要在Arrival Notification里引用这个字段,我们需要在Arrival Notification里新建一个字段名,用来引入Freight Booking

      现在在下一个Loading Port字段里我要引用Freight Booking这个Doctype中的Loading Port,可以看到能自动带出

      Ⅲ、可提交的DocTypes
      当在文档类型中启用“Is Submittable”时,它将成为可提交的文档类型。可提交的文档类型可以有 3 种状态:草稿、已提交和 已取消。处于草稿状态的文档可以像任何文档一样进行更改,但是一旦处于已提交状态,文档中任何字段的值都无法更改。已提交的文档可以被取消,这会使文档无效。如果您注意到,我们的图书馆会员文档类型中添加了一个额外的字段,称为“Amended From” (我们本来只创建了5个字段)。此字段用于跟踪文档中的修订。一旦文档被取消,就只能进行修订,这意味着它可以被复制,并且已取消的文档将通过修订自字段链接到新的修订文档。


      Ⅳ、编写Controller确保会员资格( Library Membership)
      我们在方法中编写了逻辑,before_submit该方法将在提交文档之前运行。我们使用该frappe.db.exists方法通过提供的过滤器检查是否存在图书馆会员记录。如果存在,我们将 frappe.throw停止程序的执行,并显示一条消息,让用户知道原因

      Ⅴ、新增Library Membership记录前的一个更正(优化)
      我们在新增Library Membership记录时,因为我们把Library Member的Full Name字段链接到了Library Membership的Full Name字段,而我们这时候要选择一个Library Member来作为新增的Library Membership的辨识,但是在Library Member里我们没有设置某个字段作为Auto Name,Library Member的ID就会为哈希码

      这时我们在Library Member的设置里,选择通过字段名作为规则,把Phone字段填入Auto Name里作为引用,达到辨识的效果

      保存成功后,我们reload再去到Library Member List,新增两个Library Member,这样我们在添加Library Membership信息时就方便许多不用再来到Library Member查看信息。

      成功

      Ⅵ、新增Library Membership记录
      我们先赋予Phone为158....的用户从10月1日到12月31日的会员资格

      这时候我们在16-Ⅲ中设置的“Is Submittable”会起作用,右上角会有save---submit的过程,我们直接save和submit
      我们赋予了Phone为158....的用户会员资格后,他的记录在Library Membership List状态会变成已提交,我们再次点进去这条记录会发现起始日和结束日都不可更改了


      我们在方法中编写了逻辑,before_submit该方法将在提交文档之前运行。我们使用该frappe.db.exists方法通过提供的过滤器检查是否存在图书馆会员记录。如果存在,我们将 frappe.throw停止程序的执行,并显示一条消息,让用户知道原因。现在,尝试赋予用户具有重叠期限的图书馆会员资格,提交文档时会看到错误。
      我们赋予Phone为158....的用户10月15日到11月15日的会员资格,验证逻辑

      点击save---submit后会显示这名用户已经有会员资格了,验证成功

      创建一个新的DocType Library Transaction(图书馆业务)
      创建一个 DocType 来记录具有有效会员资格的图书馆成员借走或归还的图书
      Ⅰ、字段创建
      该文档类型将被称为图书馆交易,并将具有以下字段:
      Article 、Library Member、Date为必填字段; 这个DocType设置为Is submittable; Auto name 设置为LT.#####
      Article - Link to Article
      Library Member - Link to Library Member
      Type - Select with 2 options: Issue and Return
      Date - Date of Transaction
      Ⅱ、编写交易认证控制器
      当发布文章时,我们应该验证图书馆会员是否具有有效会员资格。我们还应该检查文章是否可以发布。我们编写这些验证的代码
      library_transaction.py

      我们验证逻辑:
      首先新增一本书

      记得书的状态设置为Available
      新增一条记录Phone为158...的用户在10/23借走了一本书,save---submit

      理解:通过这个业务模块把Article的Type字段修改成Issue,并且绑定某个用户
      在这本书被借走的前提下,我们尝试用另一个Phone为191....的用户再借走这本书

      这时我们发现这名Phone为191....的用户并没有会员资格,验证会员资格功能生效

      我们在赋予这名用户会员资格后,他再尝试借走这本书显示这本书已经被别人借走了,验证验证借出操作功能生效

      我们在这本书归还后,再次尝试归还。提示文章在未被借出之前不能被归还,验证归还操作功能生效

创建一个新的DocType Library Settings (图书馆设置)

设定图书借走的天数以及每个用户最多可以借多少本书

Ⅰ、字段创建

	由于我们不需要为这些设置设置多个记录,因此我们将 为该文档类型启用“Is Single”

	单一类型只有一条记录,没有Library Settings List,没有关联表。值存储在 tabSingles 中

	Loan Period - Int (Will define the loan period in number of days)

	Maximum Number of Issued Articles -Int( Restrict the maximum number of articles that can be issued by a single member)

	当一个文档类型(DocType)启用了“单一(Is Single)”功能时,它就会变成一个单一文档类型(Single DocType)。单一文档类型类似于其他框架中的单例记录。它不会创建一个新的数据库表。相反,所有的单一值都被存储在一个名为tabSingles的单一表中。它通常用于存储全局设置。

	为Library Settings新增一条记录

Ⅱ、验证Library Settings的loan\_period调用

	我们对Library Membership(图书馆会员资格)进行修改,以便根据借阅期限(Loan Period)和起始日期(From Date)自动计算截止日期(To Date)

	我们用frappe.db.get\_single\_value方法去获得Library Settings这个DocType里的loan\_preiod字段,通过把这个字段加到开始日期来获得结束日期

Ⅲ、验证Library Settings的max\_articles调用

	我们对Library Transaction进行修改,来检测被借出的书是否达到了我们在Library Settings中设定的max\_articles的值

	定义了一个validate\_maximum\_limit方法,在验证最大借出限制时,我们还是用frappe.db.get\_single\_value去获得Library Settings这个DocType里的max\_articles字段。然后通过frappe.db.count统计,再比较

17、 表单脚本

表单脚本是增强表单用户体验的客户端 JavaScript 代码。

假设想为Library Member升级为会员资格。为此,需要访问图书馆会员列表(Library Membershiplist),创建一个新表单,选择会员及其他字段,然后保存。

同样,当您想为会员办理借书时,您必须在(Library Transactionlist)创建一个新的图书馆借书表单。

我们可以简化这个过程。在 library\_member.js 中编写以下代码:

这段代码的作用是通过add\_custom\_button去创建一个按钮,按钮名即是后面跟着的单引号内的信息。再通过frappe.new\_doc方法新建(Library Membership / Library Transaction),并且自动填充当前图书馆会员的名称

在保存好新的Library Member信息后,我们再次点击Create Membership和Create Transaction则会弹出以下方框

18、网页浏览页面

Web 视图页面是服务器为您的网站访问者呈现的页面

我们一直专门使用 Desk,这是系统用户(如管理员)可访问的管理界面。通常,希望向客户提供有限的访问权限。在我们的案例中,我们希望图书馆会员能够查看他们可以从我们的网站发布的可以借取的文章。Web View Pages 可以帮助我们实现这一点。

1.启用 Has Web View 和 Allow Guest to View

2.为Article添加Route和Posted字段

3.在Route字段输入articles

4.Is Published Field字段将帮助过滤掉那些不应该在网页视图中显示的文档

	我们现在已为 Article doctype 启用了 Web 视图。这意味着现在可以在网站上查看文章的详细信息,而无需登录 Desk。让我们通过创建新文章来测试这一点。应该会在表单左上角看到“在网站上查看” 。单击它即可查看文章的 Web 视图。
评论