Coder Social home page Coder Social logo

pont's Introduction

Pont logo

Pont - 搭建前后端之桥

npm version npm downloads GitHub license Gitter

Pont Process

pont 在法语中是“桥”的意思,寓意着前后端之间的桥梁。Pont 把 swagger、rap、dip 等多种接口文档平台,转换成 Pont 元数据。Pont 利用接口元数据,可以高度定制化生成前端接口层代码,接口 mock 平台和接口测试平台。

其中 swagger 数据源,Pont 已经完美支持。并在一些大型项目中使用了近两年,各种高度定制化需求都可以满足。

Pontx 用户请访问 Pontx

✨特性

  • 跨语言 天然支持 Javascript 项目及 Typescript 项目。如果使用 JavaC++ 等语言,可定制代码生成器支持
  • 支持高度定制化 通过复写内部方法,各种高度定制化需求都可以满足
  • VSCode 插件支持 专门为 Pont 开发的 VSCode 插件 vscode-pont,完美支持 Pont 所有能力
  • 丰富的命令行提供丰富的命令行命令,满足不同场景的使用
  • 自动化 mocks 服务Pont 自动生成所有 mocks 数据,并提供所有接口的 mocks 服务

⚡快速开始

1. 安装

全局安装 pont-engine

# 选择一个你喜欢的包管理器

# NPM
$ npm i -g pont-engine

# Yarn
$ yarn global add pont-engine

# pnpm
$ pnpm add -g pont-engine

2. 初始化

使用 pont start 命令,快速创建初始模板 test9.gif

3. 安装 VSCode 插件

打开 VSCode 插件商店,输入 vscode-pont 搜索安装 image.png

4. 沉浸式接口开发

插件安装成功后,点击 Pont 图标,打开面板进行进一步操作。更多插件相关请参考 插件文档 image.png

点击接口代码片段图标,打开接口列表,搜索后生成接口代码片段,快速开始接口开发 test12.gif

5. 联调维护

实时发现后端接口更新 image.png 更新接口层后,可迅速定位接口调用代码,进行调用修改。 image.png

6. 自定义

Pont 支持自定义数据获取 、数据源预处理、自定义代码生成器等。请参考 定制化 Pont

7. 提示

  • 确保服务端使用 Swagger(目前只支持 Swagger V2、V3),提供的数据源接口是免登录的。如果不是,请后端帮忙简单配置一下,或者使用 fetchMethodPath 配置,通过自定义数据获取来获取带鉴权的接口的文档。
  • 若需替换默认的请求信息,请参阅 pontCore

🔍 文档

命令行

标准数据源模型

pont-config.josn 配置项

定制化 Pont

VSCode 插件

自动化 mocks 服务

mocks.enable 配置为 true,pont 将自动生成所有 mocks 数据,并提供所有接口的 mocks 服务。此外 IDE 提供如下功能

  • 右键 pont 接口代码,可以跳转(jump to mock position)去编辑接口的 mocks 数据
  • 右键 pont 接口代码,可以访问(visit mocks interface) GET 类型的 mocks 接口。

mocks 自动生成所有 mocks 数据,你也可以自由更新 mocks 数据,支持 mockjs 语法更新 mocks 数据。

demo

参考下面的例子,来体验 pont。

👍 最佳实践

  • 项目 pre-commit hook 中,加上 pont check,防止本地数据源被研发人员损坏。
  • 很多 Swagger 所有的接口返回的类型都类似是 Result,主要是囊括了约定的接口错误字段,类似 { errorCode: 0, data: T, errMessage: '' }。这里建议,让后端 Swagger 的接口返回类型,去掉这个 Result 外壳。只返回 data 的 T 类型。
  • vscode 配置 trigger suggest 的快捷键(cmd K + cmd S),传参时,用快捷键触发提醒,非常好用;
  • pont template 配置 API、defs 为全局变量;这样不需要 import 任何接口、实体类;使用 API 直接触发建议找到 模块、接口,非常方便
  • 快捷键 cmd + ctrl + p 进行接口查找,非常方便;
  • 善于利用实体类(defs),可以当成类型用、也可以作为逻辑实现的辅助;实体类是后端写得实体类,前端自己写实体类,既没有必要,长期来看也会和后端的实现差异越来越大。如果有自定义逻辑,继承 defs 实体类即可。
  • redux 项目,建议结合 https://github.com/nefe/iron-redux,一个致力类型完美和去冗余的轻量化 redux 库。例如类型友好的,运行安全的 get 方法:https://github.com/nefe/iron-redux#safeget

❓常见问题

  1. demo 中,生成代码的 pontFetch 函数,是要自己实现的吗? 答:pontFetch 是用户自己项目的请求公共方法。因为每个项目的接口有自己的业务逻辑,比如如何判断接口返回的结果是否正确,所以 pont 的默认模板并没有自己实现一套 fetch 方法。另外 Pont 生成的代码是可以用自定义模板配置的。可以在模板上更改 pontFetch 的引用路径和名字。
  2. nestjs 搭配的 Swagger JSON 生成出来的 pont 文件为什么没有 mods? 答:nestjs 中的 Swagger 必须在每个 Controller 上添加 ApiUseTags 装饰器,并且在每个控制器的方法上添加 ApiOperation 装饰器 才能正确输出带 Tags 以及 operationId 的 Swagger JSON。Tags 和 operationId 是 pont 必需的(@nestjs/swagger 自动生成的 default Tags 暂时不被兼容)。 示例如下 (@nestjs/swagger@^3) 对于 @nestjs/swagger@^4,需要如下配置来手动注册 Tag
import { Controller } from '@nestjs/common';
import { ApiUseTags, ApiOperation, ApiOkResponse } from '@nestjs/swagger';

@ApiUseTags('pet')
@Controller('pet')
export class PetController {
  @ApiOperation({ title: 'getDog', operationId: 'getDog' })
  @Get()
  getDog() {}
}
// ...
const options = new DocumentBuilder().setTitle('your app').addTag('pet').build();
const document = SwaggerModule.createDocument(app, options);
SwaggerModule.setup('/api', app, document);
  1. API、defs 全局变量找不到 答:将 pont 生成的 api.d.ts 塞到 tsconfig.json 中的 includes 数组最前面。并在项目入口处 import pont 生成的入口文件。
{
  "compilerOptions": {
    "allowJs": true,
    "checkJs": true,
    "outDir": "./**"
  },
  "include": ["./services/api.d.ts", "./src"],
  "exclude": []
}

其它接口平台接入

目前 pont 支持 Swagger V2 V3 三种数据源。其他类型数据源只需要在 scripts 中添加对应的数据格式转换文件,把对应数据格式转换为 pont 标准格式,即可适配新的数据源类型。希望社区可以踊跃贡献代码,接入更多类型的数据源!

钉钉用户群

群号:33661609

🎉 谁在使用

我们在这里列出了部分使用者,如果你的公司和产品使用了 Pont,欢迎到 这里 留言。

pont's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pont's Issues

阿里数据中台前端团队-招聘

前端招聘火热进行中

我们团队(阿里巴巴数据中台前端团队)正在招聘资深前端开发工程师/前端开发专家,当然如果你对我们正在做的事有兴趣,欢迎随时勾搭!🔥🔥🔥欢迎2020届本科或研究生投递简历,可实习!

关键字: 大数据、React、Angular、可视化
招 P6、P7、P8

关于阿里大数据

我们是来自阿里巴巴集团数据技术及产品部(DT)的新能源新行业团队。

作为阿里巴巴的数据中台,DT 负责了阿里集团统一的大数据平台,不仅为阿里集团内外几乎所有核心业务线的小二、商家、合作伙伴、社会大众,而且积极响应国家大数据战略,围绕政企客户,思考智能数据解决方案,为其提供全年无休的7*24小时稳定、高效、可靠的大数据解决方案服务!

而未来,我们着眼于未来5-10年的发展远景,结合国家大数据战略思考大数据商业化,致力于对大数据基础建设有需求者、对大数据应用创新有供求者、对企业及产业变革有想法和行动者,顶层设计充分思考云计算+大数据+人工智能:思考基于公有云和专有云云计算,基于阿里集团实战成功经验,联合阿里集团数据中台力量,思考如何将数据中台力量行业化、升级其产品技术赋能政企客户。

我们在做什么

在摸爬滚打多年成功治理了阿里巴巴集团超过 EB 级(1EB = 1024 PB)数据之后,我们正在把阿里巴巴的大数据处理经验封装为成熟的解决方案,直接赋能给亟需大数据能力的大型企业、政府机关等。

因此,当你参与到这款产品的开发过程中时,你不仅仅是在写代码做需求,更是在学习阿里巴巴许多大数据专家经过多年沉淀下来的宝贵经验。

关于前端团队

我们大概是国内最早一批接触并坚定使用 React (2014 年中)和 Redux(2015 年中)技术栈的团队,我们见证了 React 从 0.10.0 到 16.0.0 的进步,也经历了 React Router 升级重构的阵痛(你懂的)。

无论怎样,我们坚定的认同 React + Redux 带来的 predictability 以及生态的给力发展。

除了最新最爽的技术栈,我们还是开源社区的坚定拥趸:recharts、You Don't Need jQuery、react-lazyload……

如果你的代码中添加过这些依赖,背后就有我们团队同学的默默付出。

opensource

在业务开发的同时,团队内部每月都有定期的技术分享。

当然,如果上面说的这些都不够令你心动.

我们的业务只兼容最新的 Chrome!

关于你

说了这么多,可能你对本职位的要求还有一些疑问,下面是我们希望你具有的能力:

  • 无硬性工作年龄限制,精通各种 Web 前端技术和标准,熟练掌握 ES2015 语法;
  • 至少掌握React、Vue等一种主流框架,能独立开发高质量组件;
  • 熟悉SVG、Canvas等前端绘图技术,有大数据可视化开发经验优先考虑;
  • 主动、皮实、聪明、担当,有良好的沟通和团队协作能力,持续推动拿结果;
  • 喜欢钻研技术,能够快速掌握和应用新技术,有开源项目贡献经验优先考虑。

关于工作地址

工作地址:杭州,北京,上海可选

这是一次非常难得的机会,用最酷的技术一起来打造顶尖的产品,快把简历发过来吧,扫描钉钉二维码入群发简历

部分body参数的类型会丢失

swagger 描述
图片

生成的api-lock描述
图片

swagger里面的body标注了参数类型为Array<string>,但是生成之后却没有类型信息了

修复默认模板中base class的命名问题

如果后端的controller命名中存在-,例如basic-resource,那么最终生成的baseClass里面会有这样的代码:

export const basic-resource = {
// 省略若干代码
}

事实上上面的basic-resource在TS或者JS里面是非法命名,解决方案:使用lodash将名称驼峰化。

需求: 顶级名字空间 defs, API 应开放到模板中,由模板控制导出方式

存在的问题:

defs, API 默认是以全局变量的方式声明的,并且在代码中写死为 "declare namespace "方式,这样不太灵活,

建议:

declare namespace defsdeclare namespace API 也开放到模板中,允许用户自定义, 比如 export namespace defs , export namespace API

// generate.ts 

  getSourcesFileStructures() {
    const dataSources = {};

    this.generators.forEach(generator => {
      const ds = generator.dataSource;
      let { getBaseClassesInDeclaration, getModsDeclaration } = generator;
      getBaseClassesInDeclaration = getBaseClassesInDeclaration.bind(generator);
      getModsDeclaration = getModsDeclaration.bind(generator);

      generator.getBaseClassesInDeclaration = () => `
        declare namespace defs {
          export ${getBaseClassesInDeclaration()}
        }
      `;
      generator.getModsDeclaration = () => `
        declare namespace API {
          export ${getModsDeclaration()}
        }
      `;
      const dsFiles = this.getSingleFileStructures(generator);

      dataSources[ds.name] = dsFiles;
    });

    dataSources['index.ts'] = this.getDataSourcesTs.bind(this);
    dataSources['api.d.ts'] = this.getDataSourcesDeclarationTs.bind(this);

    return dataSources;
  }

Proposal:可自定义OriginBaseReader中的fetch方法

当前版本获取api文档的的方法目前不能自定义,
如果文档需要登录才能查看就获取不到了,

目前可以做的是

  • 后端把去掉鉴权限制

    这样就会把接口文档暴露到公网上,不安全

  • 设置为内网不鉴权

    这样的话不在公司开发的话就必须连VPN了,不是很方便

如果可以自定义OriginBaseReader中的fetch方法,就可以自己实现登录过程, 自定义请求,甚至可以用本地文件,只要这个fetch方法是个

(url: string) => Promise<string> 

类型的方法就可以了
类似这样

class MyOriginBaseReader extends OriginBaseReader {

  // 这个方法可在template中自定义
  async fetchMethod(url): Promise<string>  {
     const response = await axios.post('/api/tokens',  {
          password: xxx,
          username: xxx,
     })
     
     return axios.get('https://petstore.swagger.io/v2/swagger.json', {
       headers: {
          Authorization:response.data.token,
       },
     })
  }

  // OriginBaseReader中的这个方法只要调用自定义的方法即可
  async fetchData() {
     const response = await this.fetchMethod(this.config.url)
     ...
  }
}

Pont Contributor 招募

Pont Contributor 招募

Pont 开源后,使用的项目越来越多。然而现有 Contributor 业余时间有限,Pont 维护,Roadmap 推进也难以为继。

如果你认同 Pont 的价值,欢迎成为 Pont Contributor 的一员。你可以挑选感兴趣的技术点,一起推进 Pont Roadmap。让 Pont 能够在更多项目中放大价值,大放异彩,让我们在开源建设中一起成长。

Pont Contributor 小组运作规则

  • 模块分工,负责人不重复;

  • 任何 PR 需要 Code Review 才能合并;

  • 功能变动及设计需要 Contributor 小组达成一致;新功能必须新增单测。

有兴趣可以添加 Pont 钉钉交流群联系我。

pont不支持 swagger V3

最新的swagger采用openAPI,跟swagger v2的字段差别较大,目前的pont 不能使用。

可以看一下我的接口爬取工具 只有四个命令 适应任何接口

https://github.com/fangkyi03/apiGeneration

apiGeneration

爬取接口数据 并且转换成本地的js文件 进行接口补全

示例代码

const api = require('apibuildtool')

api.init(__dirname + '/demo.js')

/**
 * 初始化获取网络请求数据
 * 
 * @param {any}  
 */
function getInitalNetWorkData() {
    const data = require('./api.json')
    // 这里使用模拟的api接口数据来实现 如果你想要自己的swagger生成接口说明的话 
    // 只需要这边改成对应的axios将返回的数据结构化即可
    const pathsKeys = Object.keys(data.paths)
    pathsKeys.forEach((ea) => {
        const methodKeys = Object.keys(data.paths[ea])
        methodKeys.forEach((eb) => {
            const select = data.paths[ea][eb]
            api.createApiTarget(select.tags[0])
            api.createApiChildren(select.tags[0], {
                url: ea,
                isUrl: false,
                name: select.operationId + '_' + eb.toUpperCase(),
                params: {},
                method: eb.toUpperCase(),
                description:select.description
            })
        })
    })
    api.build()
}

getInitalNetWorkData()

使用例子

import Taro, { Component } from '@tarojs/taro'
import { View, Text } from '@tarojs/components'
import './index.scss'
import api from '../../command/api';
import { connect } from '@tarojs/redux';

@connect(({Index})=>({Index}))
export default class Index extends Component {

  config = {
    navigationBarTitleText: '首页'
  }

  componentWillMount () { }

  componentDidMount () { 
    //开始进行网络请求
    api.send(this,[
      // onCallBack onError,tranData 都不是必须项 可以根据自己的条件选择
      api.pet('目标modelName 可以不填').addPet_POST('当前接口需要传的参数 默认可不传')({
        // 单条网络请求成功回调
        // 符合成功的要求可以在app.js的onGLNetStart中自行设置符合条件
        onCallBack:({retData})=>{
        },
        // 单条网络请求的错误处理
        // 如果这个网络请求不符合onGLNetStart的条件就会进入这里
        // 当你这边写了onError以后 全局统一的那个错误处理将不会被使用
        // 情况特殊的时候 如删除等 你可以直接在onError中return 这种方式也会帮助你刷新model
        onError:({retData})=>{

        },
        // 单条网络请求数据转换的地方
        // 如果你想对数据进行转换 可以写在这里 因为在send里面可以同时写多个接口请求
        // 每个接口请求可以绑定同一个model 那么这样的话 接口返回的结构有可能都是data这样的
        // 那么同一个model中字段就会重名 所以你可以在这边重命名一下
        // 或者是后台返回的数据结构不符合实际需求的时候 这边需要重构一下的 也可以在这里写
        tranData:({data})=>{

        }
      })
    ])
  }

  componentWillUnmount () { }

  componentDidShow () { }

  componentDidHide () { }

  render () {
    return (
      <View className='index'>
        <Text>Hello world!</Text>
      </View>
    )
  }
}

配合我修改以后的dva 可以非常轻松的对接口进行管理
https://github.com/fangkyi03/dvajs

Pont 自动化 mocks 服务和接口变更记录内测

Pont 自动化 mocks 服务和接口变更记录内测

1、安装 0.1.80 版本,使用下图方式,可以安装老版本(最新是 0.2.0)
image

2、插件启动后,会自动开启一个mocks服务,根据 Pont 元数据生成原始 mocks 数据。开发人员也可以在 .mocks/mock.ts 下编辑自定义 mock 数据。

3、可以在 pont-config.json 中 配置 mocks 字段来配置如下信息:


    "mocks": {
      "type": "object",
      "description": "自动化mock服务,mocks 数据可以在 .mocks/mocks.ts 下自定义编辑。",
      "properties": {
        "enable": {
          "type": "boolean",
          "default": true,
          "description": "是否开启"
        },
        "host": {
          "type": "number",
          "default": 8080,
          "description": "mock服务端口号"
        },
        "wrapper": {
          "type": "string",
          "description": "是否把接口返回的数据包在固定格式下, {response} 表示返回数据结构",
          "default": "{\"code\": 0, \"data\": {response}, \"message\": \"\"}"
        },
        "basePath": {
          "type": "string",
          "default": "",
          "description": "接口基础路径"
        }
      }
    },

4、可以在接口使用处,右键点击 jump to mocks position 跳转到接口 Mocks 数据位置,直接进行编辑
屏幕快照 2019-05-10 20 48 35

关于mods下面的ts文件import问题

在mods下面的ts文件中,有一个
import pontFetch from src/utils/pontFetch
但是src 下面文件夹根本就没有utils这个文件夹,导致编译报错

剩余 monorepo 改造内容

目前monorepo的改造工作只做了文件的迁移和lerna的引入,和PR同学讨论了之后觉得后续通过几个PR持续更新更好,避免单个PR内容过大

目前的发布方式还是手动cd到对应的package下,维持原有的发布方式

后续剩余工作量还比较多

  • 全局依赖迁移
  • lerna体系发布
  • 补充UnitTest

Originally posted by @linningmii in #99 (comment)

bug: 入参是范型的情况被过滤掉了

当请求参数如下面这种情况,会丢失入参

"parameters": [{
                    "in": "body",
                    "name": "body",
                    "description": "requestParamVo",
                    "required": true,
                    "schema": {
                        "$ref": "#/definitions/RequestParamVo«QueryTheUserBillRequestDate»"
                    }
                }],

修复 swagger.ts

 // 校验所有接口参数,如果是 body,body 指向的 BO 是否存在
  mods.forEach(mod => {
    mod.interfaces.forEach(inter => {
      inter.parameters = inter.parameters.filter(param => {
        if (param.in === 'body') {
          const dataType = param.dataType.reference;

          let ref = dataType.includes('defs.')
            ? dataType.slice(dataType.indexOf('.') + 1)
            : dataType;

          // 如果 ref = "Foo<defs.Bar>" 则 ref = Foo
          if (ref.includes('<')) ref = ref.slice(0, ref.indexOf('<'))

          if (
            ref &&
            !baseClasses.find(
              base => base.name === ref || base.justName === ref
            )
          ) {
            // 这种情况应抛出异常,防止丢失入参?
            return false;
          }
        }

        return true;
      });
    });
  });

当 param.in === 'body' 为真的情况下,还要过滤是否有必要,如果过滤的话必须会丢失参数

Pont Roadmap: 2020

建设模板中心,内置 generator

  • 1、内置不同框架,语言的 template,让用户来选。一方面降低用户使用成本,一方面把模板最佳实践分享出来,充分发挥 pont 优势。内置 React 模板提供 hooks 接口,提供接口 preload 能力。
  • 2、fetcher 方法可配置,用户使用零成本。
  • 3、把 .ts + .d.ts 改成 .js + .d.ts,以提供给 Javascript 项目使用。让 Javascript 项目也可以使用 pont 并享受类型。
  • 4、代码懒生成 (现在是全量删除后所有文件重新生成)
  • 5、吸引社区共享共建模板。
  • 6、内置支持 Js、Android Java、Angular Ts,Redux Ts, Vue Nuxt Ts 等常用语言和框架的接口层生成

接入更多数据源类型。

  • Swagger 1.x;Swagger 3.x 已接入
  • mtop 接入。

Mock平台及接口测试平台,完善 Pont 生态。

  • 开放基于 pont 的 mocks 平台及测试平台。

补充 Pont 和 vscode-pont 文档及Demo

其它 IDE 支持,如 WebStorm

补充自动化测试

  • 当前测试用例过少。需要增加。

bug: 多数据源的情况下, 泛型类 类型声明不正确

// pont-config.json
{
    "outDir": "services",
    "templatePath": "./pontTemplate",
    "origins": [{
        "originUrl": "http://localhost:8080/api-docs1.json",
        "name": "api1"
    }, {
        "originUrl": "http://localhost:8080/api-docs1.json",
        "name": "api2"
    }]
}

image

data属性的类型应该为 T0

自定义代码生成器文档404

What happens(发生了什么)?

自定义代码生成器文档404

Mini Showcase Repository(迷你展示库)

Provide a mini GitHub repository which can reproduce the issue(提供一个可以重现问题的小型 Github 存储库).

How To Reproduce(如何重现)

Steps to reproduce the behavior(重现行为的步骤): 1. 2.

Expected behavior(预期行为) 1. 2.

Context(上下文)

  • pont Version:
  • Node Version:
  • Platform(操作系统平台):

点击generte和sync生成数据错误。

点击generte提示
TypeError: Cannot read property 'dataSource' of undefined
点击sync提示
Error: 读取远程接口数据失败!Error: compiler error in defname: PagingData«结算单(日结)»

compiler error in defname

获取远程数据中...
自动翻译中文基类中...
自动翻译中文基类完成!
远程数据获取成功!
Error: 读取远程接口数据失败!Error: compiler error in defname: create.AccountGroupRelationCreate
at SwaggerV2Reader. (/Users/zhaozhaoqian/projects/gs_cloud_swagger_api/node_modules/pont-engine/lib/scripts/base.js:81:23)
at Generator.next ()
at fulfilled (/Users/zhaozhaoqian/projects/gs_cloud_swagger_api/node_modules/pont-engine/lib/scripts/base.js:4:58)
at process._tickCallback (internal/process/next_tick.js:68:7)
Error: 读取远程接口数据失败!Error: compiler error in defname: create.AccountGroupRelationCreate

defname 中目前不支持一些特殊字符

bug: 范型类声明出错

swagger.json

"paths" :{
"/api/core/asset/credit/query/queryDueRepayCustomer": {
            "post": {
                "tags": [
                    "credit-query-controller"
                ],
                "summary": "分页查询还款日为当天的用户信息",
                "description": "分页查询还款日为当天的用户信息",
                "operationId": "queryDueRepayCustomerUsingPOST",
                "consumes": [
                    "application/json;charset=UTF-8"
                ],
                "produces": [
                    "application/json;charset=UTF-8"
                ],
                "parameters": [{
                    "in": "body",
                    "name": "body",
                    "description": "requestParamVo",
                    "required": true,
                    "schema": {
                        "$ref": "#/definitions/RequestParamVo«QueryTheUserBillRequestDate»"
                    }
                }],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/DataTransOutput«LimitedDateVo«List«CheckTheRepaymentDateForInformation»»»"
                        }
                    },
                    "201": {
                        "description": "Created"
                    },
                    "401": {
                        "description": "Unauthorized"
                    },
                    "403": {
                        "description": "Forbidden"
                    },
                    "404": {
                        "description": "Not Found"
                    }
                }
            }
        }
},
"definitions": {
"DataTransOutput«LimitedDateVo«List«CheckTheRepaymentDateForInformation»»»": {
            "type": "object",
            "required": [
                "transCode",
                "transMessage",
                "transMessageDetail"
            ],
            "properties": {
                "data": {
                    "description": "返回数据",
                    "$ref": "#/definitions/LimitedDateVo«List«CheckTheRepaymentDateForInformation»»"
                },
                "transCode": {
                    "type": "integer",
                    "format": "int32",
                    "description": "错误码。\n100000 成功\n200000 入参不合法\n400000 权限不足\n500000 服务失败"
                },
                "transMessage": {
                    "type": "string",
                    "description": "错误信息。成功:“成功” 失败:“失败对应的msg”"
                },
                "transMessageDetail": {
                    "type": "string",
                    "description": "信息详情”"
                }
            },
            "description": "带数据的返回数据"
        },
}

json如上的情况, 类型声明不正确

api.d.ts

  export class DataTransOutput<T0> {
    /** 返回数据 */
    // 应该为  data?: T0
    data?: defs.LimitedDateVo<Array<defs.CheckTheRepaymentDateForInformation>>;

    /** 错误码。
100000 成功
200000 入参不合法
400000 权限不足
500000 服务失败 */
    transCode?: number;

    /** 错误信息。成功:“成功” 失败:“失败对应的msg” */
    transMessage?: string;

    /** 信息详情” */
    transMessageDetail?: string;
  }

临时解决方案

修复 swagger.ts

  static swaggerSchema2StandardDataType(
    schema: Schema,
    templateName = '',
    originName = '',
    isResponse = false,
  ) {
    const { items, $ref, type } = schema;
    let primitiveType = schema.type as string;

    if (type === 'array') {
      primitiveType === _.get(items, 'type', '');

      if (primitiveType === 'array') {
        primitiveType = '';
      }
    }

    if (primitiveType === 'object') {
      primitiveType = '';
    }

    if (primitiveType === 'integer') {
      primitiveType = 'number';
    }

    if (primitiveType === 'file') {
      primitiveType = 'File';
    }

    let reference = generateTemplate(
      $ref || _.get(items, '$ref', ''),
      originName
    );

    if (reference === 'Model') {
      reference = '';
    }

    if (reference === 'Array') {
      primitiveType = 'any[]';
      reference = '';
    }

    let isTemplateRef = false;
    if (
      (reference && reference === templateName)
      || reference === 'defs.' + templateName
      || reference === 'defs.' + originName + '.' + templateName
      //   临时解决方案,处理当 reference= "LimitedDateVo«List«CheckTheRepaymentDateForInformation»»"
      //  templateName = "LimitedDateVo" 的情况
      || (reference.startsWith('defs.' + templateName)
         && reference.length > ('defs.' + templateName).length
         && templateName.length
       )
    ) {
      reference = 'T0';
      isTemplateRef = true;
    } else if (reference) {
      if (originName && !reference.includes(originName)) {
        reference = 'defs.' + originName + '.' + reference;
      } else if (isResponse && !reference.startsWith('defs.')) {
        reference = 'defs.' + reference;
      }
    }

    return new DataType({
      isArr: type === 'array',
      enum: fixSwaggerEnum(schema.enum),
      primitiveType: primitiveType as PrimitiveType,
      reference,
      isTemplateRef
    });
  }
}

又造了个轮子ts-gear

感谢分享pont。
刚使用pont的时候,有的地方会有使用pontFetch方法,但找不到从哪里引入的。
所以只使用了生成的baseClass。
目前新版本里这个问题已经修正了。

经过一段时间pont的使用有一些地方做了针对自己项目的更改,后来越改越多偏的太多了。
所以没有提pr。
又造了一个类似pont的轮子起名叫ts-gear,在自己的项目里还挺好用。

没有继续用pont中生成一个大namespce的思路,直接生成带参数与返回数据类型校验的每个接口的请求方法函数。
每个子项目里带一个interceptor.ts可以定制请求与返回数据类型。
望参考有用的功能合并。

Ubuntu下插件无法运行

Ubuntu18,vscode1.36.1下,安装之后底部没有出现按钮。打开code的开发人员工具,console里报错 can not find module './UI'
插件安装包~/.vscode/extensions/jasonhzq.vscode-pont-0.2.3/out路径下只有一个小写的ui.js,我把文件名改成大写的UI.js之后,插件就正常运行了。

Support basePath

鉴于swagger V2是支持basePath的设置的,但是pont目前缺少这个feature,关于basePath的解释如下:

image

官方文档

bug: 未处理模板参数 void , object 的情况

swagger.json

"$ref": "#/definitions/DataTransOutput«object»"
// 或
"$ref": "#/definitions/DataTransOutput«void»"

api.d.ts

DataTransOutput<defs.void>

DataTransOutput<defs.object>

修复

compiller.ts

function generateCode(ast: any, originName = ''): string {
  const { name, type, templateArgs } = ast;
  let retName = name;

  if (name === 'long') {
    retName = 'number';
  }
 // void
  if (['void', 'Void'].includes(name)) {
    retName = 'void';
  }
 // object
  if (['object', 'Object'].includes(name)) {
    retName = 'object';
  }


  if (templateArgs.length) {
    if (name === 'List') {
      retName = 'Array';
    } else if (['Map'].includes(name)) {
      retName = name;
    } else {
      retName = originName ? `defs.${originName}.${name}` : `defs.${name}`;
    }
    return `${retName}<${templateArgs.map(arg => generateCode(arg, originName)).join(', ')}>`;
  }
  // 添加void和object检测
  if (['number', 'string', 'boolean', 'void', 'object'].includes(retName)) {
    return retName;
  }

  // 
  if ((global as any).__GenericClass__ && (global as any).__GenericClass__.includes(name)) {
    return `${name}<any>`
  }

  return originName ? `defs.${originName}.${name}` : `defs.${name}`;
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.