diff --git a/README.md b/README.md
index 6de9e5b..8e54126 100644
--- a/README.md
+++ b/README.md
@@ -132,6 +132,16 @@ QQ群:1127401830
* everstar_l 10元
* 五色花 20元
+## 鸣谢
+
+特别感谢 [JetBrains](https://www.jetbrains.com/?from=ferry) 为本开源项目提供免费的 [IntelliJ GoLand](https://www.jetbrains.com/go/?from=ferry) 授权
+
+
+
+
+
+
+
## License
开源不易,请尊重作者的付出,感谢。
diff --git a/config/ferry.sql b/config/ferry.sql
new file mode 100644
index 0000000..bea4a79
--- /dev/null
+++ b/config/ferry.sql
@@ -0,0 +1,381 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : localhost
+ Source Server Type : MySQL
+ Source Server Version : 50729
+ Source Host : localhost:3306
+ Source Schema : ferry
+
+ Target Server Type : MySQL
+ Target Server Version : 50729
+ File Encoding : 65001
+
+ Date: 05/09/2020 16:42:32
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for casbin_rule
+-- ----------------------------
+DROP TABLE IF EXISTS `casbin_rule`;
+CREATE TABLE `casbin_rule` (
+ `p_type` varchar(100) DEFAULT NULL,
+ `v0` varchar(100) DEFAULT NULL,
+ `v1` varchar(100) DEFAULT NULL,
+ `v2` varchar(100) DEFAULT NULL,
+ `v3` varchar(100) DEFAULT NULL,
+ `v4` varchar(100) DEFAULT NULL,
+ `v5` varchar(100) DEFAULT NULL,
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_casbin_rule_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=794 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for p_process_classify
+-- ----------------------------
+DROP TABLE IF EXISTS `p_process_classify`;
+CREATE TABLE `p_process_classify` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ `name` varchar(128) DEFAULT NULL,
+ `creator` int(11) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_p_process_classify_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for p_process_info
+-- ----------------------------
+DROP TABLE IF EXISTS `p_process_info`;
+CREATE TABLE `p_process_info` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ `name` varchar(128) DEFAULT NULL,
+ `structure` json DEFAULT NULL,
+ `classify` int(11) DEFAULT NULL,
+ `tpls` json DEFAULT NULL,
+ `task` json DEFAULT NULL,
+ `submit_count` int(11) DEFAULT '0',
+ `creator` int(11) DEFAULT NULL,
+ `notice` json DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_p_process_info_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for p_task_history
+-- ----------------------------
+DROP TABLE IF EXISTS `p_task_history`;
+CREATE TABLE `p_task_history` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ `task` int(11) DEFAULT NULL,
+ `name` varchar(256) DEFAULT NULL,
+ `task_type` int(11) DEFAULT NULL,
+ `execution_time` varchar(128) DEFAULT NULL,
+ `result` longtext,
+ PRIMARY KEY (`id`),
+ KEY `idx_p_task_history_delete_time` (`delete_time`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for p_task_info
+-- ----------------------------
+DROP TABLE IF EXISTS `p_task_info`;
+CREATE TABLE `p_task_info` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ `name` varchar(256) DEFAULT NULL,
+ `task_type` varchar(45) DEFAULT NULL,
+ `content` longtext,
+ `creator` int(11) DEFAULT NULL,
+ `remarks` longtext,
+ PRIMARY KEY (`id`),
+ KEY `idx_p_task_info_delete_time` (`delete_time`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for p_tpl_info
+-- ----------------------------
+DROP TABLE IF EXISTS `p_tpl_info`;
+CREATE TABLE `p_tpl_info` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ `name` varchar(128) DEFAULT NULL,
+ `form_structure` json DEFAULT NULL,
+ `creator` int(11) DEFAULT NULL,
+ `remarks` longtext,
+ PRIMARY KEY (`id`),
+ KEY `idx_p_tpl_info_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for p_work_order_circulation_history
+-- ----------------------------
+DROP TABLE IF EXISTS `p_work_order_circulation_history`;
+CREATE TABLE `p_work_order_circulation_history` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ `title` varchar(128) DEFAULT NULL,
+ `work_order` int(11) DEFAULT NULL,
+ `state` varchar(128) DEFAULT NULL,
+ `source` varchar(128) DEFAULT NULL,
+ `target` varchar(128) DEFAULT NULL,
+ `circulation` varchar(128) DEFAULT NULL,
+ `processor` varchar(45) DEFAULT NULL,
+ `processor_id` int(11) DEFAULT NULL,
+ `cost_duration` varchar(128) DEFAULT NULL,
+ `remarks` longtext,
+ PRIMARY KEY (`id`),
+ KEY `idx_p_work_order_circulation_history_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for p_work_order_info
+-- ----------------------------
+DROP TABLE IF EXISTS `p_work_order_info`;
+CREATE TABLE `p_work_order_info` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ `title` varchar(128) DEFAULT NULL,
+ `priority` int(11) DEFAULT NULL,
+ `process` int(11) DEFAULT NULL,
+ `classify` int(11) DEFAULT NULL,
+ `is_end` int(11) DEFAULT '0',
+ `is_denied` int(11) DEFAULT '0',
+ `state` json DEFAULT NULL,
+ `related_person` json DEFAULT NULL,
+ `creator` int(11) DEFAULT NULL,
+ `urge_count` int(11) DEFAULT '0',
+ `urge_last_time` int(11) DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `idx_p_work_order_info_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for p_work_order_tpl_data
+-- ----------------------------
+DROP TABLE IF EXISTS `p_work_order_tpl_data`;
+CREATE TABLE `p_work_order_tpl_data` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ `work_order` int(11) DEFAULT NULL,
+ `form_structure` json DEFAULT NULL,
+ `form_data` json DEFAULT NULL,
+ `tpl` int(11) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_p_work_order_tpl_data_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for sys_dept
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dept`;
+CREATE TABLE `sys_dept` (
+ `dept_id` int(11) NOT NULL AUTO_INCREMENT,
+ `parent_id` int(11) DEFAULT NULL,
+ `dept_path` varchar(255) DEFAULT NULL,
+ `dept_name` varchar(128) DEFAULT NULL,
+ `sort` int(4) DEFAULT NULL,
+ `leader` int(11) DEFAULT NULL,
+ `phone` varchar(11) DEFAULT NULL,
+ `email` varchar(64) DEFAULT NULL,
+ `status` int(1) DEFAULT NULL,
+ `create_by` varchar(64) DEFAULT NULL,
+ `update_by` varchar(64) DEFAULT NULL,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ PRIMARY KEY (`dept_id`),
+ KEY `idx_sys_dept_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for sys_loginlog
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_loginlog`;
+CREATE TABLE `sys_loginlog` (
+ `info_id` int(11) NOT NULL AUTO_INCREMENT,
+ `username` varchar(128) DEFAULT NULL,
+ `status` int(1) DEFAULT NULL,
+ `ipaddr` varchar(255) DEFAULT NULL,
+ `login_location` varchar(255) DEFAULT NULL,
+ `browser` varchar(255) DEFAULT NULL,
+ `os` varchar(255) DEFAULT NULL,
+ `platform` varchar(255) DEFAULT NULL,
+ `login_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `create_by` varchar(128) DEFAULT NULL,
+ `update_by` varchar(128) DEFAULT NULL,
+ `remark` varchar(255) DEFAULT NULL,
+ `msg` varchar(255) DEFAULT NULL,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ PRIMARY KEY (`info_id`),
+ KEY `idx_sys_loginlog_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=147 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for sys_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_menu`;
+CREATE TABLE `sys_menu` (
+ `menu_id` int(11) NOT NULL AUTO_INCREMENT,
+ `menu_name` varchar(128) DEFAULT NULL,
+ `title` varchar(64) DEFAULT NULL,
+ `icon` varchar(128) DEFAULT NULL,
+ `path` varchar(128) DEFAULT NULL,
+ `paths` varchar(128) DEFAULT NULL,
+ `menu_type` varchar(1) DEFAULT NULL,
+ `action` varchar(16) DEFAULT NULL,
+ `permission` varchar(32) DEFAULT NULL,
+ `parent_id` int(11) DEFAULT NULL,
+ `no_cache` char(1) DEFAULT NULL,
+ `breadcrumb` varchar(255) DEFAULT NULL,
+ `component` varchar(255) DEFAULT NULL,
+ `sort` int(4) DEFAULT NULL,
+ `visible` char(1) DEFAULT NULL,
+ `create_by` varchar(128) DEFAULT NULL,
+ `update_by` varchar(128) DEFAULT NULL,
+ `is_frame` int(1) DEFAULT '0',
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ PRIMARY KEY (`menu_id`),
+ KEY `idx_sys_menu_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=362 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for sys_post
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_post`;
+CREATE TABLE `sys_post` (
+ `post_id` int(11) NOT NULL AUTO_INCREMENT,
+ `post_name` varchar(128) DEFAULT NULL,
+ `post_code` varchar(128) DEFAULT NULL,
+ `sort` int(4) DEFAULT NULL,
+ `status` int(1) DEFAULT NULL,
+ `remark` varchar(255) DEFAULT NULL,
+ `create_by` varchar(128) DEFAULT NULL,
+ `update_by` varchar(128) DEFAULT NULL,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ PRIMARY KEY (`post_id`),
+ KEY `idx_sys_post_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for sys_role
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role`;
+CREATE TABLE `sys_role` (
+ `role_id` int(11) NOT NULL AUTO_INCREMENT,
+ `role_name` varchar(128) DEFAULT NULL,
+ `status` int(1) DEFAULT NULL,
+ `role_key` varchar(128) DEFAULT NULL,
+ `role_sort` int(4) DEFAULT NULL,
+ `flag` varchar(128) DEFAULT NULL,
+ `create_by` varchar(128) DEFAULT NULL,
+ `update_by` varchar(128) DEFAULT NULL,
+ `remark` varchar(255) DEFAULT NULL,
+ `admin` char(1) DEFAULT NULL,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ PRIMARY KEY (`role_id`),
+ KEY `idx_sys_role_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for sys_role_dept
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role_dept`;
+CREATE TABLE `sys_role_dept` (
+ `role_id` int(11) DEFAULT NULL,
+ `dept_id` int(11) DEFAULT NULL,
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for sys_role_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role_menu`;
+CREATE TABLE `sys_role_menu` (
+ `role_id` int(11) DEFAULT NULL,
+ `menu_id` int(11) DEFAULT NULL,
+ `role_name` varchar(128) DEFAULT NULL,
+ `create_by` varchar(128) DEFAULT NULL,
+ `update_by` varchar(128) DEFAULT NULL,
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1538 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for sys_settings
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_settings`;
+CREATE TABLE `sys_settings` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ `classify` int(11) DEFAULT NULL,
+ `content` json DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_sys_settings_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;
+
+-- ----------------------------
+-- Table structure for sys_user
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user`;
+CREATE TABLE `sys_user` (
+ `user_id` int(11) NOT NULL AUTO_INCREMENT,
+ `nick_name` varchar(128) DEFAULT NULL,
+ `phone` varchar(11) DEFAULT NULL,
+ `role_id` int(11) DEFAULT NULL,
+ `salt` varchar(255) DEFAULT NULL,
+ `avatar` varchar(255) DEFAULT NULL,
+ `sex` varchar(255) DEFAULT NULL,
+ `email` varchar(128) DEFAULT NULL,
+ `dept_id` int(11) DEFAULT NULL,
+ `post_id` int(11) DEFAULT NULL,
+ `create_by` varchar(128) DEFAULT NULL,
+ `update_by` varchar(128) DEFAULT NULL,
+ `remark` varchar(255) DEFAULT NULL,
+ `status` int(1) DEFAULT NULL,
+ `create_time` timestamp NULL DEFAULT NULL,
+ `update_time` timestamp NULL DEFAULT NULL,
+ `delete_time` timestamp NULL DEFAULT NULL,
+ `username` varchar(64) DEFAULT NULL,
+ `password` varchar(128) DEFAULT NULL,
+ PRIMARY KEY (`user_id`),
+ KEY `idx_sys_user_delete_time` (`delete_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4;
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/docs/_config.yml b/docs/_config.yml
new file mode 100644
index 0000000..c419263
--- /dev/null
+++ b/docs/_config.yml
@@ -0,0 +1 @@
+theme: jekyll-theme-cayman
\ No newline at end of file
diff --git a/docs/document/countersign.md b/docs/document/countersign.md
new file mode 100644
index 0000000..8217a29
--- /dev/null
+++ b/docs/document/countersign.md
@@ -0,0 +1,5 @@
+# 会签
+
+当在一个阶段出现多个处理人的时候,同时也需要多个处理人都处理完成,才可以进入下一个阶段的时候,则需要选择上会签的功能。
+
+也就说,如果选择了会签,则需要当前阶段的所有人处理完成,才能进入下一个阶段。
diff --git a/docs/document/cross_compile.md b/docs/document/cross_compile.md
new file mode 100644
index 0000000..bd17633
--- /dev/null
+++ b/docs/document/cross_compile.md
@@ -0,0 +1,29 @@
+# Mac、Linux、Windows下分别进行交叉编译
+
+Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序。
+
+Mac 下编译 Linux 和 Windows 64位可执行程序
+
+ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
+ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
+
+Linux 下编译 Mac 和 Windows 64位可执行程序
+
+ CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
+ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
+
+Windows 下编译 Mac 和 Linux 64位可执行程序
+
+ SET CGO_ENABLED=0
+ SET GOOS=darwin
+ SET GOARCH=amd64
+ go build main.go
+ -------------------------------------------------
+ SET CGO_ENABLED=0
+ SET GOOS=linux
+ SET GOARCH=amd64
+ go build main.go
+
+GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)。
+GOARCH:目标平台的体系架构(386、amd64、arm)。
+CGO_ENABLED:交叉编译不支持 CGO 所以要禁用它。
diff --git a/docs/document/end_process.md b/docs/document/end_process.md
new file mode 100644
index 0000000..c855bcd
--- /dev/null
+++ b/docs/document/end_process.md
@@ -0,0 +1,5 @@
+# 结单
+
+当发现提交的工单有误,可以根据实际情况,直接结束工单。
+
+
diff --git a/docs/document/exclusive_gateway.md b/docs/document/exclusive_gateway.md
new file mode 100644
index 0000000..e465418
--- /dev/null
+++ b/docs/document/exclusive_gateway.md
@@ -0,0 +1,17 @@
+# 排他网关
+
+在平时的业务中,有的时候需要根据表单数据的值来判断跳转到啥位置。
+
+例如:如果申请的服务器价格低于1000元就是部门领导审批,如果超过1000元,那么就是CTO审批。为兼容这种情况因此加入了排他网关的概念。
+
+此外还需注意,如果使用了排他网关,则必须有一个条件判断是正确的,否则流程将无法进行下去,报错失败。
+
+将下面的Json格式数据,修改为自己的表单数据,写入到对应的流转线条中即可,但是流转线条的源阶段必须要排他网关的图标。
+
+ [
+ {
+ "key":"字段名称",
+ "sign":"==",
+ "value":"需要判断的值"
+ }
+ ]
diff --git a/docs/document/forward.md b/docs/document/forward.md
new file mode 100644
index 0000000..1fcbc35
--- /dev/null
+++ b/docs/document/forward.md
@@ -0,0 +1,5 @@
+# 转交
+
+进行工单转交,只能在当前阶段将工单转交给他人。
+
+
diff --git a/docs/document/ide_development.md b/docs/document/ide_development.md
new file mode 100644
index 0000000..c92a7cc
--- /dev/null
+++ b/docs/document/ide_development.md
@@ -0,0 +1,59 @@
+# IDE开发
+
+众多 IDE 里边,推荐使用 `goland IDE`进行调试
+
+首先我们启动 `Goland` , 点击 `Open Project`,下图红框圈选部分;
+
+
+
+选择 ferry 存放的路径,找到并打开;
+
+# 配置 GOPORXY
+
+然后选择`Goland` > `Preferences` ;
+
+
+
+# 添加运行或调试配置
+
+### 添加 init 配置
+
+1\. 打开`Edit Configurations`
+
+
+
+2\. 选择 `+` > `go build`
+
+
+
+3\. 按照下图所示进行配置,注意:填写 `Program arguments` 为 `init -c=config/settings.dev.yml`,完成之后点击保存
+
+
+
+4\. 修改数据库
+
+
+
+5\. 初使化
+
+
+
+### 添加 server 配置
+
+1\. 打开`Edit Configurations`
+
+
+
+2\. 选择 `+` > `go build`
+
+
+
+3\. 按照下图所示进行配置,注意:填写 `Program arguments` 为`server -c=config/settings.dev.yml`,完成之后点击保存
+
+
+
+4\. 启动 debug
+
+
+
+转载自:[http://doc.zhangwj.com/go-admin-site/guide/ide.html#%E6%B7%BB%E5%8A%A0-server-%E9%85%8D%E7%BD%AE](http://doc.zhangwj.com/go-admin-site/guide/ide.html#%E6%B7%BB%E5%8A%A0-server-%E9%85%8D%E7%BD%AE)
diff --git a/docs/document/install.md b/docs/document/install.md
new file mode 100644
index 0000000..7313946
--- /dev/null
+++ b/docs/document/install.md
@@ -0,0 +1,226 @@
+# 安装
+
+> 需注意因使用到了json类型的字段,因此MySQL需是5.7以上的版本。
+>
+> MySQL > 5.7
+>
+> Go >= 1.14
+>
+> Redis
+
+若是安装出错,请先确认redis及MySQL是否安装配置成功,若是还有问题,可在群内提问。
+
+## 配置文件介绍
+
+ script:
+ path: ./static/scripts # 任务脚本路径
+ settings:
+ application:
+ domain: localhost:8002 # 用于将HTTP请求重定向到HTTPS的主机名
+ host: 0.0.0.0 # 启动的地址,主机ip 或者域名,默认0.0.0.0
+ ishttps: false # 是否为HTTPS
+ mode: dev # 开发模式
+ name: ferry-test # 服务名称
+ port: "8002" # 启动端口
+ readtimeout: 1 # 请求读取超时时间,从连接被接受(accept)到request body完全被读取(如果你不读取body,那么时间截止到读完header为止)
+ writertimeout: 2 # 从request header的读取结束开始,到response write结束为止(也就是ServeHTTP 方法的声明周期)
+ database:
+ dbtype: mysql # 数据库类型
+ host: 127.0.0.1 # 数据库地址
+ name: ferry # 数据库名称
+ password: 123456 # 数据库密码
+ port: 3306 # 数据库端口
+ username: ferry # 数据库用户名
+ email:
+ alias: ferry # 邮箱别名
+ host: smtp.163.com # 邮件服务器
+ pass: your password # 邮箱密码
+ port: 465 # 邮件服务器端口
+ user: fdevops@163.com # 邮箱账号
+ gorm:
+ logmode: 0 # gorm详细日志输出,0表示不输出,1表示输出
+ maxidleconn: 0 # 最大空闲连接
+ maxopenconn: 20000 # 最大连接数据
+ jwt:
+ secret: ferry # JWT加密字符串
+ timeout: 3600 # 过期时间单位:秒
+ log:
+ dir: logs # 日志路径
+ operdb: false
+ ssl:
+ key: keystring
+ pem: temp/pem.pem
+
+## 本地开发
+
+后端程序启动:
+
+ # 1\. 拉取代码,以下命令二选一即可:
+ git clone https://github.com/lanyulei/ferry.git
+ git clone https://gitee.com/yllan/ferry.git
+
+ # 2\. 进入工作路径
+ cd ferry
+
+ # 3\. 修改配置
+ vim config/settings.dev.yml
+ 1). 修改为自己的数据库信息
+ 2). 修改为自己的邮件服务器地址
+ 其他的根据情况来修改调整
+
+ # 4\. 安装依赖
+ go get
+
+ # 5\. 连接数据库,并创建数据库
+ create database ferry charset 'utf8mb4';
+
+ # 6\. 初始化数据结构
+ go run main.go init -c=config/settings.dev.yml
+
+ # 7\. 测试启动程序,没有报错及没有问题
+ go run main.go server -c=config/settings.dev.yml
+
+ # 8\. 热加载方式启动
+ air
+
+前端程序启动:
+
+ # 1\. 拉取代码,以下命令二选一即可:
+ git clone https://github.com/lanyulei/ferry_web.git
+ git clone https://gitee.com/yllan/ferry_web.git
+
+ # 2\. 进入工作路径
+ cd ferry_web
+
+ # 3\. 安装依赖
+ npm config set registry https://registry.npm.taobao.org
+ npm install
+ # 若npm install安装失败,可尝试使用一下命令安装
+ npm install --unsafe-perm
+
+ # 推荐使用cnpm
+ npm install -g cnpm --registry=https://registry.npm.taobao.org
+ cnpm install
+
+ # 4\. 启动程序
+ npm run dev
+
+ # 5\. 访问http://localhost:9527,是否可正常访问
+
+## 部署线上
+
+后端部署:
+
+ # 1\. 拉取代码,以下命令二选一即可:
+ git clone https://github.com/lanyulei/ferry.git
+ git clone https://gitee.com/yllan/ferry.git
+
+ # 2\. 进入工作路径
+ cd ferry
+
+ # 3\. 交叉编译(centos)
+ env GOOS=linux GOARCH=amd64 go build
+ 更多交叉编译内容,请访问 https://www.fdevops.com/2020/03/08/go-locale-configuration
+
+ # 4\. config目录上传到项目根路径下,并确认配置信息是否正确
+ vim config/settings.yml
+ 1). 修改为自己的数据库信息
+ 2). 修改为自己的邮件服务器地址
+ 其他的根据情况来修改调整
+
+ # 4\. 创建日志路径及静态文件经历
+ mkdir -p log static/uploadfile static/scripts static/template
+
+ # 5\. 将本地项目下static/template目录下的所有文件上传的到,服务器对应的项目目录下static/template
+
+ # 6\. 连接数据库,并创建数据库
+ create database ferry charset 'utf8mb4';
+
+ # 7\. 初始化数据
+ ./ferry init -c=config/settings.yml
+
+ # 8\. 启动程序,推荐通过"进程管理工具"进行启动维护
+ nohup ./ferry server -c=config/settings.yml > /dev/null 2>&1 &
+
+前端部署:
+
+ # 1\. 拉取代码,以下命令二选一即可:
+ git clone https://github.com/lanyulei/ferry_web.git
+ git clone https://gitee.com/yllan/ferry_web.git
+
+ # 2\. 进入工作路径
+ cd ferry_web
+
+ # 3\. 安装依赖
+ npm config set registry https://registry.npm.taobao.org
+ npm install
+ # 若npm install安装失败,可尝试使用一下命令安装
+ npm install --unsafe-perm
+
+ # 推荐使用cnpm
+ npm install -g cnpm --registry=https://registry.npm.taobao.org
+ cnpm install
+
+ # 4\. 修改 .env.production 文件
+ # base api
+ VUE_APP_BASE_API = 'http://fdevops.com:8001' # 修改为您自己的域名
+
+ # 5\. 编译
+ npm run build:prod
+
+ # 6\. 将dist目录上传至项目路径下即可。
+ mv dist web
+
+ # 7\. nginx配置,根据业务自行调整即可
+ server {
+ listen 8001; # 监听端口
+ server_name localhost; # 域名可以有多个,用空格隔开
+
+ #charset koi8-r;
+
+ #access_log logs/host.access.log main;
+ location / {
+ root /data/ferry/web;
+ index index.html index.htm; #目录内的默认打开文件,如果没有匹配到index.html,则搜索index.htm,依次类推
+ }
+
+ #ssl配置省略
+ location /api {
+ # rewrite ^.+api/?(.*)$ /$1 break;
+ proxy_pass http://127.0.0.1:8002; #node api server 即需要代理的IP地址
+ proxy_redirect off;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+
+ # 登陆
+ location /login {
+ proxy_pass http://127.0.0.1:8002; #node api server 即需要代理的IP地址
+ }
+
+ # 刷新token
+ location /refresh_token {
+ proxy_pass http://127.0.0.1:8002; #node api server 即需要代理的IP地址
+ }
+
+ # 接口地址
+ location /swagger {
+ proxy_pass http://127.0.0.1:8002; #node api server 即需要代理的IP地址
+ }
+
+ # 后端静态文件路径
+ location /static/uploadfile {
+ proxy_pass http://127.0.0.1:8002; #node api server 即需要代理的IP地址
+ }
+
+ #error_page 404 /404.html; #对错误页面404.html 做了定向配置
+
+ # redirect server error pages to the static page /50x.html
+ #将服务器错误页面重定向到静态页面/50x.html
+ #
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root html;
+ }
+ }
diff --git a/docs/document/introduction.md b/docs/document/introduction.md
new file mode 100644
index 0000000..2c7df56
--- /dev/null
+++ b/docs/document/introduction.md
@@ -0,0 +1,55 @@
+# 简介
+
+本系统是集工单统计、任务钩子、权限管理、灵活配置流程与模版等等于一身的开源工单系统,当然也可以称之为工作流引擎。
+
+致力于减少跨部门之间的沟通,自动任务的执行,提升工作效率与工作质量,减少不必要的工作量与人为出错率。
+
+演示Demo: [http://fdevops.com:8001/](http://fdevops.com:8001/)
+
+账号密码:admin/123456
+
+Github: [https://github.com/lanyulei/ferry](https://github.com/lanyulei/ferry)
+
+Gitee: [https://gitee.com/yllan/ferry](https://gitee.com/yllan/ferry)
+
+文档:[https://www.fdevops.com/docs/ferry-tutorial-document/introduction](https://www.fdevops.com/docs/ferry-tutorial-document/introduction)
+
+演示Demo上,将删除的功能全部隐藏了,因为之前发生过,有人恶意删除所有可删除的数据,包括流程数据和用户数据,因此,clone下来的代码是有删除之类的动作的。
+
+## 功能
+
+下面对本系统的功能做一个简单介绍。
+
+工单系统相关功能:
+
+* 工单提交申请
+* 工单统计
+* 多维度工单列表,包括(我创建的、我相关的、我待办的、所有工单)
+* 自定义流程
+* 自定义模版
+* 任务钩子
+* 任务管理
+* 催办
+* 转交
+* 手动结单
+* 加签
+* 多维度处理人,包括(个人,变量(创建者、创建者负责人))
+* 排他网关,即根据条件判断进行工单跳转
+* 并行网关,即多个节点同时进行审批处理
+* 通知提醒(目前仅支持邮件)
+* 流程分类管理
+
+权限管理相关功能,使用casbin实现接口权限控制:
+
+* 用户、角色、岗位的增删查改,批量删除,多条件搜索
+* 角色、岗位数据导出Excel
+* 重置用户密码
+* 维护个人信息,上传管理头像,修改当前账户密码
+* 部门的增删查改
+* 菜单目录、跳转、按钮及API接口的增删查改
+* 登陆日志管理
+* 左菜单权限控制
+* 页面按钮权限控制
+* API接口权限控制
+
+目前大致上就是以上功能了,如果您觉得我有拉下的功能,还请留言提醒我,感谢。
diff --git a/docs/document/new_process.md b/docs/document/new_process.md
new file mode 100644
index 0000000..1aa2d4d
--- /dev/null
+++ b/docs/document/new_process.md
@@ -0,0 +1,25 @@
+# 创建一个新流程
+
+## 流程分类
+
+为区分不同功能,不同类型的流程,因此加入分类的概念,方便管理和维护不同功能的流程。
+
+分类创建较为简单,不在过多赘述。
+
+## 创建模版
+
+根据实际情况,填写下面的数据。
+
+## 创建流程
+
+
+
+## 创建任务
+
+根据实际情况创建Python或者Shell的脚本任务,这个步骤相对简单,不在过多赘述。
+
+## 申请新创建的流程
+
+
+
+
diff --git a/docs/document/parallel_gateway.md b/docs/document/parallel_gateway.md
new file mode 100644
index 0000000..22cd246
--- /dev/null
+++ b/docs/document/parallel_gateway.md
@@ -0,0 +1,7 @@
+# 并行网关
+
+在日常的工作中,可能会有需要多个处理人并行进行处理,只有所有的处理人都完成处理才可以跳转到下一个阶段。基于这种情况的出现,因此有了并行网关的概念。
+
+在这种并行处理的情况下,处理的顺序无所谓,但是需要全部处理完成。才能进入下一个阶段,同时并行网关的情况下,会无视条件判断。
+
+
diff --git a/docs/document/system_manager.md b/docs/document/system_manager.md
new file mode 100644
index 0000000..1b7a712
--- /dev/null
+++ b/docs/document/system_manager.md
@@ -0,0 +1,31 @@
+# 系统管理
+
+本文主要是介绍以下非增删改查的功能。
+
+## 角色管理
+
+对角色的增删查改、权限的管控、批量删除、导出功能。
+
+## 菜单管理
+
+菜单的增删查改。
+
+
+
+* 上级菜单:菜单或者按钮的父亲。
+* 菜单标题:就是菜单的名字。
+* 显示顺序:菜单展示时候的顺序。
+* 菜单类型:啥功能的菜单。
+ * 目录:对菜单进行区分维护。
+ * 菜单:可跳转对对应的页面。
+ * 按钮:页面上对应的按钮操作。
+ * 接口:后端对应的API地址。
+* 菜单图标:左菜单栏展示需要展示的图标。
+* 路由名称:Vue路由设置的名称。
+* 组件路径:前端程序View对应下文件路径,包括文件名称。
+* 是否外链:是否是外部链接。
+* 路由地址:可访问的url地址。
+* 权限标识:权限控制需要的标识。
+* 菜单状态:显示或者隐藏菜单项。
+
+此外需要注意的是,每个后端需要跟前端交互的接口,都需要写入到菜单中的接口权限中。
diff --git a/docs/document/urge.md b/docs/document/urge.md
new file mode 100644
index 0000000..7c1c18f
--- /dev/null
+++ b/docs/document/urge.md
@@ -0,0 +1,5 @@
+# 催办
+
+通过邮件的方式,来对当前处理人进行工单催促,十分钟内只能催促一次。
+
+
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 0000000..e5124f2
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,15 @@
+# 目录
+
+* [介绍](https://lanyulei.github.io/ferry/document/introduction "介绍")
+* [安装](https://lanyulei.github.io/ferry/document/install "安装")
+* [IDE 开发](https://lanyulei.github.io/ferry/document/ide_development "IDE 开发")
+* [系统管理](https://lanyulei.github.io/ferry/document/system_manager "系统管理")
+* 工单系统
+* * [创建一个新流程](https://lanyulei.github.io/ferry/document/new_process "创建一个新流程")
+* * [催办](https://lanyulei.github.io/ferry/document/urge "催办")
+* * [转交](https://lanyulei.github.io/ferry/document/forward "转交")
+* * [结单](https://lanyulei.github.io/ferry/document/end_process "结单")
+* * [排他网关](https://lanyulei.github.io/ferry/document/exclusive_gateway "排他网关")
+* * [并行网关](https://lanyulei.github.io/ferry/document/parallel_gateway "并行网关")
+* * [会签](https://lanyulei.github.io/ferry/document/countersign "会签")
+* [Mac、Linux、Windows下分别进行交叉编译](https://lanyulei.github.io/ferry/document/cross_compile "Mac、Linux、Windows下分别进行交叉编译")