下面将说明TreeFrog
框架的重要组件——生成器tspawn
。
1.生成程序骨架
在我们开始编程之前,必须要做的事就是生成程序的骨架。下面的命令就是在当前工作目录下生成一个名为blogapp
的文件夹,并以此作为项目根目录生成程序的基本骨架。
$ tspawn new blogapp
所谓的基本框架,包括以下的这些目录:
controllers
:存放控制器类的代码models
:存放模型对象类的代码views
:存放视图类的代码helpers
:存放帮助器类的代码config
:存放.ini配置文件db
:存放数据库文件(主要针对SQLite
)lib
:存放将源代码编译后得到的库文件log
:存放日志文件plugin
:存放插件类的代码public
:存放静态资源文件(比如图片,css
,html
文件)script
:存放Javascript
脚本文件test
:存放测试专用的文件tmp
:存放临时文件(比如上传的临时文件,完成后即可转移删除)
当然还有根目录下的.pro
项目文件,它里面有着关于本程序最基本的配置信息。
2.生成手脚架scaffold
“手脚架”这个词十分形象生动,因为我们可以利用它很方便地完成对数据库的CRUD
(增删查改)操作,主要包括对应的控制器、模型、ORM框架
。首先我们要先在数据库创建好数据表,比如在Mysql
执行下面的命令:
> CREATE TABLE blog (id INTEGER PRIMARY KEY, title VARCHAR(20), body VARCHAR(200));
我们可以在database.ini
中配置我们的数据库,比如:
[dev]
driverType=QMYSQL
databaseName=blogdb
hostName=
port=
userName=root
password=root
connectOptions=
配置项 | 含义 | 备注 |
---|---|---|
driverType | 数据库驱动名称 | 有以下备选项: QDB2、QIBASE(Borland InterBase)、QMYSQL、QOCI(Oracle Call Interface)、QODBC、QPSQL(PostgreSQL)、QSQLITE |
databaseName | 数据库名称 | 如果是SQLite,则为存储文件的路径(如db/blogdb) |
hostName | 主机名 | 缺省为localhost |
port | 端口号 | 缺省为默认端口号 |
userName | 用户名 | |
password | 密码 | |
connectOptions | 数据库连接选项 | 详情可查阅QSqlDatabase::setConnectOptions() |
这样在项目根目录下执行下面的命令就可以生成脚手架了:
$ tspawn scaffold blog
3.数据表名和模型/控制器名称之间的关系
生成器生成的各种类名(脚手架)都是由对应的数据表名决定,规则如下:
数据表名 | 模型对象名 | 控制器名 | SqlObject(ORM对象)名 |
---|---|---|---|
blog_entry → | BlogEntry | BlogEntryController | BlogEntryObject |
4.tspawn命令的子命令
我们可以通过$ tspawn -h
命令来查看tspawn
支持哪些子命令:
$ tspawn -h
usage: tspawn <subcommand> [args]
Available subcommands:
new (n) <application-name>
scaffold (s) <model-name>
controller (c) <controller-name>
model (m) <table-name>
sqlobject (o) <table-name>
如果我们只想生成控制器、模型或者ORM
中的一种,可以把子命令scaffold
替换为controller
、model
或者sqlobject
。
5.CRUD
CRUD
是web程序的4个主要功能,分别对应着Create
(增)、Read
(查)、Update
(改)、Delete
(删),利用生成器生成的脚手架中各个函数有以下的对应关系:
控制器 | 模型 | ORM | SQL | |
---|---|---|---|---|
C | create | create() | create() | INSERT |
R | index,show | get(),getAll() | find() | SELECT |
U | save | save(),update() | update() | UPDATE |
D | remove | remove() | remove() | DELETE |
6.关于T_CONTROLLER_EXPORT宏定义
由生成器生成的控制器代码中一般会在类定义的开头加上一个奇怪的宏定义——T_CONTROLLER_EXPORT
,这到底是什么?
对于Windows
系统,所有控制器在编译时会集合成一个DLL
文件,如果其他程序要调用到它的函数或者类,则需要在源代码加上__declspec(dllexport)
来声明导出函数,此时T_CONTROLLER_EXPORT
宏展开的内容就是__declspec(dllexport)
。
而对于Mac OS
或者Linux
的用户,调用动态库文件并没有此限制,所以T_CONTROLLER_EXPORT
宏展开并没有任何内容。即
#define T_CONTROLLER_EXPORT
这样,通过这个宏定义就可以使同一份代码可以在不同的平台编译运行。