让开发者释放接口对接的怒火(二)【配置篇】

背景

  1. 作为后端程序员,涉及的语言非常多,当今的项目都属于集成项目,如何快速的响应接口,决定项目的效益和满意度。
  2. 后端程序员60%时间在于和数据库打交道,40%时间和bug打交道,因此企业如何拥有一套自身框架,决定了企业的生存空间,和效益空间。
  3. 当前后端接口基80%都是基于http协议,json格式来传递数据,并且它们有自身的共性,比如 项目编号、系统编号,增、删、改、查。

标准配置文件

  1. 通过相关背景,可以发现相关的共性、特性。在java、.netcore等在数据库方面有相当多的orm框架,比如 .netcore 的 dapper,sqlSugar, EF6; Java的 spring boot 中 jpa(ibatis, hibernate)等。但是orm框架简单的业务逻辑实现起来容易,但是复杂的业务实现起来就比较头疼。
  2. 比如前端需求我只要2个字段,那么后端就得再创建个对应的实体、接口等进行处理,修改完成后每次都得重新打包发布,搞不好系统发布出问题了,又得重新发布。
  3. 因此,提供一个基于json或其它文件的标准配置化开发是非常有必有的。

标准配置格式(大纲)


{
  "base": {},//基本描述
  "responseField":{},//控制输出接口数据
  "selectSql":{},//查询的数据库操作语句
  "saveSql":[],//新增、修改操作语句
  "deleteSql":{},//删除操作语句
  "columns":{},//列映射
  "dimDatas":{},//资源数据, 比如数据库性别为  0,1 ,映射为 女,男
  "ruleDb":{},//数据权限控制, 比如开启只能操作自己数据
  "rules":{}//入库验证,比如必填,范围
}

标准配置格式(完整案例)

{
  "base": {
    "connName": "ConnBo",
    "isRearEnd": true,
    "isFrontEnd": true
  },
  "responseField": {
    "brower": {
      "show": "user_id,null user_name,{geography_val},null sys_id,null role_id,null dep_id,0 sex,real_name,telephone,null user_status,bit_val,distance_val distance,json_val,is_hide_phone,create_time",
      "original": "'' account,'' role,role_val,0.0 lng,0.0 lat,view_count",
      "all": "",
      "base64": "",
      "auth": true,
      "field": {
        "enc": {
          "telephone": {
            "columnName": "telephone"
          }
        },
        "format": {
          "createTime": "yyyy-MM-dd"
        },
        "bit": {
          "bitVal": "bit_val"
        },
        "rep": {
          "telephone": [
            {
              "regex": "\\d",
              "key": "",
              "value": "#",
              "sortId": 1
            }
          ]
        },
        "doUrl": {
          "headIcon": {
            "beforeRoot": "beforeRoot:fileWebRoot",
            "beforeChar": []
          }
        },
        "doName": {
          "pushName": [
            {
              "name": "push_name",
              "path": "real_name",
              "sortId": 1
            },
            {
              "path": "email",
              "sortId": 2
            },
            {
              "path": "telephone",
              "value": "-",
              "sortId": 2
            }
          ]
        }
      },
      "dimField": [ "isHidePhone", "sex" ],
      "fieldChild": {
        "account": {
          "moduleKey": "bo-user-account",
          "responseField": "brower_detail",
          "showMethod": "childobject"
        },
        "role": {
          "moduleKey": "bo-user-role",
          "responseField": "brower_detail"
        },
        "roleVal": {
          "moduleKey": "bo-sys-role",
          "responseField": "user-role"
        }
      },
      "columns": {
        "geographyVal": {
          "geography": {
            "outPut": "lnglat" //lnglat json  geography
          }
        },
        "createTime": {
          "detailPropertie": {

          },
          "addPropertie": {

          },
          "editPropertie": {

          },
          "pagePropertie": {
            "showMethodOut": "kv" // n v kv sn
          },
          "listPropertie": {

          }
        },
        "distance": {
          "detailPropertie": {

          },
          "addPropertie": {

          },
          "editPropertie": {

          },
          "pagePropertie": {
            "showMethodOut": "kv" // n v kv sn
          },
          "listPropertie": {

          }
        }
      },
      "viewCount": [
        {
          "name": "view_count",
          "alias": "view_count",
          "field": "viewCount"
        }
      ]
    },
    "brower_detail": {
      "show": "user_id,real_name,null account,null user_status,head_icon,null user_name,telephone",
      "original": "null dep_id,null role_id",
      "all": "",
      "base64": "",
      "auth": true,
      "beforeClick": {
        "sqlUpdate": "update bo_user set max(isnull(view_count,0))+1 where user_id=@userId"
      },
      "popedom": [ "t2_user_id", "user_id", "account" ]
    },
    "person": {
      "show": "user_id,real_name,null account,head_icon,null user_name,telephone",
      "original": "",
      "all": "",
      "base64": "",
      "auth": true
    },
    "password": {
      "show": "user_id,null password,null confirm_password,null new_password",
      "original": "",
      "all": "",
      "base64": "",
      "auth": true
    },
    "register": {
      "show": "user_pwd,telephone,null verify_guid,null verify_sms,null account",
      "original": "",
      "all": "",
      "base64": "",
      "need": "userPwd,telephone,verifyGuid,verifySms"
    },
    "forget": {
      "show": "user_pwd,telephone,null verify_guid,null verify_sms,null account",
      "original": "",
      "all": "",
      "base64": "",
      "need": "userPwd,telephone,verifyGuid,verifySms",
      "where": "select max(user_id) user_id from bo_user where telephone=@telephone"
    }
  },
  "tables": [
    {
      "primaryColumn": [
        {
          "colName": "user_id",
          "field": "userId",
          "alias": "user_id"
        }
      ],
      "id": 1,
      "name": "bo_user",
      "isPrimary": true
    },
    {
      "primaryColumn": [
        {
          "colName": "user_id"
        }
      ],
      "id": 2,
      "name": "bo_user_account"
    }
  ],
  "selectSql": {
    "primaryWhere": "user_id=@userId",
    "tableName": "bo_user",
    "order": "user_id",
    "listField": "*",
    "detailField": "*"
  },
  "saveSql": [
    {
      "identityName": null,
      "tableName": "bo_user",
      "primaryColumn": [
        {
          "field": "userId",
          "isIdentity": false,
          "tableId": 1,
          "colName": "user_id"
        }
      ]
    },
    {
      "name": "1对多,部门",
      "isSaveReturnObj": false,
      "identityName": null,
      "sqlUpdate": null,
      "sqlInsert": "insert into bo_user_dep (dep_id,user_id) values(@depId,@userId)",
      "sqlDelete": " delete  from bo_user_dep where user_id=@userId",
      "dataFromColName": "depId",
      "tableName": "bo_user_dep",
      "primaryWhere": null,
      "message": null,
      "primaryColumn": [
        {
          "colName": "user_id",
          "field": "userId",
          "isIdentity": false,
          "tableId": 1
        }
      ],
      "childPrimaryColumn": [
        {
          "colName": "user_id",
          "field": "userId",
          "tableId": 1,
          "primaryColumn": "userId"
        }
      ]
    },
    {
      "name": "1对多,角色",
      "isSaveReturnObj": false,
      "identityName": null,
      "sqlUpdate": null,
      "sqlInsert": "insert into bo_user_role (role_id,user_id) values(@roleId,@userId)",
      "sqlDelete": " delete  from bo_user_role where user_id=@userId",
      "dataFromColName": "roleId",
      "tableName": "bo_user_role",
      "primaryWhere": null,
      "message": null,
      "primaryColumn": [
        {
          "colName": "user_id",
          "field": "userId",
          "isIdentity": false,
          "tableId": 1
        }
      ],
      "childPrimaryColumn": [
        {
          "colName": "user_id",
          "field": "userId",
          "tableId": 1,
          "primaryColumn": "userId"
        }
      ]
    },
    {
      "name": "1对多,系统",
      "isSaveReturnObj": false,
      "identityName": null,
      "sqlUpdate": null,
      "sqlInsert": "insert into bo_user_system (sys_id,user_id) values(@sysId,@userId)",
      "sqlDelete": " delete  from bo_user_system where user_id=@userId",
      "dataFromColName": "sysId",
      "tableName": "bo_user_system",
      "primaryWhere": null,
      "message": null,
      "primaryColumn": [
        {
          "colName": "user_id",
          "field": "userId",
          "isIdentity": false,
          "tableId": 1
        }
      ],
      "childPrimaryColumn": [
        {
          "colName": "user_id",
          "field": "userId",
          "tableId": 1,
          "primaryColumn": "userId"
        }
      ]
    },
    {
      "name": "1对1,用户账号",
      "isSaveReturnObj": false,
      "identityName": null,
      "sqlUpdate": null,
      "sqlInsert": null,
      "sqlDelete": null,
      "dataFromColName": "account",
      "tableName": "bo_user_account",
      "primaryWhere": null,
      "message": null,
      "primaryColumn": [
        {
          "colName": "user_id",
          "field": "userId",
          "isIdentity": false,
          "tableId": 1
        }
      ],
      "childPrimaryColumn": [
        {
          "colName": "user_id",
          "field": "userId",
          "tableId": 1,
          "primaryColumn": "userId"
        }
      ]
    }
  ],
  "deleteSql": {
    "join": {
      "paramName": "ids",
      "dataName": "id",
      "joinChar": ","
    },
    "exists": [],
    "delete": [
      {
        "sqlDelete": "delete from bo_user where user_id = @userId",
        "tableName": "bo_user",
        "primaryColumn": [
          {
            "field": "userId",
            "isIdentity": false,
            "tableId": 1,
            "colName": "user_id"
          }
        ]
      },
      {
        "sqlDelete": "delete from bo_user_account where user_id = @userId",
        "tableName": "bo_user_account",
        "primaryColumn": [
          {
            "field": "userId",
            "isIdentity": false,
            "tableId": 1,
            "colName": "user_id"
          }
        ]
      },
      {
        "sqlDelete": "delete from bo_user_role where user_id = @userId",
        "tableName": "bo_user_role",
        "primaryColumn": [
          {
            "field": "userId",
            "isIdentity": false,
            "tableId": 1,
            "colName": "user_id"
          }
        ]
      },
      {
        "sqlDelete": "delete from bo_user_dep where user_id = @userId",
        "tableName": "bo_user_dep",
        "primaryColumn": [
          {
            "field": "userId",
            "isIdentity": false,
            "tableId": 1,
            "colName": "user_id"
          }
        ]
      },
      {
        "sqlDelete": "delete from bo_user_system where user_id = @userId",
        "tableName": "bo_user_system",
        "primaryColumn": [
          {
            "field": "userId",
            "isIdentity": false,
            "tableId": 1,
            "colName": "user_id"
          }
        ]
      }
    ]
  },
  "columns": {
    "userId": {
      "extendAlias": "primary",
      "guidMethod": "guid_32",
      "isSearch": true,
      "tableId": 1,
      "field": "userId",
      "dataType": "varchar",
      "title": "用户ID",
      "remark": "用户ID,guid,保存时候同时操作 bo_user_account ",
      "name": "user_id",
      "alias": "user_id",
      "isRequired": true,
      "isList": true,
      "isPrimary": true,
      "isIdentity": false,
      "editPropertie": {
        "showMethod": "text"
      },
      "pagePropertie": {
        "showMethod": "text"
      },
      "maxLength": 10,
      "colDecimal": 0,
      "filter": {
        "isMust": true,
        "noValue": null,
        "method": "custom",
        "isIteration": false,
        "sql": " and user_id not in @_filterUser ",
        "dbRead": null
      }
    },
    "createTime": {
      "extendAlias": "create_time",
      "tableId": 1,
      "isDate": true,
      "field": "createTime",
      "dataType": "datetime",
      "title": "创建时间",
      "name": "create_time",
      "alias": "create_time",
      "isSearch": true
    },
    "parentId": {
      "tableId": 1,
      "field": "parentId",
      "dataType": "varchar",
      "title": "上级菜单",
      "remark": "上级菜单编码,GUID,为空表示一级菜单  测试递归查 询 ",
      "name": "parent_id",
      "alias": "parent_id",
      "isSearch": true,
      "filter": {
        "method": "iteration",
        "sql": " and menu_id in @parentId",
        "tableName": "bo_sys_menu",
        "whereSql": " ",
        "iterationId": "menu_id",
        "iterationParentId": "parent_id",
        "dbRead": null
      },
      "editPropertie": {
        "showMethod": "text",
        "type": null,
        "format": null,
        "first": [
          {
            "name": "请选择",
            "value": null
          }
        ]
      },
      "pagePropertie": {
        "showMethod": "text",
        "type": null,
        "format": null,
        "first": [
          {
            "name": "全部",
            "value": null
          }
        ]
      },
      "listPropertie": {
        "isOriginal": true,
        "isSn": true,
        "showMethod": "text",
        "type": null,
        "format": null,
        "first": [
          {
            "name": "全部",
            "value": null
          }
        ]
      },
      "dimJoin": {
        "fromDimField": "menu"
      },
      "maxLength": 36
    },
    "distance": {
      "tableId": 1,
      "field": "distance",
      "dataType": "varchar",
      "title": "距离",
      "remark": "计算2点之间距离",
      "name": "distance_val",
      "alias": "distance",
      "isData": false,
      "editPropertie": { "showMethod": "text" },
      "pagePropertie": {
        "showMethod": "text"
      },
      "maxLength": 36,
      "range": [
        {
          "min": 0,
          "max": 1000,
          "format": "f0",
          "unit": "m"
        },
        {
          "min": 1000,
          "format": "f1",
          "unit": "km",
          "divisor": 1000
        }
      ],
      "placeholder": "-"
    },
    "jsonVal": {
      "tableId": 1,
      "field": "jsonVal",
      "dataType": "varchar",
      "title": "json",
      "remark": "json,json字符串{icon:true,hidden:true}",
      "name": "json_val",
      "alias": "json_val",
      "editPropertie": { "showMethod": "text" },
      "pagePropertie": { "showMethod": "json" },
      "listPropertie": { "showMethod": "json" },
      "maxLength": 1000
    },
    "role": {
      "tableId": 1,
      "filter": {},
      "isSearch": false,
      "isNull": false,
      "field": "role",
      "name": "role",
      "title": "角色信息",
      "dataType": "varchar",
      "dimJoin": {
        "fromDimField": null
      },
      "isData": false,
      "editPropertie": {
        "showMethod": "child"
      },
      "pagePropertie": {
        "showMethod": "childarray"
      },
      "childTable": {
        "isDyh": false,
        "joinChar": ",",
        "textColName": "role_name",
        "valueColName": "role_id",
        "row": {
          "primaryColName": "user_id",
          "foreginColName": "user_id"
        }
      }
    },
    "roleVal": {
      "tableId": 1,
      "filter": {},
      "isSearch": false,
      "isNull": false,
      "field": "roleVal",
      "name": "role_val",
      "alias": "role_val",
      "title": "角色信息",
      "dataType": "varchar",
      "dimJoin": {
        "fromDimField": null
      },
      "isData": false,
      "editPropertie": {
        "showMethod": "childarray"
      },
      "pagePropertie": {
        "showMethod": "childstring"
      },
      "childTable": {
        "isDyh": false,
        "joinChar": ",",
        "textColName": "role_name",
        "valueColName": "role_id",
        "row": {
          "primaryColName": "user_id",
          "foreginColName": "role_id",
          "fromJoinChar": ",", //如果没有设置,使用 primaryColName
          "fromIgnoreChar": "'"
        }
      }
    },
    "isHidePhone": {
      "extendAlias": "is_if0",
      "tableId": 1,
      "field": "isHidePhone",
      "dataType": "int",
      "title": "隐藏手机号",
      "name": "is_hide_phone",
      "alias": "is_hide_phone",
      "isList": false,
      "maxLength": 10,
      "colDecimal": 0
    },
    "sex": {
      "extendAlias": "sex",
      "tableId": 1,
      "field": "sex",
      "dataType": "varchar",
      "title": "性别",
      "remark": "性别,可选值:男(1),女(0)",
      "name": "sex",
      "alias": "sex",
      "isList": false,
      "maxLength": 2
    },
    "account": {
      "tableId": 1,
      "filter": {},
      "isSearch": false,
      "isNull": false,
      "field": "account",
      "name": "account",
      "title": "账号信息",
      "dataType": "varchar",
      "dimJoin": {
        "fromDimField": null
      },
      "isData": false,
      "editPropertie": {
        "showMethod": "childobject"
      },
      "pagePropertie": {
        "showMethod": "childobject"
      },
      "childTable": {
        "isDyh": false,
        "joinChar": ",",
        "row": {
          "primaryColName": "user_id",
          "foreginColName": "user_id"
        }
        //,
        //"primaryColumn": [
        //  {
        //    "colName": "user_id", //, 主表主键列 或者 主表里面存放子表的字段列
        //    //"field": "user_id" //, 如果为null。 colName 对应 (主表里面存放子表的字段列)
        //    "primaryColumn": "user_id" //子表主键
        //  }
        //]
        //,
        //"sql": "select {list_field} from bo_user_account where user_id in @_filterPrimaryIds"
      }
    },
    "geographyVal": {
      "tableId": 1,
      "field": "geographyVal",
      "dataType": "geography",
      "title": "地理位置",
      "name": "geography_val",
      "alias": "geography_val",
      "isData": true,
      "geography": {
        "type": "point",
        "geography": "geography",
        "outPut": "lnglat" //lnglat json 
      },
      "editPropertie": { "showMethod": "text" },
      "pagePropertie": { "showMethod": "text" },
      "maxLength": -1
    },
    "lng": {
      "extendAlias": "lng",
      "tableId": 1,
      "field": "lng",
      "dataType": "numeric",
      "title": "经度",
      "name": "lng",
      "alias": "lng",
      "maxLength": 18,
      "colDecimal": 15
    },
    "lat": {
      "extendAlias": "lat",
      "tableId": 1,
      "field": "lat",
      "dataType": "numeric",
      "title": "纬度",
      "name": "lat",
      "alias": "lat",
      "maxLength": 17,
      "colDecimal": 15
    }
  },
  "dimDatas": {
    "system": {
      "extendKey": "system"
    },
    "sysEnum": {
      "extendKey": "sysEnum"
    },
    "department": {
      "extendKey": "department"
    },
    "role": {
      "allSql": "select tb_d.ROLE_NAME name,tb_d.ROLE_ID id,0 parent_Id,tb_d.ROLE_ID value from bo_sys_role tb_d ",
      "name": "角色"
    }
  },
  "ruleDb": {
    "sql": "select user_name name,user_id value from bo_user_account where user_id in @_filterUser and ({primary_where_sql})",
    "where": " or user_id=@userId",
    "field": "sysId",
    "value": null
  },
  "rules": {
    "realName": [
      {
        "type": "maxlength",
        "max": 20,
        "isEdit": true,
        "isAdd": true,
        "message": "【真实姓名】最大长度为20。"
      }
    ],
    "telephone": [
      {
        "type": "maxlength",
        "max": 11,
        "isEdit": true,
        "isAdd": true,
        "message": "【手机号码】最大长度为11。"
      },
      {
        "type": "mobile",
        "max": 11,
        "isEdit": true,
        "isAdd": true,
        "message": "【手机号码】格式不正确。"
      },
      {
        "type": "remote",
        "url": "~/bo/api/v1/{mkey}/remote/unique?ownerId={ownerId}&rule={rule}&{rule}={{rule}}",
        "sql": "select count(telephone) from bo_user where telephone=@telephone",
        "isAdd": true,
        "isEdit": false,
        "message": "【手机号码】已存在。"
      }
    ],
    "idCard": [
      {
        "type": "maxlength",
        "max": 36,
        "message": "值【idCard】最大长度为36。"
      }
    ],
    "sex": [
      {
        "type": "maxlength",
        "max": 2,
        "message": "值【sex】最大长度为2。"
      }
    ],
    "email": [
      {
        "type": "maxlength",
        "max": 200,
        "message": "值【邮箱】最大长度为200。"
      },
      {
        "type": "remote",
        "url": "~/bo/api/v1/{mkey}/remote/unique?ownerId={ownerId}&rule={rule}&{rule}={{rule}}",
        "sql": "select count(email) from bo_user where email=@email",
        "isAdd": true,
        "isEdit": true,
        "message": "【邮箱】已存在。"
      }
    ],
    "address": [
      {
        "type": "maxlength",
        "max": 500,
        "message": "值【address】最大长度为500。"
      }
    ],
    "remark": [
      {
        "type": "maxlength",
        "max": 500,
        "message": "值【remark】最大长度为500。"
      }
    ],
    "sortId": [
      {
        "type": "digits",
        "message": "值【sortId】必须是整数。"
      }
    ],
    "pinYin": [
      {
        "type": "maxlength",
        "max": 100,
        "message": "值【pinYin】最大长度为100。"
      }
    ],
    "headIcon": [
      {
        "type": "maxlength",
        "max": 200,
        "message": "值【headIcon】最大长度为200。"
      }
    ],
    "isHidePhone": [
      {
        "type": "digits",
        "message": "值【isHidePhone】必须是整数。"
      }
    ],
    "userName": [
      {
        "type": "required",
        "message": "【用户名】值必须填写。",
        "refField": "account",
        "required": true,
        "isAdd": true,
        "isEdit": true
      },
      {
        "type": "maxlength",
        "max": 50,
        "isEdit": true,
        "isAdd": true,
        "refField": "account",
        "message": "【用户名】最大长度为50。"
      },
      {
        "type": "remote",
        "url": "~/bo/api/v1/{mkey}/remote/unique?ownerId={ownerId}&rule={rule}&{rule}={{rule}}",
        "sql": "select count(user_name) from bo_user_account where user_name=@userName",
        "refField": "account",
        "isAdd": true,
        "isEdit": true,
        "message": "【用户名】已存在。"
      }
    ],
    "userPwd": [
      {
        "type": "maxlength",
        "max": 100,
        "message": "值【userPwd】最大长度为100。"
      }
    ],
    "userStatus": [
      {
        "type": "digits",
        "message": "值【userStatus】必须是整数。"
      }
    ],
    "unlockTime": [
      {
        "type": "date",
        "message": "值【unlockTime】时间格式不对。"
      },
      {
        "type": "number",
        "message": "值【unlockTime】必须是数值类型。"
      }
    ],
    "errorCount": [
      {
        "type": "digits",
        "message": "值【errorCount】必须是整数。"
      }
    ],
    "isDeveloper": [
      {
        "type": "digits",
        "message": "值【isDeveloper】必须是整数。"
      }
    ],
    "clientId": [
      {
        "type": "maxlength",
        "max": 50,
        "message": "值【clientId】最大长度为50。"
      }
    ],
    "isMultipleLogin": [
      {
        "type": "digits",
        "message": "值【isMultipleLogin】必须是整数。"
      }
    ],
    "password": [
      {
        "type": "required",
        "message": "【原始密码】值必须填写。",
        "required": true,
        "isAdd": true,
        "isEdit": true
      }
    ],
    "newPassword": [
      {
        "type": "required",
        "message": "【新密码】值必须填写。",
        "required": true,
        "isAdd": true,
        "isEdit": true
      }
    ],
    "confirmPassword": [
      {
        "type": "required",
        "message": "【确认密码】值必须填写。",
        "required": true,
        "isAdd": true,
        "isEdit": true
      }
    ],
    "verifyCode": [
      {
        "type": "required",
        "message": "【验证码】值必须填写。",
        "required": true,
        "isAdd": true,
        "isEdit": true
      },
      {
        "type": "verifycode",
        "message": "【验证码】无效。",
        "required": true,
        "isAdd": true,
        "isEdit": true
      }
    ],
    "verifySms": [
      {
        "type": "required",
        "message": "【验证码】值必须填写。",
        "required": true,
        "isAdd": true,
        "isEdit": true
      },
      {
        "type": "verifysms",
        "message": "【验证码】无效。",
        "required": true,
        "isAdd": true,
        "isEdit": true
      }
    ]
  }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值