# 生成代码

```bash
qdp generator
```

[可选参数]

|参数|类型|描述|
|:-:|:--:|:--|
|-c,--config|string|配置文件，默认为./config.json|
|-s,--savePath|string|代码保存路径，默认为./src|

## 配置文件说明
---

XXXX

## 结构
---

|参数|描述|
|:-:|:--|
|pages|页面配置|
|webapi|应用接口配置|
|dict|数据字典配置|

### PAGES
---

> 菜单目录配置

|参数|类型|必填|默认值|描述|
|:-:|:-:|:---:|:---:|:--|
|name|string|是|-|页面路由名称|
|path|string||默认为```name```，'-'将会替换为'/'|页面访问路径|
|title|string|是|-|页面标题|
|icon|string||-|页面标题图标|
|hideInBread|boolean||-|在面包屑中隐藏|
|hideInMenu|boolean||-|在导航菜单中隐藏|
|isGroup|boolean||-|目录是否为分组模式|
|sort|number||999|排序代码|
|children|array|是|-|页面集合|

> 页面配置

|参数|类型|必填|默认值|描述|
|:-:|:-:|:-:|:-:|:--|
|name|string|是|-|页面路由名称|
|path|string||name|页面访问路径|
|title|string|是|-|页面标题|
|icon|string||-|页面标题图标|
|hideInBread|boolean||-|在面包屑中隐藏|
|hideInMenu|boolean||-|在导航菜单中隐藏|
|sort|number||999|排序代码|
|primary|string||'id'|页面数据主键字段名称|
|fields|array|是|-|页面数据项集合|
|search|object||-|检索参数|
|search.operation|object||-|表格操作列|
|search.operation.fixed|'left','right','none'||right|浮动方式，none为不浮动。|
|search.operation.width|number,'*'||-|表格操作列宽度|
|search.paper|object||-|分页|
|search.paper.enable|boolean||true|是否分页|
|modify|object||-|编辑参数|
|modify.page|object||-|编辑页面参数|
|modify.page.width|number||550|编辑页面宽度|
|modify.field|object||-|编辑页面字段全局参数|
|modify.field.span|number||24|字段所占格数 参考 grid 布局，将一行平均分为24份|
|modify.field.index|number||max|字段排序索引|
|modify.field.required|boolean||false|字段是否为必填项|
|apis|object|是|-|接口定义|
|apis.query|string|是|-|检索数据接口|
|apis.create|string|是|-|新增数据接口，不设置该值表示无新增功能。|
|apis.update|string|是|-|更新数据接口，不设置该值表示无更新功能。|
|apis.detail|string|是|-|检索数据详情接口，与update成对出现。（缺失时生成的代码会有异常，需要手工处理）|
|apis.remove|string|是|-|删除数据接口，不设置该值表示无删除功能。|
|apis.export|string|是|-|导出数据接口，不设置该值表示无导出功能。|
|single|boolean||true|是否为单页模式，默认为ture，暂时不支持false|

> 页面 field 配置

|参数|类型|必填|默认值|描述|
|:-:|:-:|:-:|:-:|:--|
|name|string|是|-|字段名称，为_index时表示索引列，为_selection时表示复选列|
|text|string|是|-|字段标题|
|width|number,'*'||200|在检索页面的表格中展示的宽度|
|hidden|boolean||false|是否显示在检索页面的表格中|
|tooltip|boolean||false|在检索页面的表格中增加提示气泡模式|
|detail|object,boolean||false|是否可以跳转至路由页面。|
|detail.primary|string||'id'|打开路由时传入的主键字段名称。|
|detail.route|string||默认是当前页面的详情|需要跳转的路由页面名称。|
|editor|object,boolean||true|编辑器，该字段是否可以编辑。|
|editor.required|boolean||false|编辑时是否为必填项，可由modify.field.required继承。|
|editor.span|boolean||24|编辑时组件宽度，可由modify.field.span继承。|
|editor.validator|object||-|验证表达式|
|editor.validator.regex|string||-|验证的正则表达式|
|editor.validator.notice|string||-|验证失败提示内容|
|filter|object,boolean||false|是否为检索条件。|
|filter.index|number||max|检索条件排序索引|
|filter.mode|'default','advance'||'advance'|检索条件展示方式，default：默认展示，advance：高级检索。|
|relation|object,boolean||false|关联条件|
|relation.name|string||-|调用的接口名称，与path二选一|
|relation.path|string||-|调用的接口地址，与name二选一|
|relation.key|string||-|接口返回数据，主键字段名称|
|relation.value|string||-|接口返回数据，用于显示的字段名称|
|relation.params|JSON||-|调用接口时传入的参数 {JSON}|
|type|'date','file','textarea','password',undefined||undefined| 字段类型|
|dict|string||-|关联数据字典名称|
|format|function||-|在检索页面的表格中展示时格式化方法，function(value,data)，value：当前值，data：单行值|
|dataFormat|string||'yyyy-MM-dd HH:mm:ss'|type='data'时，设置日期格式|
|sort|boolean||true|字段是否允许排序|

## 示例
---

```javascript
{
  "pages": [
    /** 字典数据 dict */
    {
      "name": "dictionary",
      "title": "字典数据",
      "icon": "planar-drxx33",
      "children":[
        /** 字典索引 dictionary-index */
        {
          "name": "dictionary-index",
          "icon": "planar-drxx56",
          "path": "index",
          "title": "字典索引",
          "fields": [
            {
              "name": "_index",
              "editor": false
            },
            {
              /** 字段名称 */
              "name": "name",
              /** 字段标题 */
              "text": "数据字典名称",
              /** 是否可以跳转至路由页面。{object|boolean} 默认为false */
              "detail": {
                /** 打开路由时传入的主键字段名称 */
                "primary": "alias",
                /** 需要跳转的路由页面名称 */
                "route": "dictionary-data-detail"
              },
              /** 编辑器，该字段是否可以编辑。{object|boolean} 默认为ture */
              "editor":{
                /** 编辑时是否为必填项，{boolean} 默认为false。可由modify.field.required继承 */
                "required": true,
                /** 编辑时组件宽度，{number} 默认为false。可由modify.field.span继承 */
                "span": 12
              },
              /** 是否为检索条件 {object|boolean}，为true时，等于"filter":{"mode":"advance"} */
              "filter": true
            },
            {
              "name": "alias",
              "text": "数据字典别名",
              /** 是否可以跳转至路由页面。等于"detail":{ "primary":"id","route"} */
              "detail": true,
              "filter":{
                "mode": "default"
              },
              "editor":{
                "required": true
              }
            },
            {
              "name": "file",
              "text": "附加文件",
              "editor": true,
              /** 字段类型：文件上传 */
              "type": "file",
              /** 是否显示在检索页面的表格中，默认为false */
              "hidden": true
            },
            {
              "name": "otherTime",
              "text": "其他时间",
              "type": "date"
            },
            {
              "name": "createTime",
              "text": "创建时间",
              "type": "date",
              "editor": false,
              "filter": {
                "index": 1,
                "mode":"default"
              }
            },
            {
              "name": "remark",
              "text": "数据字典备注",
              "editor":{ "span": 24 },
              "width": 300,
              "type": "textarea",
              "tooltip": true
            }
          ],
          /** 检索参数 */
          "search": {
            /** 表格操作列 */
            "operation": {
              /** 浮动方式：left,right,none；none为不浮动；默认right。 */
              "fixed": "none",
              /** 宽度 */
              "width": 200
            },
            /** 分页 */
            "paper": {
              /** 是否分页，默认为ture */
              "enable": false
            }
          },
          /** 编辑参数 */
          "modify": {
            /** 页面参数 */
            "page": {
              /** 页面宽度 */
              "width": 600
            },
            /** 字段全局参数 */
            "field": {
              /** 字段所占格数 参考 grid 布局，将一行平均分为24分 */
              "span": 12,
              /** 字段排序索引 */
              "index": 0,
              /** 字段是否为必填项，默认为false */
              "required": false
            }
          },
          /** 接口定义 */
          "apis": {
            /** 检索数据接口 */
            "query": "/system/dictionary/index/query",
            /** 新增数据接口，不设置该值表示无新增功能。 */
            "create": "/system/dictionary/index/create",
            /** 更新数据接口，不设置该值表示无更新功能。 */
            "update": "/system/dictionary/index/modify",
            /** 检索数据详情接口，与update成对出现。（缺失时生成的代码会有异常，需要手工处理） */
            "detail": "/system/dictionary/index/detail",
            /** 删除数据接口，不设置该值表示无删除功能。 */
            "remove": "/system/dictionary/index/remove",
            /** 导出数据接口，不设置该值表示无导出功能。 */
            "export": "/system/dictionary/index/export"
          },
          /** 是否为单页模式，默认为ture，暂时不支持false */
          "single": true,
          /** 主键名称，默认为id */
          "primary": "id"
        },
        /** 字典数据 dictionary-data */
        {
          "name": "dictionary-data",
          "icon": "planar-drxx39",
          "path": "data",
          "title": "字典数据",
          "fields": [
            { "name": "_index", "editor": false },
            {
              "name": "name",
              "text": "数据字典名称",
              "filter": {
                "mode":"default"
              },
              /** 关联条件 */
              "relation": {
                /** 调用的接口名称，与path二选一 */
                "name": "queryDictionaryIndex",
                /** 调用的接口地址，与name二选一 */
                /** "path": "/system/dictionary/data/query" */
                /** 接口返回数据，主键字段名称 */
                "key": "name",
                /** 接口返回数据，用于显示的字段名称 */
                "value": "alias",
                /** 调用接口时传入的参数 {JSON} */
                "params": {}
              },
              "editor": {
                "required": true
              }
            },
            { "name": "dictKey", "text": "字典项键", "editor":{ "required": true } },
            { "name": "dictValue", "text": "字典项值", "editor":{ "required": true } },
            { "name": "extra", "text": "字典项附加数据", "width": "*", "type":"textarea" , "tooltip": true }
          ],
          "search": {
            "operation": {
              "fixed": "none"
            },
            "paper": {
              "enable": false
            }
          },
          "apis": {
            "query": "/system/dictionary/data/query",
            "create": "/system/dictionary/data/create",
            "update": "/system/dictionary/data/modify",
            "detail": "/system/dictionary/data/detail"
          }
        }
      ]
    },
    /** 系统运维 maintain */
    {
      "name": "maintain",
      "title": "系统运维",
      "icon": "planar-drxx33",
      "children": [
        /** 监控日志 logger */
        {
          "name": "logger",
          "title": "监控日志",
          "primary": "lid",
          "icon": "planar-drxx05",
          "fields": [
            { "name": "_selection" },
            { "name": "business", "text": "业务", "dict": "business_category", "filter": true },
            { "name": "action", "text": "动作", "dict": "action_category", "filter": true },
            { "name": "clientIp", "detail": true, "text": "访问来源", "width": 150 },
            { "name": "threadId", "text": "线程号", "width": 100 },
            { "name": "operatorName", "text": "操作员", "format":"v => v || \"系统\"" },
            { "name": "createTime", "text": "创建时间", "type": "date", "filter": { "index": 1, "mode":"default" } },
            { "name": "content", "text": "内容", "tooltip": true, "width": 400, "sort":false },
            { "name": "remark", "text": "备注", "tooltip": true }
          ],
          "apis": {
            "query": "logger/query",
            "remove": "logger/remove"
          }
        },
        /** 服务日志 service */
        {
          "name": "service",
          "title": "服务日志",
          "icon": "planar-drxx92",
          "fields": [
            { "name": "_selection" },
            { "name": "business", "text": "业务", "dict": "business_category", "filter": true },
            { "name": "action", "text": "动作", "dict": "action_category", "filter": true },
            { "name": "clientIp", "text": "访问来源", "width": 150 },
            { "name": "threadId", "text": "线程号", "width": 100 },
            { "name": "operatorName", "text": "操作员", "format":"v => v || \"系统\"" },
            { "name": "createTime", "text": "创建时间", "type": "date", "filter": { "index": 1, "mode":"default" } },
            { "name": "content", "text": "内容", "tooltip": true, "width": 400, "sort":false },
            { "name": "remark", "text": "备注", "tooltip": true }
          ],
          "apis": {
            "query": "logger/query",
            "remove": "logger/remove"
          }
        }
      ]
    }
  ],
  "webapi": {
    "mock": true,
    "apis": {
      "queryDict": {
        "path": "system/dictionary/data/query",
        "method": "GET"
      }
    }
  },
  "dict":{
    "status": {
      "1": "启用",
      "0": "禁用"
    },
    "business_category": {
      "system": "系统",
      "user": "用户",
      "account": "账号",
      "permission": "权限"
    },
    "action_category": {
      "login": "登录",
      "exception": "异常",
      "create": "创建",
      "modify": "修改",
      "remove": "删除",
      "start": "开始",
      "stop": "停止",
      "query": "查询",
      "audit": "审核",
      "reject": "驳回",
      "change-password": "修改密码",
      "reset-password": "重置密码",
      "export": "导出",
      "import": "导入"
    },
    "load_status":{
      "0":"不加载",
      "1":"加载"
    }
  }
}
```
