scaffold: 根据数据表,一键生成管理平台(https://github.com/liujianping/scaffold)

James · 2016-01-08 08:06:27 · 3076 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2016-01-08 08:06:27 的主题,其中的信息可能已经有所发展或是发生改变。

scaffold

scaffold, generate revel project by database schema

脚手架工具, 通过定义数据表,一键生成Revel管理平台项目。

特点

通过数据表定义, 一键生成管理平台

支持自定义控件模板

[索引页]

home

[控件]

list

[查询控件]

add

[新增页]

update

[列表页]

index

以上图片效果均为实际生成效果, 未编写一行代码:smile:

安装

本工具会执行 goimports 工具格式化生成的文件, 请提前安装好该工具.

$: go get github.com/liujianping/scaffold

快速开始

创建 Revel 项目

$: revel new [project/path]

编辑 项目配置 conf/app.conf 文件, 增加相应数据库配置。


db.driver = mysql
db.host = 127.0.0.1
db.port = 3306
db.username = [username]
db.password = [password]
db.database = [database]

定义数据结构

Demo项目中定义数据结构说明如下:

DROP TABLE IF EXISTS `user_accounts`;

CREATE TABLE `user_accounts` (
  `id`          INT UNSIGNED     NOT NULL  PRIMARY KEY AUTO_INCREMENT COMMENT 'caption:"编号"',
  `name`        VARCHAR(32)      NOT NULL  DEFAULT '' COMMENT 'index:"y" caption:"名称" update:"w" finder:"like" query:"like" widget:"text" valid:"required(),min(6),max(16)"',
  `mailbox`     VARCHAR(128)     NOT NULL  DEFAULT '' COMMENT 'index:"y" caption:"邮箱" update:"r" finder:"like" query:"like" widget:"email" valid:"required(),email()"',
  `sex`         TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'index:"y" caption:"性别" update:"w" widget:"selection" relation:"user_accounts_sex"',
  `description` VARCHAR(256)     NOT NULL  DEFAULT '' COMMENT 'caption:"描述" update:"w" widget:"textarea"',
  `password`    VARCHAR(32)      NOT NULL  DEFAULT '' COMMENT 'caption:"密码" update:"r" widget:"password" valid:"required()"',
  `head_url`    VARCHAR(255)     NOT NULL  DEFAULT '' COMMENT 'caption:"头像" update:"w" widget:"file"',
  `status`      TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'index:"y" caption:"状态" update:"w" finder:"eq" query:"eq" widget:"selection" relation:"user_accounts_status"',
  `create_at`   TIMESTAMP(6)     NOT NULL  DEFAULT CURRENT_TIMESTAMP(6) COMMENT 'caption:"创建时间" update:"r" widget:"datetime"',
  `update_at`   TIMESTAMP(6)     NOT NULL  DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT 'index:"y" caption:"更新时间" update:"w" widget:"datetime"'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'index:"y" caption:"会员账号"';

DROP TABLE IF EXISTS `user_posts`;

CREATE TABLE `user_posts` (
  `id`          INT UNSIGNED     NOT NULL  PRIMARY KEY AUTO_INCREMENT COMMENT 'caption:"编号"',
  `user_account_id` INT UNSIGNED     NOT NULL DEFAULT 0 COMMENT 'index:"y" caption:"作者" update:"w" query:"eq" widget:"finder" relation:"user_accounts"',
  `title`       VARCHAR(32)      NOT NULL  DEFAULT '' COMMENT 'index:"y" caption:"标题" update:"w" finder:"like" query:"like" widget:"text" valid:"required(),min(12)"',
  `content`     TEXT             NOT NULL  COMMENT 'index:"n" caption:"内容" update:"w" widget:"textarea"',
  `image_url`   VARCHAR(255)     NOT NULL  DEFAULT '' COMMENT 'index:"n" caption:"图片" update:"w" widget:"file"',
  `status`      TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'index:"y" caption:"状态" update:"w" finder:"eq" query:"eq" widget:"selection" relation:"user_posts_status"',
  `create_at`   TIMESTAMP(6)     NOT NULL  DEFAULT CURRENT_TIMESTAMP(6) COMMENT 'caption:"创建时间" widget:"datetime"',
  `update_at`   TIMESTAMP(6)     NOT NULL  DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT 'index:"y" caption:"更新时间" update:"w" widget:"datetime"'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'index:"y" caption:"会员帖子"';

-- system options
DROP TABLE IF EXISTS `options`;

CREATE TABLE `options` (
  `id`                   INT UNSIGNED        NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'caption:"编号"',
  `name`                 VARCHAR(32) DEFAULT "" COMMENT 'index:"y" caption:"名称" update:"w" query:"like" widget:"text" valid:"required()"',
  `code`                 VARCHAR(32) DEFAULT "" COMMENT 'index:"y" caption:"代码" update:"w" query:"eq" widget:"text" valid:"required()"',
  `option_name`          VARCHAR(256) DEFAULT "" COMMENT 'index:"y" caption:"选项名称" update:"w" widget:"text" valid:"required()"',
  `option_code`          VARCHAR(32) DEFAULT "" COMMENT 'index:"y" caption:"选项代码" update:"w" widget:"text" valid:"required()"',
  `option_value`         INT NOT NULL DEFAULT 0 COMMENT 'index:"y" caption:"选项值" update:"w" query:"eq" widget:"number" valid:"required()"',
  `description`          VARCHAR(256) DEFAULT "" COMMENT 'caption:"描述" update:"w" widget:"text"'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'index:"y" caption:"系统状态"';

INSERT INTO `options`(
  `name`, `code`, `option_name`, `option_code`, `option_value`, `description`     
) VALUES 
( "性别" , "user_accounts_sex", "男", "male", 1,  "男"),
( "性别" , "user_accounts_sex", "女", "female", 2,  "女");

INSERT INTO `options`(
  `name`, `code`, `option_name`, `option_code`, `option_value`, `description`     
) VALUES 
( "账号状态" , "user_accounts_status", "待激活", "unactived", 1,  "账号待激活"),
( "账号状态" , "user_accounts_status", "正常", "normal", 2,  "账号正常"),
( "账号状态" , "user_accounts_status", "禁用", "forbidden", 3,  "账号禁用");

INSERT INTO `options`(
  `name`, `code`, `option_name`, `option_code`, `option_value`, `description`     
) VALUES 
( "帖子状态" , "user_posts_status", "待发布", "draft", 1,  "帖子待发布"),
( "帖子状态" , "user_posts_status", "已发布", "public", 2,  "帖子已发布"),
( "帖子状态" , "user_posts_status", "已作废", "trash", 3,  "帖子已作废");

通过在数据表定义中的注释说明中, 增加脚手架生成规则。具体规则如下:

表规则

-   index
    index:"y" 表示该表需要在列表页(/)中建立索引, 否则不建立索引

-   caption
    caption:"xxxx" 表示该表的可读性名称

列规则

-   caption
    caption:"xxxx" 表示该列的可读性名称

-   index
    index:"y" 表示该列需要在列表页(/module.name.index)中展示, 否则不展示

-   query
    query:"like" 表示在列表页(/module.name.index)查询条件面板中增加相应查询字段。
                 具体查询运算符包括: like,llike,rlike,eq,gt,ge,lt,le

-   finder
    finder:"like" 表示在查找控件列表页(/module.name.finder.index)查询条件面板中增加相应查询字段。
                 具体查询运算符包括: like,llike,rlike,eq,gt,ge,lt,le

-   valid
    valid:"required(),min(6),max(16),email(),length(8)"
                表示在进行该列的增加、更新操作时, 需要进行的验证规则

-   update
    update:"y"  表示该列在更新页面需要进行更新操作,否则会使用hidden控件进行隐藏操作。

-   widget
    widget:"text"  表示该列在新增或更新页面需要进行生成的HTML控件模板, 具体控件模板可以进行自定义。
                目前支持的控件包括: 

                - text        文本输入控件
                - number      数字输入控件
                - password    密码输入控件   
                - email       邮箱输入控件
                - datetime    时间输入控件 
                - file        文件上传输入控件
                - finder      管理表记录查找控件
                - textarea    编辑区域输入控件
                - finder      查询关联表控件
                - selection   查询关联selection控件 

    以上所有控件, 待项目生成后, 均可以在 views/widget/xxx.html 进行自定义设置。

-   relation
    relation:"name" 当widget:"finder"时,表示该字段关联的表名
    relation:"name" 当widget:"selection"时,表示该字段关联的options表中的code

生成代码

//! 初始化 
$: scaffold -f revel init [project/path]  

//! 生成模块代码 [mvc]
$: scaffold -f revel module  [project/path]  "*"

//! 建立索引路由
$: scaffold -f revel index [project/path]

运行 Revel 项目

$: revel run [project/path]

控件模板

可以在 [project/path]/app/view/widget/ 目录中自定义自己的控件模板。

TODO

  • 其它框架支持(beego等)

Thanks

jaywcjlove 提供的datetime控件js脚本


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3076 次点击  
加入收藏 微博
4 回复  |  直到 2016-01-19 16:04:05
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传