Frappe开发图书管理系统Ⅰ(入门)
Frappe开发图书管理系统Ⅰ
注意
1、 确保使用系统安装账号
2、 切换到系统安装目录
一、启动系统(开发模式和生产模式)
这里选择用开发模式开发
- 开发模式
开发模式通过命令bench set-config developer_mode 1设置
默认监听8000端口
没有用到Nginx反向代理,是用ip加端口访问的
自动侦测代码文件变更,变更自动生效
实时重新加载自动生效
用bench start 命令启动,日志在命令窗实时显示 - 生产模式
通过bench setup production user设置
通过Nginx反向代理
通过supervisor管理进程
启动命令(默认系统自启)sudo supervisorctl start all
重启命令 sudo supervisorctl restart all
运行日志在logs目录
二、创建app library_management
bench new-app library\_management
- 基础信息
- 应用程序目录结构
- **library_management:**此目录将包含应用程序的所有源代码
public:存储在生产环境中由 Nginx 提供的静态文件
模板:用于呈现 Web 视图的 Jinja 模板
www:根据目录路径提供的网页
library_management:使用应用程序引导的默认模块
**modules.txt:**应用程序中定义的模块列表
patches.txt:数据库迁移的补丁条目
hooks.py:用于扩展或拦截框架提供的标准功能的钩子
**pyproject.toml:**指定您的应用程序如何构建,您可以选择在此处添加第三方 Python 依赖项,这些依赖项将在您的应用程序安装时安装。
- **library_management:**此目录将包含应用程序的所有源代码
三、 创建新站点
bench new-site library.[localhost](http://localhost/)01
- 创建基础信息,密码为zhuxing0707
- 此命令将创建一个新的数据库,因此您需要输入 MySQL 根密码。它还会要求设置管理员用户的密码,只需设置一个您不会忘记的密码即可。这以后会很有用。现在,您将library.localhost在sites目录中拥有一个名为的新文件夹。
- 站点目录结构
该indexes文件夹具有通过网站搜索生成的索引。
该locks文件夹维护站点内文档的基于文件的锁定以及站点本身状态的指示器。
如您所见,该private文件夹将包含所有数据库备份和私人文件。私人文件是用户上传的文件,需要经过身份验证才能访问。
该public文件夹将包含无需身份验证即可访问的文件。这可能包含无需登录即可访问的网站图像。
该site_config.json文件包含特定于此站点的配置,不应进行版本控制。这类似于环境变量文件。如果您查看文件的内容,它包含此站点的数据库配置值。
四、 通过浏览器访问网站
bench --site library.[localhost](http://localhost/)01 add-to-hosts
访问成功
五、 把我们创建的app安装到我们创建的站点
bench --site library.[localhost](http://localhost/)01 install-app library\_management bench --site library.[localhost](http://localhost/) install-app library\_management
安装
要检查某个站点安装了的app,可以使用 “bench --site {sitename} list-apps”
bench --site library.[localhost](http://localhost/)01 list-apps
六、 登录
用户名:administrator 密码:zhuxing0707(创建站点时在数据库里设置的密码)
- 设置账号信息,这是一个一次性安装向导,用于设置您网站的本地化详细信息。继续,选择您的语言,然后完成向导
- 登录成功
七、 站点命令
1、Python控制台
bench --site library.[localhost](http://localhost/)01 console
2、MariaDB控制台
bench --site library.[localhost](http://localhost/) mariadb
3、数据库备份
bench --site library.[localhost](http://localhost/)01 backup
4、我们可以通过运行以下命令查看所有站点命令的列表
bench --help
Options:
- --version
- --use-feature TEXT
- -v, --verbose
- --help Show this message and exit.
Commands:
- app-cache 查看或移除属于工具箱的项目...
- backup-all-sites 备份当前工具箱中的所有站点
- config 更改工具箱配置
- disable-production 禁用工具箱的生产环境。
- download-translations 下载最新的翻译
- drop 删除
- exclude-app 在更新中排除应用
- find 递归查找位置中的工具箱
- get 从互联网或文件系统克隆应用...
- get-app 从互联网或文件系统克隆应用...
- include-app 在更新中包含应用
- init 初始化新的工具箱实例在...
- install 安装设置所需的系统依赖
- migrate-env 将虚拟环境迁移到所需的 Python...
- new-app 在应用文件夹下创建新的 Frappe 应用
- pip 要获取 pip 帮助,请使用 bench pip help [COMMAND] 或...
- remote-reset-url 重置应用的远程 URL 为 Frappe 官方
- remote-set-url 设置应用的远程 URL
- remote-urls 显示应用的远程 URL
- remove 完全从工具箱中移除应用并重新构建...
- remove-app 完全从工具箱中移除应用并重新构建...
- renew-lets-encrypt 设置最新的 cron 并续订 Let's Encrypt...
- restart 重启 supervisor 进程或 systemd 单元
- retry-upgrade 重试失败的升级
- rm 完全从工具箱中移除应用并重新构建...
- set-mariadb-host 设置工具箱的 MariaDB 主机
- set-nginx-port 设置站点的 NGINX 端口
- set-redis-cache-host 设置工具箱的 Redis 缓存主机
- set-redis-queue-host 设置工具箱的 Redis 队列主机
- set-redis-socketio-host 设置工具箱的 Redis socketio 主机
- set-ssl-certificate 设置站点的 SSL 证书路径
- set-ssl-key 设置站点的 SSL 证书私钥路径
- set-url-root 设置站点的 URL 根目录
- setup 设置命令组以启用设置工具...
- src 打印工具箱源文件夹路径,可以是...
- start 启动 Frappe 开发进程
- switch-to-branch 切换所有应用到指定分支,或...
- switch-to-develop 切换 Frappe 和 ERPNext 到开发分支
- update 对当前工具箱执行更新操作。
- validate-dependencies 验证在要求中指定的所有依赖项
Framework commands:
- add-database-index 添加一个新的数据库索引并创建一个属性...
- add-system-manager 向站点添加新的系统管理器
- add-to-email-queue 将电子邮件添加到电子邮件队列
- add-to-hosts 将站点添加到 hosts 文件
- add-user 向站点添加用户
- backup 备份
- browse 在网页浏览器中打开站点
- build 编译 JS 和 CSS 源文件
- build-message-files 构建用于翻译的消息文件
- build-search-index 重建用于全局搜索的搜索索引。
- bulk-rename 通过 CSV 文件重命名多个记录
- bypass-patch 永久绕过补丁而不是...
- clear-cache 清除缓存、文档类型缓存和默认值
- clear-log-table 如果任何日志类型表增长过大,则...
- clear-website-cache 清除网站缓存
- compile-po-to-mo 翻译:将 PO 文件编译为 MO 文件
- console 启动 Python 控制台为站点
- create-patch 交互式创建新的补丁
- create-po-file 翻译:为某个语言环境创建新的 PO 文件
- create-rq-users 创建 Redis 队列用户并添加到 ACL 和...
- data-import 从 CSV 或 XLSX 文件批量导入文档...
- db-console 进入给定站点的数据库控制台
- describe-database-table 描述表的各种统计信息。
- destroy-all-sessions 清除所有用户的会话(使他们注销)
- disable-scheduler 禁用调度器
- disable-user 禁用站点上的用户账户。
- doctor 获取有关后台工作者的诊断信息
- drop-site 从数据库和文件系统中移除站点。
- enable-scheduler 启用调度器
- execute 执行一个函数
- export-csv 导出带数据的导入模板到 CSV
- export-doc 将单个文档导出为 CSV
- export-fixtures 导出固定数据
- export-json 将文档列表导出为 JSON 到指定路径,...
- generate-pot-file 翻译:生成 POT 文件
- get-untranslated 获取语言中未翻译的字符串
- import-doc 导入(插入/更新)文档列表。
- import-translations 更新翻译字符串
- install-app 将新应用安装到站点,支持...
- jupyter 启动一个交互式 Jupyter Notebook
- list-apps 列出站点中的应用程序。
- list-sites 列出当前工具箱中的所有站点
- make-app 创建一个模板应用
- mariadb 进入给定站点的 MariaDB 控制台。
- migrate 运行补丁,同步模式并重建...
- migrate-csv-to-po 翻译:从 CSV 文件(旧)迁移到 PO 文件
- migrate-to 将站点迁移到指定的提供者
- migrate-translations 迁移目标应用特定的翻译...
- new-language 为给定应用创建 lang-code.csv
- new-site 创建一个新站点
- ngrok 启动到本地的 ngrok 隧道...
- partial-restore 请参考 https://frappeframework.com/docs
- postgres 进入给定站点的 PostgreSQL 控制台。
- publish-realtime 从工具箱发布实时事件
- purge-jobs 清除任何待处理的定期任务,如果事件...
- ready-for-migration 请参考 https://frappeframework.com/docs
- rebuild-global-search 在当前站点设置帮助表...
- reinstall 重新安装站点即。
- reload-doc 重新加载文档类型的模式
- reload-doctype 重新加载文档类型的模式
- remove-from-installed-apps 从站点的已安装应用列表中移除应用
- request 作为管理员运行请求
- reset-perms 重置所有文档类型的权限
- restore 从 SQL 文件恢复站点数据库
- run-parallel-tests 请参考 https://frappeframework.com/docs
- run-patch 运行特定的补丁
- run-tests 运行 Python 单元测试
- run-ui-tests 运行 UI 测试
- schedule 启动调度器进程
- scheduler 控制调度器状态。
- serve 启动开发 Web 服务器
- set-admin-password 为站点设置管理员密码
- set-config 在 site_config.json 中插入/更新值
- set-last-active-for-user 将用户的最后活动日期设置为当前日期时间
- set-maintenance-mode 将站点置于维护模式以进行升级。
- set-password 为站点上的用户设置密码
- show-config 打印配置文件到 STDOUT 以...
- show-pending-jobs 获取有关后台作业的诊断信息
- start-recording 启动 Frappe 记录器。
- stop-recording 停止 Frappe 记录器。
- transform-database 通过更改表的内部设置来改变...
- trigger-scheduler-event 触发调度器事件
- trim-database 移除已删除文档类型的数据库表。
- trim-tables 从表中移除字段已删除的列。
- uninstall-app 从站点中移除应用及其链接模块
- update-po-files 翻译:将 PO 文件与 POT 文件同步。
- update-translations 更新翻译字符串
- use 设置默认站点
- version 显示所有已安装应用的版本。
- watch 监视并编译 JS 和 CSS 文件
- worker 启动后台工作者
- worker-pool 启动后台工作者池
八、 Doctype
DocType 类似于其他框架中的 Model。除了定义属性之外,它还定义 Model 的行为。
解释:DocType 不仅仅像其他框架中的 Model 只是定义数据结构和属性(即数据库中的表和字段),它还通过配置和代码,定义了这个 Model 在系统中的行为和功能
1、属性定义:
- DocType 和传统的 Model 一样,定义了对象的属性。例如,用户对象可能有姓名、邮箱、密码等属性,这些属性对应数据库表中的字段。
2、行为定义:
- 除了属性,DocType 还定义了这个对象的各种行为和功能。例如:
验证逻辑:在保存数据之前进行某些校验,确保数据符合特定规则。
触发器:在创建、修改或删除对象时,可以触发某些操作(例如发送通知、更新其他记录)。
权限控制:可以通过 DocType 定义谁有权访问或修改某个对象。
链接关系:定义对象之间的关系,比如关联到其他 DocType 的外键关系。
工作流:可以为 DocType 配置自定义的工作流,让数据根据特定的状态进行流转。
理解:DocType对比传统的MVC,更像是M和C的结合(定义数据的属性和结构,加上数据的验证和处理逻辑,再者定义行为,如触发器和权限控制)
九、 创建Doctype
Ⅰ、启用开发者模式
- 在创建 DocType 之前,我们需要在工作台上启用开发者模式。这将在我们创建 doctype 时启用样板创建,并且我们可以使用我们的应用将它们跟踪到版本控制中
- 转到终端并退出工作台服务器(如果它已在运行)frappe-bench,然后从目录中运行以下命令:
bench set-config -g developer_mode true ; bench start
Ⅱ、创建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)
十、 我们已经创建了Article的Doctype,新增一个Article
在创建新Article之前,我们需要清除 Desk 缓存。在新建的Doctype页面单击导航栏右侧的**“...”下拉菜单,然后单击“重新加载”**
1、单击去往Article List,然后Add Article
2、 我们可以看到创建时要输入的字段内容被我们刚才定义的字段类型限制
3、 接着我们输入一点内容,定义一本新的Article
4、 返回Article就可以看到我们刚刚创建的文章记录
十一、 我们创建名为Article的DocType时,ORM模型自动生成了数据库数据
- 我们可以通过MariaDB 控制台检查来确认这一点(7.2)
bench --site library.localhost mariadb; desc tabArticle;
我们在标题大小写中指定的字段被自动转换为蛇形大小写,并用作表中的列名。例如,article_name,image,author和description。
但是,还创建了许多其他字段,例如name, creation, modified, modified_by这些是为所有文档类型创建的标准字段。name是主键列。
十二、现在我们尝试用表单创建一个Library File的DocType
[https://www.bilibili.com/video/BV1xtynYnErU/](https://www.bilibili.com/video/BV1xtynYnErU/)
- 通过可视化创建,效果是一样的
- 通过MariaDB控制台,我们查看是否创建了Library File的tables,发现成功创建
- 我们查询tabLibrary File表单
SELECT * FROM tabLibrary File;【注意:当我们创建了一个新表表名中含有空格时,SQL查询时需要将带有空格的表名用反引号(`)】
可以看到我们刚才创建的Library File的字段名和我们后续新增的字段内容
- 我们查询tabArticle表单
可以看到tableArticle这个table中没有空格,所以查询时加不加反引号都行
查询成功
十三、查看新建的目录和已经创建的许多文件
DocType 描述了模型的很多内容。它不仅定义了表和列的名称,还定义了模型在 Desk 中各种视图中的呈现方式
如果查看应用程序中的更改,应该会发现已创建了许多文件
**article.json** - 定义 doctype 属性的 JSON 文件
**article.js** - 表单视图的客户端控制器
**article.py** ——Article 的 Python 控制器
**test\_article.py** - 用于编写测试的 Python 单元测试样板
十四、 DocType功能介绍
自定义其他功能
1、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;
成功
2、 表单布局
Ⅰ、我们自定义字段在表单中的布局,同时充分利用可用空间。转到 Article doctype,进入Settings,往下滚动到 Fields 部分,然后添加两个新字段,类型为**Column Break**(分栏符)和**Section Break**(分节符),并且通过这两个字段如图调节布局。我们还将隐藏 Image 字段,因为它不需要显示在表单中
我们可以对比前后(Column Break:分栏符 Section Break:分节符) 理解:Column Break把Author和ISBN作为一组,Status和Publisher作为一组,分成两栏。 Section Break又把上面的作为一组和Description作为一组分成两组
Ⅱ、转到文章文档类型并向下滚动到表单设置部分。在图像字段中输入图像。这将在表单的左上角显示图像。您还可以在 Naming 栏中启用Allow Rename允许重命名以允许重命名文档 理解:在Image Field里写入Image,是因为我们在创建DocType时有创建Image字段,这相当于是引用Image字段,并且我们在前面对Image字段做了隐藏,不会重复出现
成功
3、 权限
我们可以配置要允许的角色以及要限制 DocType 的操作。转到 Article doctype,切换到Permission 部分,然后添加角色。我们还可以配置特定角色允许的操作类型。让我们添加一个具有所有操作权限的图书管理员角色和一个具有读取操作权限的图书馆成员角色
我们可以通过创建具有图书管理员角色的新用户和具有图书馆成员角色的另一个用户来测试这一点。使用每个用户登录,并查看允许哪些操作。
十五、控制器方法
Ⅰ、创建第二个Doctype:Library Member
First Name (Data, Mandatory)
Last Name (Data)
Full Name (Data, Read Only)
Email Address (Data)
Phone (Data)
Ⅱ、 创建新的Library Member成员
创建文档类型后,转到库成员列表,从**设置>重新加载**清除缓存,然后创建新的库成员。
如果您注意到,表单中未显示全名字段。这是因为我们将其设置为只读。只有当它有某个值时才会显示
我们在Naming节Auto Name里引用Fields里的Full Name,避免在Library Member列表里出现哈希码,同时检验我们后面创建的Full Name拼接控制器是否生效
Ⅲ、 设置Full Name 逻辑
设置好后确保服务器端脚本已启用bench set-config -g server\_script\_enabled true,然后重新启动bench
打开代码编辑器并打开文件library\_member.py并进行以下更改
让我们在 Python 控制器类中编写代码,以便根据名字和姓氏自动计算全名:
\`class LibraryMember(Document):
def before\_save(self):
self.full\_name = f'{self.first\_name} {self.last\_name or ""}'\`
成功
before\_save我们在每次保存文档时运行的方法中编写了逻辑。这是该类提供的众多钩子之一。我们可以在[Controller](https://frappeframework.com/docs/v14/user/en/basics/doctypes/controllers)Document文档中了解有关所有可用钩子的更多信息。