From af4fcd7f2c69cada458409463d53c560a593432f Mon Sep 17 00:00:00 2001 From: wubin1989 <328454505@qq.com> Date: Sat, 16 Jul 2022 22:50:40 +0800 Subject: [PATCH] ... --- pom.xml | 2 - unionj-generator-client/pom.xml | 25 - .../pom.xml | 26 - .../services/BizService.ts | 21 - .../services/ClshenbaoFormService.ts | 56 - .../services/LogoutService.ts | 44 - .../services/MeService.ts | 43 - .../services/OssService.ts | 77 -- .../services/PageService.ts | 49 - .../services/PublicService.ts | 153 -- .../services/UploadService.ts | 50 - .../services/UserService.ts | 53 - .../services/UserserviceService.ts | 117 -- .../services/types.ts | 108 -- .../service/BizServiceTsGenerator.java | 46 - .../service/ServiceFolderGenerator.java | 92 -- .../generator/service/ServiceGenerator.java | 13 - .../generator/service/ServiceTsGenerator.java | 51 - .../generator/service/TypesTsGenerator.java | 48 - .../service/docparser/ServiceDocParser.java | 40 - .../service/docparser/entity/BizEnum.java | 20 - .../service/docparser/entity/BizEnumType.java | 24 - .../service/docparser/entity/BizProperty.java | 112 -- .../service/docparser/entity/BizRouter.java | 237 ---- .../service/docparser/entity/BizServer.java | 201 --- .../service/docparser/entity/BizService.java | 20 - .../service/docparser/entity/BizType.java | 125 -- .../docparser/entity/TsTypeConstants.java | 25 - .../templates/services/BizService.ts.ftl | 23 - .../templates/services/Service.ts.ftl | 98 -- .../resources/templates/services/types.ts.ftl | 36 - .../service/BizServiceTsGeneratorTest.java | 30 - .../generator/service/ComponentsDesigner.java | 167 --- .../service/ServiceFolderGeneratorTest.java | 30 - .../service/ServiceTsGeneratorTest.java | 46 - .../service/TypesTsGeneratorTest.java | 248 ---- .../docparser/ServiceDocParserTest.java | 36 - .../src/test/resources/petstore3.json | 1228 ----------------- .../src/test/resources/test.json | 499 ------- .../test/resources/userservice_openapi3.json | 329 ----- .../src/test/resources/usersvc_openapi3.json | 563 -------- unionj-generator-frontend/pom.xml | 29 - .../frontend/vue/PackageJsonGenerator.java | 46 - .../frontend/vue/ReadmeMdGenerator.java | 46 - .../generator/frontend/vue/VueGenerator.java | 13 - .../frontend/vue/VueProjectGenerator.java | 159 --- .../resources/templates/vue/README.md.ftl | 44 - .../resources/templates/vue/package.json.ftl | 68 - .../src/main/resources/vue.zip | Bin 124524 -> 0 bytes .../src/main/resources/vue/.editorconfig | 7 - .../src/main/resources/vue/.env | 1 - .../src/main/resources/vue/.eslintrc.js | 17 - .../src/main/resources/vue/.gitignore | 26 - .../src/main/resources/vue/Makefile | 13 - .../src/main/resources/vue/babel.config.js | 30 - .../src/main/resources/vue/public/favicon.ico | Bin 67646 -> 0 bytes .../src/main/resources/vue/public/index.html | 17 - .../src/main/resources/vue/src/App.vue | 45 - .../main/resources/vue/src/assets/logo.png | Bin 70216 -> 0 bytes .../main/resources/vue/src/assets/mswjs.png | Bin 52150 -> 0 bytes .../resources/vue/src/components/PetStore.vue | 65 - .../resources/vue/src/components/Usage.vue | 65 - .../src/main/resources/vue/src/main.ts | 19 - .../main/resources/vue/src/plugins/antd.ts | 90 -- .../src/plugins/axios/AxiosErrorHandler.ts | 9 - .../src/plugins/axios/RequestInterceptor.ts | 7 - .../src/plugins/axios/ResponseInterceptor.ts | 7 - .../resources/vue/src/plugins/axios/index.ts | 29 - .../main/resources/vue/src/router/index.ts | 29 - .../main/resources/vue/src/shims-plugin.d.ts | 12 - .../src/main/resources/vue/src/shims-tsx.d.ts | 17 - .../src/main/resources/vue/src/shims-vue.d.ts | 5 - .../resources/vue/src/shims-waterfall.d.ts | 2 - .../src/main/resources/vue/src/store/index.ts | 15 - .../src/main/resources/vue/src/views/Home.vue | 25 - .../src/main/resources/vue/src/views/Msw.vue | 27 - .../src/main/resources/vue/tsconfig.json | 43 - .../src/main/resources/vue/vue.config.js | 99 -- .../vue/PackageJsonGeneratorTest.java | 23 - .../frontend/vue/ReadmeMdGeneratorTest.java | 23 - .../frontend/vue/VueProjectGeneratorTest.java | 24 - .../src/test/resources/petstore3.json | 1184 ---------------- .../src/test/resources/test.json | 458 ------ 83 files changed, 8049 deletions(-) delete mode 100644 unionj-generator-client/pom.xml delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/pom.xml delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/services/BizService.ts delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/services/ClshenbaoFormService.ts delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/services/LogoutService.ts delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/services/MeService.ts delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/services/OssService.ts delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/services/PageService.ts delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/services/PublicService.ts delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/services/UploadService.ts delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/services/UserService.ts delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/services/UserserviceService.ts delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/services/types.ts delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/BizServiceTsGenerator.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceFolderGenerator.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceGenerator.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceTsGenerator.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/TypesTsGenerator.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/ServiceDocParser.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizEnum.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizEnumType.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizProperty.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizRouter.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizServer.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizService.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizType.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/TsTypeConstants.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/BizService.ts.ftl delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/Service.ts.ftl delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/types.ts.ftl delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/BizServiceTsGeneratorTest.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ComponentsDesigner.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ServiceFolderGeneratorTest.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ServiceTsGeneratorTest.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/TypesTsGeneratorTest.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/docparser/ServiceDocParserTest.java delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/test/resources/petstore3.json delete mode 100644 unionj-generator-client/unionj-generator-client-typescript/src/test/resources/test.json delete mode 100755 unionj-generator-client/unionj-generator-client-typescript/src/test/resources/userservice_openapi3.json delete mode 100755 unionj-generator-client/unionj-generator-client-typescript/src/test/resources/usersvc_openapi3.json delete mode 100644 unionj-generator-frontend/pom.xml delete mode 100644 unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/PackageJsonGenerator.java delete mode 100644 unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/ReadmeMdGenerator.java delete mode 100644 unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/VueGenerator.java delete mode 100644 unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/VueProjectGenerator.java delete mode 100644 unionj-generator-frontend/src/main/resources/templates/vue/README.md.ftl delete mode 100644 unionj-generator-frontend/src/main/resources/templates/vue/package.json.ftl delete mode 100644 unionj-generator-frontend/src/main/resources/vue.zip delete mode 100644 unionj-generator-frontend/src/main/resources/vue/.editorconfig delete mode 100644 unionj-generator-frontend/src/main/resources/vue/.env delete mode 100644 unionj-generator-frontend/src/main/resources/vue/.eslintrc.js delete mode 100644 unionj-generator-frontend/src/main/resources/vue/.gitignore delete mode 100644 unionj-generator-frontend/src/main/resources/vue/Makefile delete mode 100644 unionj-generator-frontend/src/main/resources/vue/babel.config.js delete mode 100644 unionj-generator-frontend/src/main/resources/vue/public/favicon.ico delete mode 100644 unionj-generator-frontend/src/main/resources/vue/public/index.html delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/App.vue delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/assets/logo.png delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/assets/mswjs.png delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/components/PetStore.vue delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/components/Usage.vue delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/main.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/plugins/antd.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/AxiosErrorHandler.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/RequestInterceptor.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/ResponseInterceptor.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/index.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/router/index.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/shims-plugin.d.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/shims-tsx.d.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/shims-vue.d.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/shims-waterfall.d.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/store/index.ts delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/views/Home.vue delete mode 100644 unionj-generator-frontend/src/main/resources/vue/src/views/Msw.vue delete mode 100644 unionj-generator-frontend/src/main/resources/vue/tsconfig.json delete mode 100644 unionj-generator-frontend/src/main/resources/vue/vue.config.js delete mode 100644 unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/PackageJsonGeneratorTest.java delete mode 100644 unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/ReadmeMdGeneratorTest.java delete mode 100644 unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/VueProjectGeneratorTest.java delete mode 100644 unionj-generator-frontend/src/test/resources/petstore3.json delete mode 100644 unionj-generator-frontend/src/test/resources/test.json diff --git a/pom.xml b/pom.xml index 639259cf..a07bab35 100644 --- a/pom.xml +++ b/pom.xml @@ -22,10 +22,8 @@ unionj-generator-core - unionj-generator-frontend unionj-generator-backend unionj-generator-openapi - unionj-generator-client unionj-generator-ui diff --git a/unionj-generator-client/pom.xml b/unionj-generator-client/pom.xml deleted file mode 100644 index db63c56d..00000000 --- a/unionj-generator-client/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - unionj-generator - io.github.unionj-cloud - 1.6.7-SNAPSHOT - - 4.0.0 - pom - - unionj-generator-client - - - UTF-8 - 1.8 - 1.8 - - - - unionj-generator-client-typescript - - - diff --git a/unionj-generator-client/unionj-generator-client-typescript/pom.xml b/unionj-generator-client/unionj-generator-client-typescript/pom.xml deleted file mode 100644 index e9e54bda..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - io.github.unionj-cloud - unionj-generator-client - 1.6.7-SNAPSHOT - - 4.0.0 - - unionj-generator-client-typescript - - - - io.github.unionj-cloud - unionj-generator-core - ${project.version} - - - io.github.unionj-cloud - unionj-generator-openapi - ${project.version} - - - diff --git a/unionj-generator-client/unionj-generator-client-typescript/services/BizService.ts b/unionj-generator-client/unionj-generator-client-typescript/services/BizService.ts deleted file mode 100644 index e7f5d153..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/services/BizService.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** -* Generated by unionj-generator. -* You can edit it as your need. -*/ -import { merge } from 'lodash-es'; -import { CreateAxiosOptions, VAxios } from 'pullcode/src/httputil/Axios'; - -const defaultOptions = { - requestOptions: { - apiUrl: "http://www.unionj.com", - }, -} - -export class BizService extends VAxios { - constructor(options?: Partial) { - super(merge(defaultOptions, options || {})); - } -} - -export default BizService; - diff --git a/unionj-generator-client/unionj-generator-client-typescript/services/ClshenbaoFormService.ts b/unionj-generator-client/unionj-generator-client-typescript/services/ClshenbaoFormService.ts deleted file mode 100644 index f4ae718d..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/services/ClshenbaoFormService.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* -* @module 材料申报模块 -*/ -import { CreateAxiosOptions } from "pullcode/src/httputil/axiosTransform"; -import BizService from "./BizService"; -import type { - PostClshenbaoFormSavePayload, - SearchJobPageResult, -} from "./types" - -export class ClshenbaoFormService extends BizService{ - - constructor(options?: Partial) { - super(options); - } - - /** - * POST /clshenbao/form/save - * - * 材料申报:保存form表单 - * @param payload 这是payload - * @param key 键 - * @param style 样式 - * @returns Promise 返回参数 - */ - postClshenbaoFormSave( - payload: PostClshenbaoFormSavePayload, - params: { - key: string, - style?: string, - }, - ) :Promise { - return this.getAxios().post(`/clshenbao/form/save`, - payload, - { - params: { - key: params.key, - style: params.style, - }, - } - ) - } - -} - -export default ClshenbaoFormService; - -export function createClshenbaoFormService(opt?: Partial) { - return new ClshenbaoFormService(opt); -} - -export const clshenbaoFormService = createClshenbaoFormService(); - diff --git a/unionj-generator-client/unionj-generator-client-typescript/services/LogoutService.ts b/unionj-generator-client/unionj-generator-client-typescript/services/LogoutService.ts deleted file mode 100644 index dab5d233..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/services/LogoutService.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* -* @module Logout -*/ -import { CreateAxiosOptions } from "pullcode/src/httputil/axiosTransform"; -import BizService from "./BizService"; -import type { - GetLogoutResp, -} from "./types" - -export class LogoutService extends BizService{ - - constructor(options?: Partial) { - super(options); - } - - /** - * GET /logout - * - * GetLogout 注销token - * GetLogout is used for revoking a token - * https://github.com/dgrijalva/jwt-go/issues/214 - * @returns Promise - */ - getLogout( - ) :Promise { - return this.getAxios().get(`/logout`, - { - } - ) - } - -} - -export default LogoutService; - -export function createLogoutService(opt?: Partial) { - return new LogoutService(opt); -} - -export const logoutService = createLogoutService(); - diff --git a/unionj-generator-client/unionj-generator-client-typescript/services/MeService.ts b/unionj-generator-client/unionj-generator-client-typescript/services/MeService.ts deleted file mode 100644 index 25258407..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/services/MeService.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* -* @module Me -*/ -import { CreateAxiosOptions } from "pullcode/src/httputil/axiosTransform"; -import BizService from "./BizService"; -import type { - GetMeResp, -} from "./types" - -export class MeService extends BizService{ - - constructor(options?: Partial) { - super(options); - } - - /** - * GET /me - * - * GetMe 获取当前登录用户详情接口 - * GetMe is used for getting user info from token in header. - * @returns Promise - */ - getMe( - ) :Promise { - return this.getAxios().get(`/me`, - { - } - ) - } - -} - -export default MeService; - -export function createMeService(opt?: Partial) { - return new MeService(opt); -} - -export const meService = createMeService(); - diff --git a/unionj-generator-client/unionj-generator-client-typescript/services/OssService.ts b/unionj-generator-client/unionj-generator-client-typescript/services/OssService.ts deleted file mode 100644 index d8955ebf..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/services/OssService.ts +++ /dev/null @@ -1,77 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* -* @module Attachment -*/ -import { CreateAxiosOptions } from "pullcode/src/httputil/axiosTransform"; -import BizService from "./BizService"; -import type { - ResultDTOString, -} from "./types" - -export class OssService extends BizService{ - - constructor(options?: Partial) { - super(options); - } - - /** - * POST /oss/upload - * - * 上传附件 - * @param formData - * @param returnKey - * @returns Promise - */ - postOssUpload( - formData: FormData, - params: { - returnKey?: boolean, - }, - ) :Promise { - return this.getAxios().post(`/oss/upload`, - formData, - { - params: { - returnKey: params.returnKey, - }, - } - ) - } - - /** - * GET /oss/get - * - * 获取附件 - * @param key - * @param style - * @returns Promise - */ - getOssGet( - params: { - key: string, - style?: string, - }, - ) :Promise { - return this.getAxios().get(`/oss/get`, - { - params: { - key: params.key, - style: params.style, - }, - responseType: 'blob', - } - ) - } - -} - -export default OssService; - -export function createOssService(opt?: Partial) { - return new OssService(opt); -} - -export const ossService = createOssService(); - diff --git a/unionj-generator-client/unionj-generator-client-typescript/services/PageService.ts b/unionj-generator-client/unionj-generator-client-typescript/services/PageService.ts deleted file mode 100644 index cca5134e..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/services/PageService.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* -* @module Page -*/ -import { CreateAxiosOptions } from "pullcode/src/httputil/axiosTransform"; -import BizService from "./BizService"; -import type { - PageQuery, - PageUsersResp, -} from "./types" - -export class PageService extends BizService{ - - constructor(options?: Partial) { - super(options); - } - - /** - * POST /page/users - * - * PageUsers 用户分页接口 - * 展示如何定义POST请求且Content-Type为application/json的接口 - * PageUsers is user pagination api - * demo how to define post request api which accepts application/json content-type - * @param payload - * @returns Promise - */ - postPageUsers( - payload: PageQuery, - ) :Promise { - return this.getAxios().post(`/page/users`, - payload, - { - } - ) - } - -} - -export default PageService; - -export function createPageService(opt?: Partial) { - return new PageService(opt); -} - -export const pageService = createPageService(); - diff --git a/unionj-generator-client/unionj-generator-client-typescript/services/PublicService.ts b/unionj-generator-client/unionj-generator-client-typescript/services/PublicService.ts deleted file mode 100644 index 95f0c460..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/services/PublicService.ts +++ /dev/null @@ -1,153 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* -* @module Public -*/ -import { CreateAxiosOptions } from "pullcode/src/httputil/axiosTransform"; -import BizService from "./BizService"; -import type { - PublicLogInResp, - PublicSignUpResp, - PublicTokenValidateResp, -} from "./types" - -export class PublicService extends BizService{ - - constructor(options?: Partial) { - super(options); - } - - /** - * GET /public/download/avatar - * - * GetPublicDownloadAvatar 下载头像接口 - * 展示如何定义文件下载接口 - * 函数签名的出参里必须有且只有一个*os.File类型的参数 - * GetPublicDownloadAvatar is avatar download api - * demo how to define file download api - * NOTE: there must be one and at most one *os.File output parameter - * @param userId 用户ID -user id - * @returns Promise - */ - getPublicDownloadAvatar( - params: { - userId: number, - }, - ) :Promise { - return this.getAxios().get(`/public/download/avatar`, - { - params: { - userId: params.userId, - }, - responseType: 'blob', - } - ) - } - - /** - * POST /public/log/in - * - * PublicLogIn 用户登录接口 - * 展示如何鉴权并返回token - * PublicLogIn is user login api - * demo how to do authentication and issue token - * @param password 密码 -password - * @param username 用户名 -username - * @returns Promise - */ - postPublicLogIn( - params: { - password: string, - username: string, - }, - ) :Promise { - const urlSearchParams = new URLSearchParams(); - urlSearchParams.append('password', '' + params.password); - urlSearchParams.append('username', '' + params.username); - return this.getAxios().post(`/public/log/in`, - urlSearchParams, - { - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - } - ) - } - - /** - * POST /public/sign/up - * - * PublicSignUp 用户注册接口 - * 展示如何定义POST请求且Content-Type是application/x-www-form-urlencoded的接口 - * PublicSignUp is user signup api - * demo how to define post request api which accepts application/x-www-form-urlencoded content-type - * @param code 图形验证码 -image code - * @param password 密码 -password - * @param username 用户名 -username - * @returns Promise - */ - postPublicSignUp( - params: { - code?: string, - password: string, - username: string, - }, - ) :Promise { - const urlSearchParams = new URLSearchParams(); - params.code !== undefined && urlSearchParams.append('code', '' + params.code); - urlSearchParams.append('password', '' + params.password); - urlSearchParams.append('username', '' + params.username); - return this.getAxios().post(`/public/sign/up`, - urlSearchParams, - { - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - } - ) - } - - /** - * POST /public/token/validate - * - * PublicTokenValidate token校验接口 - * 如果token有效,返回用户信息 - * PublicTokenValidate validates token string - * if token is valid, return user information - * @param token - * @returns Promise - */ - postPublicTokenValidate( - params: { - token: string, - }, - ) :Promise { - const urlSearchParams = new URLSearchParams(); - urlSearchParams.append('token', '' + params.token); - return this.getAxios().post(`/public/token/validate`, - urlSearchParams, - { - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - } - ) - } - -} - -export default PublicService; - -export function createPublicService(opt?: Partial) { - return new PublicService(opt); -} - -export const publicService = createPublicService(); - diff --git a/unionj-generator-client/unionj-generator-client-typescript/services/UploadService.ts b/unionj-generator-client/unionj-generator-client-typescript/services/UploadService.ts deleted file mode 100644 index 0b329938..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/services/UploadService.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* -* @module Upload -*/ -import { CreateAxiosOptions } from "pullcode/src/httputil/axiosTransform"; -import BizService from "./BizService"; -import type { - UploadAvatarResp, -} from "./types" - -export class UploadService extends BizService{ - - constructor(options?: Partial) { - super(options); - } - - /** - * POST /upload/avatar - * - * UploadAvatar 上传头像接口 - * 展示如何定义文件上传接口 - * 函数签名的入参里必须要有至少一个[]*v3.FileModel或者*v3.FileModel类型的参数 - * UploadAvatar is avatar upload api - * demo how to define file upload api - * NOTE: there must be at least one []*v3.FileModel or *v3.FileModel input parameter - * @param formData - * @returns Promise - */ - postUploadAvatar( - formData: FormData, - ) :Promise { - return this.getAxios().post(`/upload/avatar`, - formData, - { - } - ) - } - -} - -export default UploadService; - -export function createUploadService(opt?: Partial) { - return new UploadService(opt); -} - -export const uploadService = createUploadService(); - diff --git a/unionj-generator-client/unionj-generator-client-typescript/services/UserService.ts b/unionj-generator-client/unionj-generator-client-typescript/services/UserService.ts deleted file mode 100644 index 06c89989..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/services/UserService.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* -* @module User -*/ -import { CreateAxiosOptions } from "pullcode/src/httputil/axiosTransform"; -import BizService from "./BizService"; -import type { - GetUserResp, -} from "./types" - -export class UserService extends BizService{ - - constructor(options?: Partial) { - super(options); - } - - /** - * GET /user - * - * GetUser 用户详情接口 - * 展示如何定义带查询字符串参数的GET请求接口 - * GetUser is user detail api - * demo how to define get http request with query string parameters - * @param userId 用户ID -user id - * @returns Promise - */ - getUser( - params: { - userId: number, - }, - ) :Promise { - return this.getAxios().get(`/user`, - { - params: { - userId: params.userId, - }, - } - ) - } - -} - -export default UserService; - -export function createUserService(opt?: Partial) { - return new UserService(opt); -} - -export const userService = createUserService(); - diff --git a/unionj-generator-client/unionj-generator-client-typescript/services/UserserviceService.ts b/unionj-generator-client/unionj-generator-client-typescript/services/UserserviceService.ts deleted file mode 100644 index 17cc6df6..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/services/UserserviceService.ts +++ /dev/null @@ -1,117 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* -* @module Userservice -*/ -import { CreateAxiosOptions } from "pullcode/src/httputil/axiosTransform"; -import BizService from "./BizService"; -import type { - LogInForm, - PageQuery, - SignUpForm, - Auth, - PageRet, - UserVo, -} from "./types" - -export class UserserviceService extends BizService{ - - constructor(options?: Partial) { - super(options); - } - - /** - * POST /userservice/login - * - * @param payload - * @returns Promise - */ - postUserserviceLogin( - payload: LogInForm, - ) :Promise { - return this.getAxios().post(`/userservice/login`, - payload, - { - } - ) - } - - /** - * POST /userservice/pageusers - * - * @param payload - * @returns Promise - */ - postUserservicePageusers( - payload: PageQuery, - ) :Promise { - return this.getAxios().post(`/userservice/pageusers`, - payload, - { - } - ) - } - - /** - * POST /userservice/signup - * - * @param payload - * @returns Promise - */ - postUserserviceSignup( - payload: SignUpForm, - ) :Promise { - return this.getAxios().post(`/userservice/signup`, - payload, - { - } - ) - } - - /** - * GET /userservice/user/${params.b}/${params.id} - * - * @param c - * @param d - * @param id - * @param a - * @param b - * @param e - * @param f - * @returns Promise - */ - getUserserviceUserParamsBParamsId( - params: { - c: number, - d: number, - id?: number, - a?: number, - b?: number, - e?: number, - f?: number, - }, - ) :Promise { - return this.getAxios().get(`/userservice/user/${params.b}/${params.id}`, - { - params: { - a: params.a, - c: params.c, - d: params.d, - e: params.e, - f: params.f, - }, - } - ) - } - -} - -export default UserserviceService; - -export function createUserserviceService(opt?: Partial) { - return new UserserviceService(opt); -} - -export const userserviceService = createUserserviceService(); - diff --git a/unionj-generator-client/unionj-generator-client-typescript/services/types.ts b/unionj-generator-client/unionj-generator-client-typescript/services/types.ts deleted file mode 100644 index 060dba38..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/services/types.ts +++ /dev/null @@ -1,108 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* @module types -*/ - -export interface User { - name: string; - info: any; -} - - -export interface UserInteger { - name: string; - info: number; -} - - -export interface ResultDTOSetUserDate { - msg: string; - code: number; - data: UserDate[]; -} - - -export interface ResultDTOSetUserInteger { - msg: string; - code: number; - data: UserInteger[]; -} - - -export interface ShopRecommendApplyDetailCondition { - /** - * 总数,入参传入此参数则不再查询count,以此total为准 - */ - total: number; - /** - * 当前页,从1开始 - */ - current: number; - /** - * 每页条数,默认10,传-1查出全部数据 - */ - size: number; - /** - * 偏移量 - */ - offset: number; - /** - * 需要排在前的状态 - */ - topStatus: number; - /** - * 每页条数,默认10, 传-1查出全部数据 - */ - limit: number; - /** - * 店铺名称 - */ - shopName: string; - /** - * 当前页,从1开始 - */ - page: number; - /** - * 排序条件字符串:排序字段前使用'-'(降序)和'+'(升序)号表示排序规则,多个排序字段用','隔开 - */ - sort: string; - /** - * 导出结束页 - */ - maxPage: number; - /** - * 审批状态 - */ - status: number[]; -} - - -export interface UserDate { - name: string; - info: string; -} - - -export interface ResultDTO { - msg: string; - code: number; - data: any; -} - - -export interface FuzzySearchRequestVO { - keyword: string; - /** - * 城市 - */ - type: FuzzySearchRequestVOTypeEnum; -} - -export enum FuzzySearchRequestVOTypeEnum { - 北京 = "北京", - 上海 = "上海", - 广州 = "广州", - 深圳 = "深圳", -} - diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/BizServiceTsGenerator.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/BizServiceTsGenerator.java deleted file mode 100644 index ac26b868..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/BizServiceTsGenerator.java +++ /dev/null @@ -1,46 +0,0 @@ -package cloud.unionj.generator.service; - -import cloud.unionj.generator.GeneratorUtils; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator - * date 2020/11/22 - */ -public class BizServiceTsGenerator extends ServiceGenerator { - - private String serverName; - private String outputDir = OUTPUT_DIR; - - public BizServiceTsGenerator(String serverName) { - this.serverName = serverName; - } - - public BizServiceTsGenerator(String serverName, String outputDir) { - this.serverName = serverName; - this.outputDir = outputDir; - } - - @Override - public Map getInput() { - Map input = new HashMap<>(); - input.put("serverName", this.serverName); - return input; - } - - @Override - public String getTemplate() { - return OUTPUT_DIR + "/BizService.ts.ftl"; - } - - @Override - public String getOutputFile() { - return GeneratorUtils.getOutputDir(this.outputDir) + File.separator + "BizService.ts"; - } - -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceFolderGenerator.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceFolderGenerator.java deleted file mode 100644 index f77ee24f..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceFolderGenerator.java +++ /dev/null @@ -1,92 +0,0 @@ -package cloud.unionj.generator.service; - -import cloud.unionj.generator.GeneratorUtils; -import cloud.unionj.generator.service.docparser.entity.BizServer; -import cloud.unionj.generator.service.docparser.entity.BizService; -import lombok.SneakyThrows; - -import java.io.File; -import java.util.Map; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator - * date 2020/11/22 - */ -public class ServiceFolderGenerator extends ServiceGenerator { - - private BizServer bizServer; - private String outputDir; - private boolean zip; - - public static final class Builder { - private BizServer bizServer; - private String outputDir = OUTPUT_DIR; - private boolean zip = false; - - public Builder(BizServer bizServer) { - this.bizServer = bizServer; - } - - public Builder outputDir(String outputDir) { - this.outputDir = outputDir; - return this; - } - - public Builder zip(boolean zip) { - this.zip = zip; - return this; - } - - public ServiceFolderGenerator build() { - ServiceFolderGenerator serviceFolderGenerator = new ServiceFolderGenerator(); - serviceFolderGenerator.bizServer = this.bizServer; - serviceFolderGenerator.outputDir = this.outputDir; - serviceFolderGenerator.zip = this.zip; - return serviceFolderGenerator; - } - - } - - private ServiceFolderGenerator() { - } - - @Override - public Map getInput() { - return null; - } - - @Override - public String getTemplate() { - return null; - } - - @Override - public String getOutputFile() { - return GeneratorUtils.getOutputDir(this.outputDir); - } - - @SneakyThrows - @Override - public String generate() { - BizServiceTsGenerator bizServiceTsGenerator = new BizServiceTsGenerator(bizServer.getName(), this.outputDir); - bizServiceTsGenerator.generate(); - - TypesTsGenerator typesTsGenerator = new TypesTsGenerator(bizServer.getTypes(), this.outputDir); - typesTsGenerator.generate(); - - for (BizService bizService : bizServer.getServices()) { - ServiceTsGenerator serviceTsGenerator = new ServiceTsGenerator(bizService, this.outputDir); - serviceTsGenerator.generate(); - } - - if (this.zip) { - String outputFile = GeneratorUtils.getOutputDir("output") + File.separator + OUTPUT_DIR + ".zip"; - String sourceFile = getOutputFile(); - return GeneratorUtils.generateFolder(sourceFile, outputFile); - } - - return getOutputFile(); - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceGenerator.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceGenerator.java deleted file mode 100644 index 3888e366..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceGenerator.java +++ /dev/null @@ -1,13 +0,0 @@ -package cloud.unionj.generator.service; - -import cloud.unionj.generator.DefaultGenerator; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator - * date 2020/11/22 - */ -public abstract class ServiceGenerator extends DefaultGenerator { - protected static final String OUTPUT_DIR = "services"; -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceTsGenerator.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceTsGenerator.java deleted file mode 100644 index 6546d382..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/ServiceTsGenerator.java +++ /dev/null @@ -1,51 +0,0 @@ -package cloud.unionj.generator.service; - -import cloud.unionj.generator.GeneratorUtils; -import cloud.unionj.generator.service.docparser.entity.BizService; -import org.apache.commons.lang3.StringUtils; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator - * date 2020/11/22 - */ -public class ServiceTsGenerator extends ServiceGenerator { - - private BizService bizService; - private String outputDir = OUTPUT_DIR; - - public ServiceTsGenerator(BizService bizService) { - this.bizService = bizService; - } - - public ServiceTsGenerator(BizService bizService, String outputDir) { - this.bizService = bizService; - this.outputDir = outputDir; - } - - @Override - public Map getInput() { - Map input = new HashMap<>(); - input.put("name", StringUtils.capitalize(this.bizService.getName())); - input.put("module", StringUtils.capitalize(this.bizService.getModule())); - input.put("types", this.bizService.getTypes()); - input.put("routers", this.bizService.getRouters()); - return input; - } - - @Override - public String getTemplate() { - return OUTPUT_DIR + "/Service.ts.ftl"; - } - - @Override - public String getOutputFile() { - return GeneratorUtils.getOutputDir(this.outputDir) + File.separator + StringUtils.capitalize(this.bizService.getName()) + ".ts"; - } - -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/TypesTsGenerator.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/TypesTsGenerator.java deleted file mode 100644 index b27bbec0..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/TypesTsGenerator.java +++ /dev/null @@ -1,48 +0,0 @@ -package cloud.unionj.generator.service; - -import cloud.unionj.generator.GeneratorUtils; -import cloud.unionj.generator.service.docparser.entity.BizType; - -import java.io.File; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator - * date 2020/11/22 - */ -public class TypesTsGenerator extends ServiceGenerator { - - private List types; - private String outputDir = OUTPUT_DIR; - - public TypesTsGenerator(List types) { - this.types = types; - } - - public TypesTsGenerator(List types, String outputDir) { - this.types = types; - this.outputDir = outputDir; - } - - @Override - public Map getInput() { - Map input = new HashMap<>(); - input.put("types", this.types); - return input; - } - - @Override - public String getTemplate() { - return OUTPUT_DIR + "/types.ts.ftl"; - } - - @Override - public String getOutputFile() { - return GeneratorUtils.getOutputDir(this.outputDir) + File.separator + "types.ts"; - } - -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/ServiceDocParser.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/ServiceDocParser.java deleted file mode 100644 index 4058d370..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/ServiceDocParser.java +++ /dev/null @@ -1,40 +0,0 @@ -package cloud.unionj.generator.service.docparser; - -import cloud.unionj.generator.openapi3.model.Openapi3; -import cloud.unionj.generator.service.docparser.entity.BizServer; -import cloud.unionj.generator.openapi3.parser.Openapi3Parser; -import lombok.Data; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.mock.docparser - * date 2020/11/18 - */ -@Data -public class ServiceDocParser { - - public static BizServer parse(File doc) throws IOException { - Openapi3 openAPI = new Openapi3Parser().parse(doc); - return BizServer.convert(openAPI); - } - - public static BizServer parse(URL doc) throws IOException { - Openapi3 openAPI = new Openapi3Parser().parse(doc); - return BizServer.convert(openAPI); - } - - public static BizServer parse(InputStream doc) throws IOException { - Openapi3 openAPI = new Openapi3Parser().parse(doc); - return BizServer.convert(openAPI); - } - - public static BizServer parse(Openapi3 openAPI) throws IOException { - return BizServer.convert(openAPI); - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizEnum.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizEnum.java deleted file mode 100644 index eb5a84f4..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizEnum.java +++ /dev/null @@ -1,20 +0,0 @@ -package cloud.unionj.generator.service.docparser.entity; - -import lombok.Data; - -/** - * @author created by wubin - * @version v0.0.1 - * description: cloud.unionj.generator.service.docparser.entity - * date:2021/2/26 - */ -@Data -public class BizEnum { - private String name; - private String value; - - public BizEnum(String name, String value) { - this.name = name; - this.value = value; - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizEnumType.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizEnumType.java deleted file mode 100644 index 203500e6..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizEnumType.java +++ /dev/null @@ -1,24 +0,0 @@ -package cloud.unionj.generator.service.docparser.entity; - -import lombok.Data; - -import java.util.List; - -/** - * @author created by wubin - * @version v0.0.1 - * description: cloud.unionj.generator.service.docparser.entity - * date:2021/2/26 - */ -@Data -public class BizEnumType { - - private List enums; - private String name; - - public BizEnumType(List enums, String name) { - this.enums = enums; - this.name = name; - } - -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizProperty.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizProperty.java deleted file mode 100644 index 1d89e392..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizProperty.java +++ /dev/null @@ -1,112 +0,0 @@ -package cloud.unionj.generator.service.docparser.entity; - -import cloud.unionj.generator.openapi3.model.Schema; -import lombok.Data; -import lombok.SneakyThrows; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.mock.docparser.entity - * date 2020/11/18 - */ -@Data -public class BizProperty { - - private String name; - private String type; - private String in; - private boolean required = true; - private String doc; - private List docs; - - public BizProperty(String name, String type, String in) { - this.name = name; - this.type = type; - this.in = in; - } - - public BizProperty(String type) { - this.type = type; - } - - public BizProperty() { - } - - private String getTypeByRef(String ref) { - String key = ref.substring(ref.lastIndexOf("/") + 1); - if (StringUtils.isBlank(key)) { - return TsTypeConstants.ANY; - } - return key.replaceAll("[^a-zA-Z0-9_]", ""); - } - - public void setType(Schema schema) { - this.type = this.deepSetType(schema); - } - - public void setType(String type) { - this.type = type; - } - - @SneakyThrows - private String deepSetType(Schema schema) { - String type = schema.getType(); - if (StringUtils.isBlank(type)) { - return this.getTypeByRef(schema.getRef()); - } - String tsType; - switch (type) { - case "boolean": { - tsType = TsTypeConstants.BOOLEAN; - break; - } - case "integer": { - tsType = TsTypeConstants.NUMBER; - break; - } - case "number": { - tsType = TsTypeConstants.NUMBER; - break; - } - case "string": { - String format = schema.getFormat(); - if (format != null && format.equals("binary")) { - tsType = TsTypeConstants.BLOB; - } else { - tsType = TsTypeConstants.STRING; - } - break; - } - case "array": { - Schema items = schema.getItems(); - if (StringUtils.isNotBlank(items.getRef())) { - tsType = this.getTypeByRef(items.getRef()); - } else if (StringUtils.isNotBlank(items.getType())) { - tsType = this.deepSetType(items); - } else { - tsType = ""; - } - tsType += "[]"; - break; - } - case "object": { - if (StringUtils.isNotBlank(schema.getxTitle())) { - tsType = schema.getxTitle().replaceAll("[^a-zA-Z0-9_]", ""); - } else if (schema.getProperties().size() > 0) { - tsType = BizType.fromSchema(schema, BizType.EnumAs.DOC).toCode(); - } else { - tsType = TsTypeConstants.ANY; - } - break; - } - default: { - tsType = TsTypeConstants.ANY; - } - } - return tsType; - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizRouter.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizRouter.java deleted file mode 100644 index 12c91fec..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizRouter.java +++ /dev/null @@ -1,237 +0,0 @@ -package cloud.unionj.generator.service.docparser.entity; - -import cloud.unionj.generator.openapi3.model.Components; -import cloud.unionj.generator.openapi3.model.Schema; -import cloud.unionj.generator.openapi3.model.paths.*; -import com.google.common.base.CaseFormat; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import lombok.Getter; -import lombok.Setter; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.mock.docparser.entity - * date 2020/11/18 - */ -public class BizRouter { - @Getter - private String name; - @Getter - private String endpoint; - @Getter - private String httpMethod; - - @Setter - @Getter - private BizProperty reqBody; - @Setter - @Getter - private BizProperty respData = new BizProperty(TsTypeConstants.ANY); - @Setter - @Getter - private List pathParams; - @Setter - @Getter - private List queryParams; - @Setter - @Getter - private List urlSearchParams; - - /** - * pathParams + queryParams + urlSearchParams - */ - @Setter - @Getter - private List allParams; - - // TODO need implementation - @Setter - @Getter - private List headerParams; - - @Setter - @Getter - private List docs; - - public static BizRouter of(String endpoint, String httpMethod, Operation operation, Components components) { - BizRouter bizRouter = new BizRouter(); - bizRouter.endpoint = endpoint; - bizRouter.httpMethod = httpMethod; - List strings = new ArrayList<>(); - if (StringUtils.isNotBlank(operation.getSummary())) { - strings.addAll(Lists.newArrayList(operation.getSummary().split("[^\\S ]"))); - } - if (StringUtils.isNotBlank(operation.getDescription())) { - strings.addAll(Lists.newArrayList(operation.getDescription().split("[^\\S ]"))); - } - bizRouter.docs = strings; - if (StringUtils.isNotBlank(operation.getMethodName())) { - bizRouter.name = operation.getMethodName(); - } else { - bizRouter.setName(); - } - - Map requestBodies = components.getRequestBodies(); - RequestBody requestBody = operation.getRequestBody(); - if (requestBody != null) { - if (StringUtils.isNotBlank(requestBody.getRef())) { - String key = StringUtils.removeStart(requestBody.getRef(), "#/components/requestBodies/"); - requestBody = requestBodies.get(key); - } - Content content = requestBody.getContent(); - BizProperty bizProperty = new BizProperty(); - bizProperty.setDoc(requestBody.getDescription()); - if (content != null) { - if (content.getApplicationJson() != null) { - MediaType mediaType = content.getApplicationJson(); - if (mediaType.getSchema() != null) { - bizProperty.setName("payload"); - bizProperty.setIn("requestBody"); - bizProperty.setType(mediaType.getSchema()); - bizRouter.setReqBody(bizProperty); - } - } else if (content.getApplicationOctetStream() != null) { - MediaType mediaType = content.getApplicationOctetStream(); - if (mediaType.getSchema() != null) { - bizProperty.setName("formData"); - bizProperty.setIn("requestBody"); - bizProperty.setType(TsTypeConstants.FORMDATA); - bizRouter.setReqBody(bizProperty); - } - } else if (content.getMultipartFormData() != null) { - MediaType formData = content.getMultipartFormData(); - if (formData.getSchema() != null) { - bizProperty.setName("formData"); - bizProperty.setIn("requestBody"); - bizProperty.setType(TsTypeConstants.FORMDATA); - bizRouter.setReqBody(bizProperty); - } - } else if (content.getApplicationXWwwFormUrlencoded() != null) { - MediaType formUrlencoded = content.getApplicationXWwwFormUrlencoded(); - if (formUrlencoded.getSchema() != null) { - Schema formUrlencodedSchema = formUrlencoded.getSchema(); - if (StringUtils.isNotBlank(formUrlencodedSchema.getRef())) { - String key = StringUtils.removeStart(formUrlencodedSchema.getRef(), "#/components/schemas/"); - formUrlencodedSchema = components.getSchemas().get(key); - } - List required = formUrlencodedSchema.getRequired(); - List urlSearchParams = formUrlencodedSchema.getProperties().entrySet().stream().map(item -> { - BizProperty property = new BizProperty(); - String propName = item.getKey(); - Schema propSchema = item.getValue(); - property.setDoc(propSchema.getDescription()); - property.setIn("requestBody"); - property.setName(propName); - property.setType(propSchema); - property.setRequired(CollectionUtils.containsAny(required, propName)); - return property; - }).collect(Collectors.toList()); - bizRouter.setUrlSearchParams(urlSearchParams); - } - } else if (content.getTextPlain() != null) { - MediaType mediaType = content.getTextPlain(); - if (mediaType.getSchema() != null) { - bizProperty.setName("payload"); - bizProperty.setIn("requestBody"); - bizProperty.setType(mediaType.getSchema()); - bizRouter.setReqBody(bizProperty); - } - } else if (content.getDefaultMediaType() != null) { - MediaType mediaType = content.getDefaultMediaType(); - if (mediaType.getSchema() != null) { - bizProperty.setName("payload"); - bizProperty.setIn("requestBody"); - bizProperty.setType(mediaType.getSchema()); - bizRouter.setReqBody(bizProperty); - } - } - } - } - - Set bizPropertySet = Sets.newLinkedHashSet(); - if (CollectionUtils.isNotEmpty(operation.getParameters())) { - LinkedHashSet bizProperties = operation.getParameters().stream().map(para -> { - BizProperty bizProperty = new BizProperty(); - bizProperty.setIn(para.getIn().toString()); - bizProperty.setName(para.getName()); - bizProperty.setType(para.getSchema()); - bizProperty.setRequired(para.isRequired()); - bizProperty.setDoc(para.getDescription()); - return bizProperty; - }).collect(Collectors.toCollection(LinkedHashSet::new)); - if (bizProperties != null) { - bizPropertySet.addAll(bizProperties); - } - } - if (CollectionUtils.isNotEmpty(bizPropertySet)) { - Map> bizPropertyGroupByIn = bizPropertySet.stream().collect(Collectors.groupingBy(BizProperty::getIn, Collectors.toList())); - bizRouter.setPathParams(bizPropertyGroupByIn.get("path")); - bizRouter.setQueryParams(bizPropertyGroupByIn.get("query")); - - List bizProperties = Lists.newArrayList(bizPropertySet); - List requiredParams = bizProperties.stream().filter(BizProperty::isRequired).collect(Collectors.toList()); - List optionalParams = bizProperties.stream().filter(bizProperty -> !bizProperty.isRequired()).collect(Collectors.toList()); - requiredParams.addAll(optionalParams); - bizRouter.setAllParams(requiredParams); - } - - if (CollectionUtils.isNotEmpty(bizRouter.getUrlSearchParams())) { - if (bizRouter.getAllParams() == null) { - bizRouter.setAllParams(new ArrayList<>()); - } - bizRouter.getAllParams().addAll(bizRouter.getUrlSearchParams()); - } - - Map responsesMap = components.getResponses(); - Responses responses = operation.getResponses(); - if (responses != null) { - Response okResponse = responses.getResponse200(); - if (okResponse != null) { - if (StringUtils.isNotBlank(okResponse.getRef())) { - String key = StringUtils.removeStart(okResponse.getRef(), "#/components/responses/"); - okResponse = responsesMap.get(key); - } - Content content = okResponse.getContent(); - if (content != null) { - MediaType mediaType = content.getApplicationJson(); - if (mediaType == null) { - mediaType = content.getDefaultMediaType(); - } - if (mediaType == null) { - mediaType = content.getApplicationOctetStream(); - } - if (mediaType == null) { - mediaType = content.getTextPlain(); - } - if (mediaType != null) { - Schema schema = mediaType.getSchema(); - BizProperty bizProperty = new BizProperty(); - bizProperty.setName("data"); - bizProperty.setIn("responseBody"); - bizProperty.setType(schema); - bizProperty.setDoc(okResponse.getDescription()); - bizRouter.setRespData(bizProperty); - } - } - } - } - - return bizRouter; - } - - private void setName() { - if (StringUtils.isBlank(this.getEndpoint()) || StringUtils.isBlank(this.getHttpMethod())) { - return; - } - String endpoint = this.getEndpoint().replaceAll("[^a-zA-Z0-9]", "_").toLowerCase(); - endpoint = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, endpoint); - this.name = this.getHttpMethod().toLowerCase() + endpoint; - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizServer.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizServer.java deleted file mode 100644 index d62cc6f4..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizServer.java +++ /dev/null @@ -1,201 +0,0 @@ -package cloud.unionj.generator.service.docparser.entity; - -import cloud.unionj.generator.openapi3.model.Openapi3; -import cloud.unionj.generator.openapi3.model.Schema; -import cloud.unionj.generator.openapi3.model.paths.Path; -import cloud.unionj.generator.openapi3.model.servers.Server; -import com.google.common.collect.Lists; -import lombok.Data; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.mock.docparser.entity - * date 2020/11/18 - */ -@Data -public class BizServer { - - private static String[] redundantPorts = new String[]{":80", ":443"}; - - @Data - public static class PathItemWrapper { - private Path pathItem; - private String endpoint; - private String service; - private String module; - } - - private String name; - private List services; - private List types; - - public static BizServer convert(Openapi3 openAPI) { - BizServer bizServer = new BizServer(); - List servers = openAPI.getServers(); - Server defaultServer = null; - if (CollectionUtils.isNotEmpty(servers)) { - defaultServer = servers.get(0); - } - String host = ""; - if (defaultServer != null) { - host = defaultServer.getUrl(); - } - String redundantPort = ""; - for (String port : redundantPorts) { - if (StringUtils.isNotBlank(host) && host.endsWith(port)) { - redundantPort = port; - break; - } - } - host = StringUtils.removeEnd(host, redundantPort); - bizServer.setName(host); - - List types = new ArrayList<>(); - Map schemas = openAPI.getComponents().getSchemas(); - for (Map.Entry schemaEntry : schemas.entrySet()) { - String key = schemaEntry.getKey(); - key = key.replaceAll("[^a-zA-Z0-9_]", ""); - BizType bizType = BizType.fromSchema(schemaEntry.getValue(), key); - types.add(bizType); - } - - bizServer.setTypes(types); - - Map paths = openAPI.getPaths(); - Map> pathItemWrapperMap = new HashMap<>(); - for (Map.Entry pathItemEntry : paths.entrySet()) { - String key = pathItemEntry.getKey(); - String _key = StringUtils.stripStart(key, "/"); - if (StringUtils.isBlank(_key)) { - continue; - } - String[] split = _key.split("/"); - if (ArrayUtils.isEmpty(split)) { - continue; - } - PathItemWrapper wrapper = new PathItemWrapper(); - Path pathEntryValue = pathItemEntry.getValue(); - List tags = pathEntryValue.returnTags(); - String serviceName; - - /** - * Use second tag as Service class name if it exists, otherwise use first part of the path splitted by back slash. - */ - if (CollectionUtils.isNotEmpty(tags) && tags.size() > 1 && StringUtils.isNotBlank(tags.get(1))) { - serviceName = StringUtils.capitalize(tags.get(1).replaceAll("[^a-zA-Z0-9_]", "")) + "Service"; - } else { - serviceName = StringUtils.capitalize(split[0].replaceAll("[^a-zA-Z0-9_]", "")) + "Service"; - } - wrapper.setService(serviceName); - String moduleName; - if (CollectionUtils.isNotEmpty(tags)) { - moduleName = StringUtils.capitalize(tags.get(0)); - } else { - moduleName = StringUtils.capitalize(split[0]); - } - wrapper.setModule(moduleName); - - key = StringUtils.replace(key, "{", "${params."); - wrapper.setEndpoint(key); - wrapper.setPathItem(pathItemEntry.getValue()); - - List wrappers = pathItemWrapperMap.getOrDefault(serviceName, Lists.newArrayList()); - wrappers.add(wrapper); - pathItemWrapperMap.put(serviceName, wrappers); - } - - List bizServiceList = new ArrayList<>(); - - for (Map.Entry> wrapperEntry : pathItemWrapperMap.entrySet()) { - BizService bizService = new BizService(); - bizService.setName(wrapperEntry.getKey()); - List wrappers = wrapperEntry.getValue(); - if (CollectionUtils.isEmpty(wrappers)) { - continue; - } - bizService.setModule(wrappers.get(0).getModule()); - - List bizRouters = new ArrayList<>(); - for (PathItemWrapper wrapper : wrappers) { - if (StringUtils.isBlank(wrapper.getEndpoint())) { - continue; - } - Path pathItem = wrapper.getPathItem(); - if (CollectionUtils.isNotEmpty(pathItem.getParameters())) { - System.out.println("not support parameters property of Path object yet"); - ; - } - if (pathItem.getGet() != null) { - BizRouter bizRouter = BizRouter.of(wrapper.getEndpoint(), "get", pathItem.getGet(), openAPI.getComponents()); - bizRouters.add(bizRouter); - } - if (pathItem.getPost() != null) { - BizRouter bizRouter = BizRouter.of(wrapper.getEndpoint(), "post", pathItem.getPost(), openAPI.getComponents()); - bizRouters.add(bizRouter); - } - if (pathItem.getPut() != null) { - BizRouter bizRouter = BizRouter.of(wrapper.getEndpoint(), "put", pathItem.getPut(), openAPI.getComponents()); - bizRouters.add(bizRouter); - } - if (pathItem.getDelete() != null) { - BizRouter bizRouter = BizRouter.of(wrapper.getEndpoint(), "delete", pathItem.getDelete(), openAPI.getComponents()); - bizRouters.add(bizRouter); - } - } - - bizService.setRouters(bizRouters); - - Set serviceTypes = bizRouters.stream() - .filter(bizRouter -> bizRouter.getReqBody() != null - && !bizRouter.getReqBody().getType().equals(TsTypeConstants.ANY) - && !bizRouter.getReqBody().getType().equals(TsTypeConstants.FORMDATA) - && !bizRouter.getReqBody().getType().equals(TsTypeConstants.BLOB) - ) - .map(bizRouter -> { - String type = bizRouter.getReqBody().getType(); - int index = type.indexOf("[]"); - if (index >= 0) { - type = type.substring(0, index); - } - if (TsTypeConstants.values().contains(type)) { - return null; - } - return type; - }).filter(StringUtils::isNotBlank).collect(Collectors.toCollection(LinkedHashSet::new)); - - LinkedHashSet collect = bizRouters.stream() - .filter(bizRouter -> bizRouter.getRespData() != null - && !bizRouter.getRespData().getType().equals(TsTypeConstants.ANY) - && !bizRouter.getRespData().getType().equals(TsTypeConstants.BLOB) - ) - .map(bizRouter -> { - String type = bizRouter.getRespData().getType(); - int index = type.indexOf("[]"); - if (index >= 0) { - type = type.substring(0, index); - } - if (TsTypeConstants.values().contains(type)) { - return null; - } - return type; - }).filter(StringUtils::isNotBlank).collect(Collectors.toCollection(LinkedHashSet::new)); - if (collect != null) { - serviceTypes.addAll(collect); - } - - bizService.setTypes(serviceTypes.stream().filter(t -> !t.startsWith("{")).collect(Collectors.toList())); - - bizServiceList.add(bizService); - } - - bizServer.setServices(bizServiceList); - return bizServer; - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizService.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizService.java deleted file mode 100644 index 4a281fb7..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizService.java +++ /dev/null @@ -1,20 +0,0 @@ -package cloud.unionj.generator.service.docparser.entity; - -import lombok.Data; - -import java.util.List; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.mock.docparser.entity - * date 2020/11/18 - */ -@Data -public class BizService { - private String name; - private String module; - private List routers; - private List types; - private List doc; -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizType.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizType.java deleted file mode 100644 index 4e664746..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/BizType.java +++ /dev/null @@ -1,125 +0,0 @@ -package cloud.unionj.generator.service.docparser.entity; - -import cloud.unionj.generator.openapi3.model.Schema; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateExceptionHandler; -import freemarker.template.Version; -import lombok.Data; -import lombok.SneakyThrows; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; - -import java.io.StringReader; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.mock.docparser.entity - * date 2020/11/18 - */ - -/** - * ReqBody typescript interface representation - */ -@Data -public class BizType { - - private String name; - private String doc; - private List properties; - private List enumTypes; - - @SneakyThrows - public String toCode() { - Configuration cfg = new Configuration(new Version(2, 3, 20)); - // Some other recommended settings: - cfg.setDefaultEncoding("UTF-8"); - cfg.setLocale(Locale.SIMPLIFIED_CHINESE); - cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); - - String tmpl = "{\n" + - "<#list properties as property>\n" + - " <#list property.docs as doc>\n" + - " <#if doc??>// ${doc}\n" + - " \n" + - " ${property.name}<#if !property.required>?: ${property.type};\n" + - "\n" + - "}"; - - Template template = new Template("BizType", new StringReader(tmpl), cfg); - - // write the freemarker output to a StringWriter - StringWriter stringWriter = new StringWriter(); - template.process(this, stringWriter); - - // get the String from the StringWriter - return stringWriter.toString(); - } - - public static BizType fromSchema(Schema schema, String typeName) { - return fromSchema(schema, null, typeName); - } - - public static BizType fromSchema(Schema schema, EnumAs enumAs) { - return fromSchema(schema, enumAs, null); - } - - public static enum EnumAs { - CODE, - DOC; - } - - public static BizType fromSchema(Schema schema, EnumAs enumAs, String typeName) { - BizType bizType = new BizType(); - bizType.setName(typeName); - bizType.setDoc(schema.getDescription()); - List bizPropertyList = new ArrayList<>(); - Map properties = schema.getProperties(); - List enumTypeList = new ArrayList<>(); - List required = schema.getRequired(); - for (Map.Entry property : properties.entrySet()) { - BizProperty bizProperty = new BizProperty(); - bizProperty.setDocs(new ArrayList<>()); - bizProperty.setName(property.getKey()); - Schema value = property.getValue(); - String desc = StringUtils.strip(value.getDescription()); - if (StringUtils.isNotBlank(desc)) { - bizProperty.setDoc(desc); - bizProperty.getDocs().add(desc); - } - if (CollectionUtils.isNotEmpty(value.getEnumValue())) { - if (enumAs != null && enumAs == EnumAs.DOC) { - String enums = StringUtils.strip(StringUtils.join(value.getEnumValue(), ", ")); - if (StringUtils.isNotBlank(enums)) { - bizProperty.setDoc(bizType.getDoc() + "\n" + enums); - bizProperty.getDocs().add(enums); - } - bizProperty.setType(property.getValue()); - } else { - String type = bizType.getName() + StringUtils.capitalize(property.getKey()) + "Enum"; - bizProperty.setType(type); - List voEnumList = value.getEnumValue().stream().map(item -> new BizEnum(item.toUpperCase(), item)).collect(Collectors.toList()); - BizEnumType voEnumType = new BizEnumType(voEnumList, type); - enumTypeList.add(voEnumType); - } - } else { - bizProperty.setType(property.getValue()); - } - if (CollectionUtils.isNotEmpty(required)) { - bizProperty.setRequired(required.contains(property.getKey())); - } - bizPropertyList.add(bizProperty); - } - bizType.setProperties(bizPropertyList); - bizType.setEnumTypes(enumTypeList); - return bizType; - } - -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/TsTypeConstants.java b/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/TsTypeConstants.java deleted file mode 100644 index 914ef6d5..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/java/cloud/unionj/generator/service/docparser/entity/TsTypeConstants.java +++ /dev/null @@ -1,25 +0,0 @@ -package cloud.unionj.generator.service.docparser.entity; - -import com.google.common.collect.Lists; - -import java.util.List; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.service.docparser.entity - * date 2020/11/27 - */ -public class TsTypeConstants { - - public static final String ANY = "any"; - public static final String FORMDATA = "FormData"; - public static final String STRING = "string"; - public static final String BLOB = "Blob"; - public static final String NUMBER = "number"; - public static final String BOOLEAN = "boolean"; - - public static final List values() { - return Lists.newArrayList(ANY, NUMBER, STRING, BOOLEAN); - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/BizService.ts.ftl b/unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/BizService.ts.ftl deleted file mode 100644 index c0f81b43..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/BizService.ts.ftl +++ /dev/null @@ -1,23 +0,0 @@ -/** -* Generated by unionj-generator. -* You can edit it as your need. -*/ -import { merge } from 'lodash-es'; -import { CreateAxiosOptions, VAxios } from 'pullcode/src/httputil/Axios'; -import { RequestOptions } from 'pullcode/src/types/axios'; - -const defaultOptions: CreateAxiosOptions = { - requestOptions: { - apiUrl: '', // same as baseUrl - urlPrefix: '', - } as RequestOptions, -} - -export class BizService extends VAxios { - constructor(options?: Partial) { - super(merge(defaultOptions, options || {})); - } -} - -export default BizService; - diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/Service.ts.ftl b/unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/Service.ts.ftl deleted file mode 100644 index 1a6fcc1b..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/Service.ts.ftl +++ /dev/null @@ -1,98 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* -* @module ${module} -*/ -import { CreateAxiosOptions } from "pullcode/src/httputil/axiosTransform"; -import BizService from "./BizService"; -<#if types?has_content> -import type { -<#list types as type> - ${type}, - -} from "./types" - - -export class ${name} extends BizService{ - - constructor(options?: Partial) { - super(options); - } - -<#list routers as router> - /** - * ${router.httpMethod?upper_case} ${router.endpoint} - * - <#if router.docs??> - <#list router.docs as doc> - * ${doc} - - - <#if router.reqBody??> - * @param ${router.reqBody.name} ${router.reqBody.doc!} - - <#if router.allParams??> - <#list router.allParams as param> - * @param ${param.name} ${param.doc!} - - - * @returns Promise<${(router.respData.type=="Blob")?then("any",router.respData.type)}> ${router.respData.doc!} - */ - ${router.name}( - <#if router.reqBody??> - ${router.reqBody.name}: ${router.reqBody.type}, - - <#if router.allParams??> - params: { - <#list router.allParams as param> - ${param.name}<#if !param.required>?: ${param.type}, - - }, - - ) :Promise<${(router.respData.type=="Blob")?then("any",router.respData.type)}> { - <#if router.urlSearchParams??> - const urlSearchParams = new URLSearchParams(); - <#list router.urlSearchParams as urlSearchParam> - <#if !urlSearchParam.required>params.${urlSearchParam.name} !== undefined && urlSearchParams.append('${urlSearchParam.name}', '' + params.${urlSearchParam.name}); - - - return this.getAxios().${router.httpMethod?lower_case}(`${router.endpoint}`, - <#if router.reqBody??> - ${router.reqBody.name}, - <#elseif router.urlSearchParams??> - urlSearchParams, - <#elseif router.httpMethod?lower_case == "post" || router.httpMethod?lower_case == "put"> - null, - - { - <#if router.queryParams??> - params: { - <#list router.queryParams as queryParam> - ${queryParam.name}: params.${queryParam.name}, - - }, - - <#if router.urlSearchParams??> - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - - <#if router.respData.type == "Blob"> - responseType: 'blob', - - } - ) - } - - -} - -export default ${name}; - -export function create${name}(opt?: Partial) { - return new ${name}(opt); -} - -export const ${name?uncap_first} = create${name}(); - diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/types.ts.ftl b/unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/types.ts.ftl deleted file mode 100644 index fbe153ac..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/main/resources/templates/services/types.ts.ftl +++ /dev/null @@ -1,36 +0,0 @@ -/** -* Generated by unionj-generator. -* Don't edit! -* @module types -*/ - -<#list types as type> - <#if type.doc??> -/** -* ${type.doc} -*/ - -export interface ${type.name} { -<#list type.properties as property> - <#if property.doc??> - /** - * ${property.doc} - */ - - ${property.name}<#if !property.required>?: ${property.type}; - -} - -<#if type.enumTypes?has_content> -<#list type.enumTypes as enumType> -export enum ${enumType.name} { -<#if enumType.enums?has_content> -<#list enumType.enums as enum> - ${enum.name} = "${enum.value}", - - -} - - - - \ No newline at end of file diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/BizServiceTsGeneratorTest.java b/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/BizServiceTsGeneratorTest.java deleted file mode 100644 index cd5a55ee..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/BizServiceTsGeneratorTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package cloud.unionj.generator.service; - -import cloud.unionj.generator.service.docparser.ServiceDocParser; -import cloud.unionj.generator.service.docparser.entity.BizServer; -import org.junit.Assert; -import org.junit.Test; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.IOException; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.service - * date 2020/11/26 - */ -public class BizServiceTsGeneratorTest { - - @Test - public void generate() throws IOException { - try (BufferedInputStream is = new BufferedInputStream(ClassLoader.getSystemResourceAsStream("petstore3.json"))) { - BizServer bizServer = ServiceDocParser.parse(is); - BizServiceTsGenerator bizServiceTsGenerator = new BizServiceTsGenerator(bizServer.getName()); - String outputFile = bizServiceTsGenerator.generate(); - File file = new File(outputFile); - Assert.assertTrue(file.exists()); - } - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ComponentsDesigner.java b/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ComponentsDesigner.java deleted file mode 100644 index 30d1edc3..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ComponentsDesigner.java +++ /dev/null @@ -1,167 +0,0 @@ -package cloud.unionj.generator.service; - -import cloud.unionj.generator.openapi3.model.Generic; -import cloud.unionj.generator.openapi3.model.Schema; - -import static cloud.unionj.generator.openapi3.dsl.Generic.generic; -import static cloud.unionj.generator.openapi3.dsl.Reference.reference; -import static cloud.unionj.generator.openapi3.dsl.Schema.schema; -import static cloud.unionj.generator.openapi3.dsl.SchemaHelper.*; - -/** - * @author: created by wubin - * @version: v0.1 - * @description: cloud.unionj.generator.openapi3.dsl.paths - * @date:2020/12/19 - */ -public class ComponentsDesigner { - - private static Schema sizeProperty = int32("姣忛〉鏉℃暟锛岄粯璁10锛屼紶-1鏌ュ嚭鍏ㄩ儴鏁版嵁"); - - private static Schema currentProperty = int32("褰撳墠椤碉紝浠1寮濮"); - - private static Schema offsetProperty = int32("鍋忕Щ閲"); - - private static Schema sortProperty = string("鎺掑簭鏉′欢瀛楃涓诧細鎺掑簭瀛楁鍓嶄娇鐢'-'(闄嶅簭)鍜'+'(鍗囧簭)鍙疯〃绀烘帓搴忚鍒欙紝澶氫釜鎺掑簭瀛楁鐢','闅斿紑", - "+id,-create_at"); - - private static Schema pageProperty = int32("褰撳墠椤碉紝浠1寮濮"); - - private static Schema limitProperty = int32("姣忛〉鏉℃暟锛岄粯璁10, 浼-1鏌ュ嚭鍏ㄩ儴鏁版嵁", 10); - - private static Schema maxPageProperty = int32("瀵煎嚭缁撴潫椤"); - - private static Schema totalProperty = int64("鎬绘暟锛屽叆鍙備紶鍏ユ鍙傛暟鍒欎笉鍐嶆煡璇ount锛屼互姝otal涓哄噯"); - - private static Schema topStatusProperty = int32("闇瑕佹帓鍦ㄥ墠鐨勭姸鎬"); - - public static Schema ResultDTO = schema(sb -> { - sb.type("object"); - sb.title("ResultDTO"); - sb.dummy("com.treeyee.cloud.community.es.page.ResultDTO"); - sb.properties("code", int32); - sb.properties("msg", string); - sb.properties("data", T); - }); - - public static Schema PageResultVO = schema(sb -> { - sb.type("object"); - sb.title("PageResultVO"); - sb.properties("items", ListT); - sb.properties("total", totalProperty); - sb.properties("size", sizeProperty); - sb.properties("current", currentProperty); - sb.properties("searchCount", bool); - sb.properties("pages", int32("褰撳墠鍒嗛〉鎬婚〉鏁")); - sb.properties("offset", offsetProperty); - }); - - public static Schema User = schema(sb -> { - sb.type("object"); - sb.title("User"); - sb.properties("name", string); - sb.properties("info", T); - }); - - public static Generic UserDate = generic(gb -> { - gb.generic(User, dateTime); - }); - - public static Generic UserInteger = generic(gb -> { - gb.generic(User, int32); - }); - - public static Generic ResultDTOListUserDate = generic(gb -> { - gb.generic(ResultDTO, schema(sb -> { - sb.type("array"); - sb.uniqueItems(true); - sb.items(reference(rb -> { - rb.ref(UserDate.getxTitle()); - })); - })); - }); - - public static Generic ResultDTOListUserInteger = generic(gb -> { - gb.generic(ResultDTO, schema(sb -> { - sb.type("array"); - sb.uniqueItems(true); - sb.items(reference(rb -> { - rb.ref(UserInteger.getxTitle()); - })); - })); - }); - - public static Schema PageSetVO = schema(sb -> { - sb.type("object"); - sb.title("PageSetVO"); - sb.properties("items", SetT); - sb.properties("total", totalProperty); - sb.properties("size", sizeProperty); - sb.properties("current", currentProperty); - sb.properties("searchCount", bool); - sb.properties("pages", int32("褰撳墠鍒嗛〉鎬婚〉鏁")); - sb.properties("offset", offsetProperty); - }); - - public static Schema RankVO = schema(sb -> { - sb.type("object"); - sb.title("RankVO"); - sb.description("姒滃崟"); - sb.properties("serialNo", int32); - sb.properties("avatar", string("澶村儚url", - "https://treeyee-spire.oss-cn-beijing.aliyuncs.com/cddf0ecc-a03e-4c16-8757-92bd7c4800ba1592982748849.jpg")); - sb.properties("name", string); - sb.properties("income", doubleNumer("绱鏀跺叆")); - sb.properties("quantity", int32("瀹屾垚浠诲姟鏁伴噺")); - }); - - public static Schema PageResult = schema(sb -> { - sb.type("object"); - sb.title("PageResult"); - sb.description("鍒嗛〉缁撴灉"); - sb.dummy("com.treeyee.cloud.community.es.page.PageResult"); - sb.properties("items", ListT); - sb.properties("total", totalProperty); - sb.properties("size", sizeProperty); - sb.properties("current", currentProperty); - sb.properties("searchCount", bool); - sb.properties("pages", int32("褰撳墠鍒嗛〉鎬婚〉鏁")); - sb.properties("offset", offsetProperty); - }); - - public static Schema JobVO = schema(sb -> { - sb.type("object"); - sb.title("JobVO"); - sb.properties("joinStatus", enums("鎶ュ悕鎯呭喌", new String[]{"鎶ュ悕鍙傚姞", "宸叉姤鍚", "鏌ョ湅鎶ュ悕", "宸茬粨鏉"})); - sb.properties("status", enums("浠诲姟鐘舵", new String[]{"寰呭鏍", "瀹℃壒閫氳繃", "瀹℃壒鎷掔粷", "宸茬粨鏉", "宸茬粨绠"})); - sb.properties("deleteAt", dateTime("鍒犻櫎鏃堕棿")); - sb.properties("userID", int32("ID")); - }); - - public static Schema PageResultVOJobVO = generic(gb -> { - gb.generic(PageResult, reference(rb -> { - rb.ref(JobVO.getxTitle()); - })); - }); - - public static Schema NestedSearchJobPageResult = generic(gb -> { - gb.generic(ResultDTO, reference(rb -> { - rb.ref(PageResultVOJobVO.getxTitle()); - })); - }); - - public static Schema SearchJobPageResult = schema(sb -> { - sb.type("object"); - sb.title("SearchJobPageResult"); - sb.description("浠诲姟鎼滅储鍒嗛〉缁撴灉"); - sb.properties("page", ref(NestedSearchJobPageResult.getxTitle())); - }); - - public static Generic ResultDTOPageResultVOJobVO = generic(gb -> { - gb.generic(ResultDTO, reference(rb -> { - rb.ref(SearchJobPageResult.getxTitle()); - })); - }); - - public static Schema ResultDTOString = generic(gb -> gb.generic(ResultDTO, string)); -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ServiceFolderGeneratorTest.java b/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ServiceFolderGeneratorTest.java deleted file mode 100644 index 97ea1567..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ServiceFolderGeneratorTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package cloud.unionj.generator.service; - -import cloud.unionj.generator.service.docparser.ServiceDocParser; -import cloud.unionj.generator.service.docparser.entity.BizServer; -import org.junit.Assert; -import org.junit.Test; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.IOException; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.service - * date 2020/11/27 - */ -public class ServiceFolderGeneratorTest { - - @Test - public void generate() throws IOException { - try (BufferedInputStream is = new BufferedInputStream(ClassLoader.getSystemResourceAsStream("userservice_openapi3.json"))) { - BizServer bizServer = ServiceDocParser.parse(is); - ServiceFolderGenerator serviceFolderGenerator = new ServiceFolderGenerator.Builder(bizServer).zip(false).build(); - String outputFile = serviceFolderGenerator.generate(); - File file = new File(outputFile); - Assert.assertTrue(file.exists()); - } - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ServiceTsGeneratorTest.java b/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ServiceTsGeneratorTest.java deleted file mode 100644 index 7fbff2f4..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/ServiceTsGeneratorTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package cloud.unionj.generator.service; - -import cloud.unionj.generator.service.docparser.ServiceDocParser; -import cloud.unionj.generator.service.docparser.entity.BizServer; -import cloud.unionj.generator.service.docparser.entity.BizService; -import org.junit.Assert; -import org.junit.Test; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.IOException; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.service - * date 2020/11/27 - */ -public class ServiceTsGeneratorTest { - - @Test - public void generate() throws IOException { - try (BufferedInputStream is = new BufferedInputStream(ClassLoader.getSystemResourceAsStream("userservice_openapi3.json"))) { - BizServer bizServer = ServiceDocParser.parse(is); - for (BizService bizService : bizServer.getServices()) { - ServiceTsGenerator serviceTsGenerator = new ServiceTsGenerator(bizService); - String outputFile = serviceTsGenerator.generate(); - File file = new File(outputFile); - Assert.assertTrue(file.exists()); - } - } - } - - @Test - public void generate2() throws IOException { - try (BufferedInputStream is = new BufferedInputStream(ClassLoader.getSystemResourceAsStream("usersvc_openapi3.json"))) { - BizServer bizServer = ServiceDocParser.parse(is); - for (BizService bizService : bizServer.getServices()) { - ServiceTsGenerator serviceTsGenerator = new ServiceTsGenerator(bizService); - String outputFile = serviceTsGenerator.generate(); - File file = new File(outputFile); - Assert.assertTrue(file.exists()); - } - } - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/TypesTsGeneratorTest.java b/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/TypesTsGeneratorTest.java deleted file mode 100644 index 94b0187f..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/TypesTsGeneratorTest.java +++ /dev/null @@ -1,248 +0,0 @@ -package cloud.unionj.generator.service; - -import cloud.unionj.generator.openapi3.dsl.servers.Server; -import cloud.unionj.generator.openapi3.model.Openapi3; -import cloud.unionj.generator.service.docparser.ServiceDocParser; -import cloud.unionj.generator.service.docparser.entity.BizServer; -import org.junit.Assert; -import org.junit.Test; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.IOException; - -import static cloud.unionj.generator.openapi3.dsl.Openapi3.openapi3; -import static cloud.unionj.generator.openapi3.dsl.Reference.reference; -import static cloud.unionj.generator.openapi3.dsl.Schema.schema; -import static cloud.unionj.generator.openapi3.dsl.SchemaHelper.*; -import static cloud.unionj.generator.openapi3.dsl.info.Info.info; -import static cloud.unionj.generator.openapi3.dsl.paths.Content.content; -import static cloud.unionj.generator.openapi3.dsl.paths.Get.get; -import static cloud.unionj.generator.openapi3.dsl.paths.MediaType.mediaType; -import static cloud.unionj.generator.openapi3.dsl.paths.Parameter.parameter; -import static cloud.unionj.generator.openapi3.dsl.paths.Path.path; -import static cloud.unionj.generator.openapi3.dsl.paths.Post.post; -import static cloud.unionj.generator.openapi3.dsl.paths.RequestBody.requestBody; -import static cloud.unionj.generator.openapi3.dsl.paths.Response.response; -import static cloud.unionj.generator.openapi3.dsl.paths.Responses.responses; -import static cloud.unionj.generator.service.ComponentsDesigner.ResultDTOString; -import static cloud.unionj.generator.service.ComponentsDesigner.SearchJobPageResult; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.service - * date 2020/11/27 - */ -public class TypesTsGeneratorTest { - - @Test - public void generate() throws IOException { - try (BufferedInputStream is = new BufferedInputStream(ClassLoader.getSystemResourceAsStream("test.json"))) { - BizServer bizServer = ServiceDocParser.parse(is); - TypesTsGenerator typesTsGenerator = new TypesTsGenerator(bizServer.getTypes()); - String outputFile = typesTsGenerator.generate(); - File file = new File(outputFile); - Assert.assertTrue(file.exists()); - } - } - - @Test - public void generate4() throws IOException { - try (BufferedInputStream is = new BufferedInputStream(ClassLoader.getSystemResourceAsStream("usersvc_openapi3.json"))) { - BizServer bizServer = ServiceDocParser.parse(is); - TypesTsGenerator typesTsGenerator = new TypesTsGenerator(bizServer.getTypes()); - String outputFile = typesTsGenerator.generate(); - File file = new File(outputFile); - Assert.assertTrue(file.exists()); - } - } - - @Test - public void generate1() throws IOException { - Openapi3 openapi3 = openapi3(ob -> { - info(ib -> { - ib.title("娴嬭瘯"); - ib.version("v1.0.0"); - }); - - Server.server(sb -> { - sb.url("http://www.unionj.com"); - }); - - path("/clshenbao/form/save", pb -> { - post(ppb -> { - ppb.summary("鏉愭枡鐢虫姤锛氫繚瀛榝orm琛ㄥ崟"); - ppb.tags("鏉愭枡鐢虫姤妯″潡"); - ppb.tags("clshenbaoForm"); - - requestBody(rb -> { - rb.required(true); - rb.description("杩欐槸payload"); - rb.content(content(cb -> { - cb.applicationJson(mediaType(mb -> { - mb.schema(schema(sb -> { - sb.type("object"); - sb.title("PostClshenbaoFormSavePayload"); - sb.properties("userID", int64); - sb.properties("fields", stringArray); - })); - })); - })); - }); - - parameter(para -> { - para.required(true); - para.in("query"); - para.name("key"); - para.description("閿"); - para.schema(string); - }); - - parameter(para -> { - para.required(false); - para.in("query"); - para.name("style"); - para.description("鏍峰紡"); - para.schema(string); - }); - - responses(rb -> { - rb.response200(response(rrb -> { - rrb.description("杩斿洖鍙傛暟"); - rrb.content(content(cb -> { - cb.applicationJson(mediaType(mb -> { - mb.schema(reference(rrrb -> { - rrrb.ref(SearchJobPageResult.getxTitle()); - })); - })); - })); - })); - }); - }); - }); - }); - - BizServer bizServer = ServiceDocParser.parse(openapi3); - ServiceFolderGenerator serviceFolderGenerator = new ServiceFolderGenerator.Builder(bizServer).zip(false).build(); - serviceFolderGenerator.generate(); - } - - @Test - public void generate2() throws IOException { - Openapi3 openapi3 = openapi3(ob -> { - info(ib -> { - ib.title("娴嬭瘯"); - ib.version("v1.0.0"); - }); - - Server.server(sb -> { - sb.url("http://www.unionj.com"); - }); - - path("/oss/upload", pb -> { - post(ppb -> { - ppb.summary("涓婁紶闄勪欢"); - ppb.tags("attachment"); - - parameter(para -> { - para.required(false); - para.in("query"); - para.name("returnKey"); - para.schema(bool); - }); - - requestBody(rb -> { - rb.required(true); - rb.content(content(cb -> { - cb.multipartFormData(mediaType(mb -> { - mb.schema(schema(upload -> { - upload.type("object"); - upload.properties("file", schema(file -> { - file.type("string"); - file.format("binary"); - })); - })); - })); - })); - }); - - responses(rb -> { - rb.response200(response(rrb -> { - rrb.content(content(cb -> { - cb.applicationJson(mediaType(mb -> { - mb.schema(reference(rrrb -> { - rrrb.ref(ResultDTOString.getxTitle()); - })); - })); - })); - })); - }); - }); - }); - }); - - BizServer bizServer = ServiceDocParser.parse(openapi3); - ServiceFolderGenerator serviceFolderGenerator = new ServiceFolderGenerator.Builder(bizServer).zip(false).build(); - serviceFolderGenerator.generate(); - } - - @Test - public void generate3() throws IOException { - Openapi3 openapi3 = openapi3(ob -> { - info(ib -> { - ib.title("娴嬭瘯"); - ib.version("v1.0.0"); - }); - - Server.server(sb -> { - sb.url("http://www.unionj.com"); - }); - - path("/oss/get", pb -> { - get(ppb -> { - ppb.summary("鑾峰彇闄勪欢"); - ppb.tags("attachment"); - - parameter(para -> { - para.required(true); - para.in("query"); - para.name("key"); - para.schema(string); - }); - - parameter(para -> { - para.required(false); - para.in("query"); - para.name("style"); - para.schema(string); - }); - - responses(rb -> { - rb.response200(response(rrb -> { - rrb.content(content(cb -> { - cb.applicationOctetStream(mediaType(mb -> { - mb.schema(schema(download -> { - download.type("string"); - download.format("binary"); - })); - })); - })); - })); - }); - }); - }); - }); - - BizServer bizServer = ServiceDocParser.parse(openapi3); - ServiceFolderGenerator serviceFolderGenerator = new ServiceFolderGenerator.Builder(bizServer).zip(false).build(); - serviceFolderGenerator.generate(); - } - - @Test - public void testRegex() { - String testStr = "a-b><<_2"; - testStr = testStr.replaceAll("[^a-zA-Z0-9_]", ""); - System.out.println(testStr); - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/docparser/ServiceDocParserTest.java b/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/docparser/ServiceDocParserTest.java deleted file mode 100644 index 07879478..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/test/java/cloud/unionj/generator/service/docparser/ServiceDocParserTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package cloud.unionj.generator.service.docparser; - -import cloud.unionj.generator.service.docparser.entity.BizRouter; -import cloud.unionj.generator.service.docparser.entity.BizServer; -import cloud.unionj.generator.service.docparser.entity.BizService; -import org.junit.Assert; -import org.junit.Test; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.util.List; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.service.docparser - * date 2020/11/27 - */ -public class ServiceDocParserTest { - - @Test - public void parse() throws IOException { - try (BufferedInputStream is = new BufferedInputStream(ClassLoader.getSystemResourceAsStream("petstore3.json"))) { - BizServer bizServer = ServiceDocParser.parse(is); - Assert.assertNotNull(bizServer); - List services = bizServer.getServices(); - for (BizService bizService : services) { - List routers = bizService.getRouters(); - for (BizRouter bizRouter : routers) { - String httpMethod = bizRouter.getHttpMethod(); - Assert.assertNotNull(httpMethod); - } - } - } - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/petstore3.json b/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/petstore3.json deleted file mode 100644 index 16eb1357..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/petstore3.json +++ /dev/null @@ -1,1228 +0,0 @@ -{ - "openapi": "3.0.2", - "info": { - "title": "Swagger Petstore - OpenAPI 3.0", - "description": "This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach!\nYou can now help us improve the API whether it's by making changes to the definition itself or to the code.\nThat way, with time, we can improve the API in general, and expose some of the new features in OAS3.\n\nSome useful links:\n- [The Pet Store repository](https://github.com/swagger-api/swagger-petstore)\n- [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml)", - "termsOfService": "http://swagger.io/terms/", - "contact": { - "email": "apiteam@swagger.io" - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" - }, - "version": "1.0.5" - }, - "externalDocs": { - "description": "Find out more about Swagger", - "url": "http://swagger.io" - }, - "servers": [ - { - "url": "/api/v3" - } - ], - "tags": [ - { - "name": "pet", - "description": "Everything about your Pets", - "externalDocs": { - "description": "Find out more", - "url": "http://swagger.io" - } - }, - { - "name": "store", - "description": "Operations about user" - }, - { - "name": "user", - "description": "Access to Petstore orders", - "externalDocs": { - "description": "Find out more about our store", - "url": "http://swagger.io" - } - } - ], - "paths": { - "/pet": { - "put": { - "tags": [ - "pet" - ], - "summary": "Update an existing pet", - "description": "Update an existing pet by Id", - "operationId": "updatePet", - "requestBody": { - "description": "Update an existent pet in the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - }, - "405": { - "description": "Validation exception" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "post": { - "tags": [ - "pet" - ], - "summary": "Add a new pet to the store", - "description": "Add a new pet to the store", - "operationId": "addPet", - "requestBody": { - "description": "Create a new pet in the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/findByStatus": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by status", - "description": "Multiple status values can be provided with comma separated strings", - "operationId": "findPetsByStatus", - "parameters": [ - { - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": false, - "explode": true, - "schema": { - "type": "string", - "default": "available", - "enum": [ - "available", - "pending", - "sold" - ] - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "description": "Invalid status value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/findByTags": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by tags", - "description": "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTags", - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": false, - "explode": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/{petId}": { - "get": { - "tags": [ - "pet" - ], - "summary": "Find pet by ID", - "description": "Returns a single pet", - "operationId": "getPetById", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet to return", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - } - }, - "security": [ - { - "api_key": [] - }, - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "post": { - "tags": [ - "pet" - ], - "summary": "Updates a pet in the store with form data", - "description": "", - "operationId": "updatePetWithForm", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be updated", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - }, - { - "name": "name", - "in": "query", - "description": "Name of pet that needs to be updated", - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "Status of pet that needs to be updated", - "schema": { - "type": "string" - } - } - ], - "responses": { - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "delete": { - "tags": [ - "pet" - ], - "summary": "Deletes a pet", - "description": "", - "operationId": "deletePet", - "parameters": [ - { - "name": "api_key", - "in": "header", - "description": "", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "petId", - "in": "path", - "description": "Pet id to delete", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "400": { - "description": "Invalid pet value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/{petId}/uploadImage": { - "post": { - "tags": [ - "pet" - ], - "summary": "uploads an image", - "description": "", - "operationId": "uploadFile", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet to update", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - }, - { - "name": "additionalMetadata", - "in": "query", - "description": "Additional Metadata", - "required": false, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary" - } - } - } - }, - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponse" - } - } - } - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/store/inventory": { - "get": { - "tags": [ - "store" - ], - "summary": "Returns pet inventories by status", - "description": "Returns a map of status codes to quantities", - "operationId": "getInventory", - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "integer", - "format": "int32" - } - } - } - } - } - }, - "security": [ - { - "api_key": [] - } - ] - } - }, - "/store/order": { - "post": { - "tags": [ - "store" - ], - "summary": "Place an order for a pet", - "description": "Place a new order in the store", - "operationId": "placeOrder", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "405": { - "description": "Invalid input" - } - } - } - }, - "/store/order/{orderId}": { - "get": { - "tags": [ - "store" - ], - "summary": "Find purchase order by ID", - "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", - "operationId": "getOrderById", - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of order that needs to be fetched", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - }, - "delete": { - "tags": [ - "store" - ], - "summary": "Delete purchase order by ID", - "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", - "operationId": "deleteOrder", - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of the order that needs to be deleted", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - } - }, - "/user": { - "post": { - "tags": [ - "user" - ], - "summary": "Create user", - "description": "This can only be done by the logged in user.", - "operationId": "createUser", - "requestBody": { - "description": "Created user object", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "responses": { - "default": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - } - } - } - }, - "/user/createWithList": { - "post": { - "tags": [ - "user" - ], - "summary": "Creates list of users with given input array", - "description": "Creates list of users with given input array", - "operationId": "createUsersWithListInput", - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/User" - } - } - } - } - }, - "responses": { - "200": { - "description": "Successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "default": { - "description": "successful operation" - } - } - } - }, - "/user/login": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs user into the system", - "description": "", - "operationId": "loginUser", - "parameters": [ - { - "name": "username", - "in": "query", - "description": "The user name for login", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "password", - "in": "query", - "description": "The password for login in clear text", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "headers": { - "X-Rate-Limit": { - "description": "calls per hour allowed by the user", - "schema": { - "type": "integer", - "format": "int32" - } - }, - "X-Expires-After": { - "description": "date in UTC when toekn expires", - "schema": { - "type": "string", - "format": "date-time" - } - } - }, - "content": { - "application/xml": { - "schema": { - "type": "string" - } - }, - "application/json": { - "schema": { - "type": "string" - } - } - } - }, - "400": { - "description": "Invalid username/password supplied" - } - } - } - }, - "/user/logout": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs out current logged in user session", - "description": "", - "operationId": "logoutUser", - "parameters": [], - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/{username}": { - "get": { - "tags": [ - "user" - ], - "summary": "Get user by user name", - "description": "", - "operationId": "getUserByName", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be fetched. Use user1 for testing. ", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "put": { - "tags": [ - "user" - ], - "summary": "Update user", - "description": "This can only be done by the logged in user.", - "operationId": "updateUser", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "name that need to be deleted", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "description": "Update an existent user in the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "responses": { - "default": { - "description": "successful operation" - } - } - }, - "delete": { - "tags": [ - "user" - ], - "summary": "Delete user", - "description": "This can only be done by the logged in user.", - "operationId": "deleteUser", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be deleted", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - } - } - }, - "components": { - "schemas": { - "Order": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 10 - }, - "petId": { - "type": "integer", - "format": "int64", - "example": 198772 - }, - "quantity": { - "type": "integer", - "format": "int32", - "example": 7 - }, - "shipDate": { - "type": "string", - "format": "date-time" - }, - "status": { - "type": "string", - "description": "Order Status", - "example": "approved", - "enum": [ - "placed", - "approved", - "delivered" - ] - }, - "complete": { - "type": "boolean" - } - }, - "xml": { - "name": "order" - } - }, - "Customer": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 100000 - }, - "username": { - "type": "string", - "example": "fehguy" - }, - "address": { - "type": "array", - "xml": { - "name": "addresses", - "wrapped": true - }, - "items": { - "$ref": "#/components/schemas/Address" - } - } - }, - "xml": { - "name": "customer" - } - }, - "Address": { - "type": "object", - "properties": { - "street": { - "type": "string", - "example": "437 Lytton" - }, - "city": { - "type": "string", - "example": "Palo Alto" - }, - "state": { - "type": "string", - "example": "CA" - }, - "zip": { - "type": "string", - "example": "94301" - } - }, - "xml": { - "name": "address" - } - }, - "Category": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 1 - }, - "name": { - "type": "string", - "example": "Dogs" - } - }, - "xml": { - "name": "category" - } - }, - "User": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 10 - }, - "username": { - "type": "string", - "example": "theUser" - }, - "firstName": { - "type": "string", - "example": "John" - }, - "lastName": { - "type": "string", - "example": "James" - }, - "email": { - "type": "string", - "example": "john@email.com" - }, - "password": { - "type": "string", - "example": "12345" - }, - "phone": { - "type": "string", - "example": "12345" - }, - "userStatus": { - "type": "integer", - "description": "User Status", - "format": "int32", - "example": 1 - } - }, - "xml": { - "name": "user" - } - }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string", - "format": "tag" - } - }, - "xml": { - "name": "tag" - } - }, - "Pet": { - "required": [ - "name", - "photoUrls" - ], - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 10 - }, - "name": { - "type": "string", - "example": "doggie", - "format": "dog" - }, - "category": { - "$ref": "#/components/schemas/Category" - }, - "photoUrls": { - "type": "array", - "xml": { - "wrapped": true - }, - "items": { - "type": "string", - "xml": { - "name": "photoUrl" - }, - "format": "image" - } - }, - "tags": { - "type": "array", - "xml": { - "wrapped": true - }, - "items": { - "$ref": "#/components/schemas/Tag" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - } - }, - "xml": { - "name": "pet" - } - }, - "ApiResponse": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "type": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "xml": { - "name": "##default" - } - } - }, - "requestBodies": { - "Pet": { - "description": "Pet object that needs to be added to the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "UserArray": { - "description": "List of user object", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/User" - } - } - } - } - } - }, - "securitySchemes": { - "petstore_auth": { - "type": "oauth2", - "flows": { - "implicit": { - "authorizationUrl": "https://petstore3.swagger.io/oauth/authorize", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - } - }, - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - } - } - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/test.json b/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/test.json deleted file mode 100644 index dce33a2e..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/test.json +++ /dev/null @@ -1,499 +0,0 @@ -{ - "openapi": "3.0.2", - "info": { - "title": "娴嬭瘯", - "version": "v1.0.0" - }, - "servers": [ - { - "url": "http://www.unionj.com" - } - ], - "paths": { - "/file/download": { - "get": { - "tags": [ - "file" - ], - "summary": "鏂囦欢涓嬭浇", - "parameters": [ - { - "name": "fileID", - "in": "query", - "description": "鏂囦欢ID", - "required": true, - "deprecated": false, - "schema": { - "type": "string", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "explode": false, - "allowReserved": false - } - ], - "responses": { - "200": { - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "$ref": "#/components/schemas/ResultDTO芦String禄", - "tree": false - } - } - } - }, - "403": { - "description": "Forbidden", - "content": { - "application/json": { - "schema": { - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "$ref": "#/components/schemas/ResultDTO芦String禄", - "tree": false - } - } - } - } - }, - "deprecated": false - } - }, - "/hall/offlineSurvey/update": { - "post": { - "tags": [ - "hall_offlinesurvey" - ], - "summary": "鏇存柊淇℃伅, 閲嶆柊鎻愪氦瀹℃牳", - "requestBody": { - "content": { - "application/json": { - "schema": { - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "$ref": "#/components/schemas/User芦Integer禄", - "tree": false - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "$ref": "#/components/schemas/ResultDTO芦Set芦User芦Integer禄禄禄", - "tree": false - } - } - } - } - }, - "deprecated": false - } - }, - "/hall/onlineSurvey/list": { - "post": { - "tags": [ - "hall_onlinesurvey" - ], - "summary": "缃戠粶璋冩煡鍒嗛〉", - "requestBody": { - "content": { - "application/json": { - "schema": { - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "$ref": "#/components/schemas/User芦Date禄", - "tree": false - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "$ref": "#/components/schemas/ResultDTO芦Set芦User芦Date禄禄禄", - "tree": false - } - } - } - } - }, - "deprecated": false - } - } - }, - "components": { - "schemas": { - "User": { - "title": "User", - "type": "object", - "properties": { - "name": { - "type": "string", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "info": { - "type": "object", - "format": "T", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - } - }, - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "User芦Integer禄": { - "title": "User芦Integer禄", - "type": "object", - "properties": { - "name": { - "type": "string", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "info": { - "type": "integer", - "format": "int32", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - } - }, - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "ResultDTO芦Set芦User芦Date禄禄禄": { - "title": "ResultDTO芦Set芦User芦Date禄禄禄", - "type": "object", - "properties": { - "msg": { - "type": "string", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "code": { - "type": "integer", - "format": "int32", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "data": { - "type": "array", - "items": { - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "$ref": "#/components/schemas/User芦Date禄", - "tree": false - }, - "uniqueItems": true, - "deprecated": false, - "nullable": false, - "tree": false - } - }, - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "ResultDTO芦Set芦User芦Integer禄禄禄": { - "title": "ResultDTO芦Set芦User芦Integer禄禄禄", - "type": "object", - "properties": { - "msg": { - "type": "string", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "code": { - "type": "integer", - "format": "int32", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "data": { - "type": "array", - "items": { - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "$ref": "#/components/schemas/User芦Integer禄", - "tree": false - }, - "uniqueItems": true, - "deprecated": false, - "nullable": false, - "tree": false - } - }, - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "ShopRecommendApplyDetailCondition": { - "title": "ShopRecommendApplyDetailCondition", - "type": "object", - "properties": { - "total": { - "type": "integer", - "format": "int64", - "description": "鎬绘暟锛屽叆鍙備紶鍏ユ鍙傛暟鍒欎笉鍐嶆煡璇ount锛屼互姝otal涓哄噯", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "current": { - "type": "integer", - "format": "int32", - "description": "褰撳墠椤碉紝浠1寮濮", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "size": { - "type": "integer", - "format": "int32", - "description": "姣忛〉鏉℃暟锛岄粯璁10锛屼紶-1鏌ュ嚭鍏ㄩ儴鏁版嵁", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "offset": { - "type": "integer", - "format": "int32", - "description": "鍋忕Щ閲", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "topStatus": { - "type": "integer", - "format": "int32", - "description": "闇瑕佹帓鍦ㄥ墠鐨勭姸鎬", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "limit": { - "type": "integer", - "format": "int32", - "description": "姣忛〉鏉℃暟锛岄粯璁10, 浼-1鏌ュ嚭鍏ㄩ儴鏁版嵁", - "uniqueItems": false, - "example": 10, - "deprecated": false, - "nullable": false, - "tree": false - }, - "shopName": { - "type": "string", - "description": "搴楅摵鍚嶇О", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "page": { - "type": "integer", - "format": "int32", - "description": "褰撳墠椤碉紝浠1寮濮", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "sort": { - "type": "string", - "description": "鎺掑簭鏉′欢瀛楃涓诧細鎺掑簭瀛楁鍓嶄娇鐢'-'(闄嶅簭)鍜'+'(鍗囧簭)鍙疯〃绀烘帓搴忚鍒欙紝澶氫釜鎺掑簭瀛楁鐢','闅斿紑", - "uniqueItems": false, - "example": "+id,-create_at", - "deprecated": false, - "nullable": false, - "tree": false - }, - "maxPage": { - "type": "integer", - "format": "int32", - "description": "瀵煎嚭缁撴潫椤", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "status": { - "type": "array", - "items": { - "type": "integer", - "format": "int32", - "description": "瀹℃壒鐘舵", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "description": "瀹℃壒鐘舵", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - } - }, - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "User芦Date禄": { - "title": "User芦Date禄", - "type": "object", - "properties": { - "name": { - "type": "string", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "info": { - "type": "string", - "format": "date-time", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - } - }, - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "ResultDTO": { - "title": "ResultDTO", - "type": "object", - "properties": { - "msg": { - "type": "string", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "code": { - "type": "integer", - "format": "int32", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "data": { - "type": "object", - "format": "T", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - } - }, - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "FuzzySearchRequestVO": { - "title": "FuzzySearchRequestVO", - "type": "object", - "properties": { - "keyword": { - "type": "string", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - }, - "type": { - "type": "string", - "description": "鍩庡競", - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false, - "enum": [ - "鍖椾含", - "涓婃捣", - "骞垮窞", - "娣卞湷" - ] - } - }, - "uniqueItems": false, - "deprecated": false, - "nullable": false, - "tree": false - } - } - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/userservice_openapi3.json b/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/userservice_openapi3.json deleted file mode 100755 index 62eb7972..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/userservice_openapi3.json +++ /dev/null @@ -1,329 +0,0 @@ -{ - "openapi": "3.0.2", - "paths": { - "/userservice/login": { - "post": { - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/LogInForm" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Auth" - } - } - } - } - } - } - }, - "/userservice/pageusers": { - "post": { - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PageQuery" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PageRet" - } - } - } - } - } - } - }, - "/userservice/signup": { - "post": { - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SignUpForm" - } - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "integer", - "format": "int32" - } - } - } - } - } - } - }, - "/userservice/user/{b}/{id}": { - "get": { - "parameters": [ - { - "name": "id", - "in": "path", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "a", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "b", - "in": "path", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "c", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "d", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "e", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - }, - { - "name": "f", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserVo" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "Auth": { - "title": "Auth", - "type": "object", - "properties": { - "token": { - "type": "string" - }, - "user": { - "$ref": "#/components/schemas/UserVo" - } - } - }, - "LogInForm": { - "title": "LogInForm", - "type": "object", - "properties": { - "password": { - "type": "string" - }, - "username": { - "type": "string" - } - } - }, - "Order": { - "title": "Order", - "type": "object", - "properties": { - "col": { - "type": "string" - }, - "sort": { - "type": "string" - } - } - }, - "Page": { - "title": "Page", - "type": "object", - "properties": { - "offset": { - "type": "integer", - "format": "int32" - }, - "orders": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Order" - } - }, - "size": { - "type": "integer", - "format": "int32" - } - } - }, - "PageFilter": { - "title": "PageFilter", - "type": "object", - "properties": { - "dept": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - } - } - }, - "PageQuery": { - "title": "PageQuery", - "type": "object", - "properties": { - "filter": { - "$ref": "#/components/schemas/PageFilter" - }, - "page": { - "$ref": "#/components/schemas/Page" - } - } - }, - "PageRet": { - "title": "PageRet", - "type": "object", - "properties": { - "hasNext": { - "type": "boolean" - }, - "items": { - "type": "object" - }, - "pageNo": { - "type": "integer", - "format": "int32" - }, - "pageSize": { - "type": "integer", - "format": "int32" - }, - "total": { - "type": "integer", - "format": "int32" - } - } - }, - "Ret": { - "title": "Ret", - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "data": { - "type": "object" - }, - "err": { - "type": "object" - }, - "mmm": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/UserVo" - } - }, - "msg": { - "type": "string" - } - } - }, - "SignUpForm": { - "title": "SignUpForm", - "type": "object", - "properties": { - "passConfirm": { - "type": "string" - }, - "password": { - "type": "string" - }, - "username": { - "type": "string" - } - } - }, - "UserVo": { - "title": "UserVo", - "type": "object", - "properties": { - "dept": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - }, - "phone": { - "type": "string" - } - } - } - } - } -} diff --git a/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/usersvc_openapi3.json b/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/usersvc_openapi3.json deleted file mode 100755 index 6a146b33..00000000 --- a/unionj-generator-client/unionj-generator-client-typescript/src/test/resources/usersvc_openapi3.json +++ /dev/null @@ -1,563 +0,0 @@ -{ - "openapi": "3.0.2", - "info": { - "title": "Usersvc", - "description": "Usersvc 鐢ㄦ埛绠$悊鏈嶅姟\n璋冪敤鐢ㄦ埛璇︽儏銆佺敤鎴峰垎椤靛拰涓婁紶澶村儚鎺ュ彛闇瑕佸甫涓夿earer Token璇锋眰澶碶n鐢ㄦ埛娉ㄥ唽銆佺敤鎴风櫥褰曞拰涓嬭浇澶村儚鎺ュ彛鍙互鍏紑璁块棶锛屾棤椤婚壌鏉僜nUsersvc is user management service\nYou should set Bearer Token header when you request protected endpoints such as user detail, user pagination and upload avatar.\nYou can add doc for whole service here", - "version": "v20220223" - }, - "servers": [ - { - "url": "http://localhost:6060" - } - ], - "paths": { - "/logout": { - "get": { - "description": "GetLogout 娉ㄩ攢token\nGetLogout is used for revoking a token\nhttps://github.com/dgrijalva/jwt-go/issues/214", - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetLogoutResp" - } - } - } - } - } - } - }, - "/me": { - "get": { - "description": "GetMe 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛璇︽儏鎺ュ彛\nGetMe is used for getting user info from token in header.", - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetMeResp" - } - } - } - } - } - } - }, - "/page/users": { - "post": { - "description": "PageUsers 鐢ㄦ埛鍒嗛〉鎺ュ彛\n灞曠ず濡備綍瀹氫箟POST璇锋眰涓擟ontent-Type涓篴pplication/json鐨勬帴鍙nPageUsers is user pagination api\ndemo how to define post request api which accepts application/json content-type", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PageQuery" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PageUsersResp" - } - } - } - } - } - } - }, - "/public/download/avatar": { - "get": { - "description": "GetPublicDownloadAvatar 涓嬭浇澶村儚鎺ュ彛\n灞曠ず濡備綍瀹氫箟鏂囦欢涓嬭浇鎺ュ彛\n鍑芥暟绛惧悕鐨勫嚭鍙傞噷蹇呴』鏈変笖鍙湁涓涓*os.File绫诲瀷鐨勫弬鏁癨nGetPublicDownloadAvatar is avatar download api\ndemo how to define file download api\nNOTE: there must be one and at most one *os.File output parameter", - "parameters": [ - { - "name": "userId", - "in": "query", - "description": "鐢ㄦ埛ID\nuser id", - "required": true, - "schema": { - "type": "integer", - "format": "int32", - "description": "鐢ㄦ埛ID\nuser id" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary", - "description": "鏂囦欢浜岃繘鍒舵祦\navatar file" - } - } - } - } - } - } - }, - "/public/log/in": { - "post": { - "description": "PublicLogIn 鐢ㄦ埛鐧诲綍鎺ュ彛\n灞曠ず濡備綍閴存潈骞惰繑鍥瀟oken\nPublicLogIn is user login api\ndemo how to do authentication and issue token", - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/PublicLogInReq" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicLogInResp" - } - } - } - } - } - } - }, - "/public/sign/up": { - "post": { - "description": "PublicSignUp 鐢ㄦ埛娉ㄥ唽鎺ュ彛\n灞曠ず濡備綍瀹氫箟POST璇锋眰涓擟ontent-Type鏄痑pplication/x-www-form-urlencoded鐨勬帴鍙nPublicSignUp is user signup api\ndemo how to define post request api which accepts application/x-www-form-urlencoded content-type", - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/PublicSignUpReq" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicSignUpResp" - } - } - } - } - } - } - }, - "/public/token/validate": { - "post": { - "description": "PublicTokenValidate token鏍¢獙鎺ュ彛\n濡傛灉token鏈夋晥锛岃繑鍥炵敤鎴蜂俊鎭痋nPublicTokenValidate validates token string\nif token is valid, return user information", - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/PublicTokenValidateReq" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicTokenValidateResp" - } - } - } - } - } - } - }, - "/upload/avatar": { - "post": { - "description": "UploadAvatar 涓婁紶澶村儚鎺ュ彛\n灞曠ず濡備綍瀹氫箟鏂囦欢涓婁紶鎺ュ彛\n鍑芥暟绛惧悕鐨勫叆鍙傞噷蹇呴』瑕佹湁鑷冲皯涓涓猍]*v3.FileModel鎴栬*v3.FileModel绫诲瀷鐨勫弬鏁癨nUploadAvatar is avatar upload api\ndemo how to define file upload api\nNOTE: there must be at least one []*v3.FileModel or *v3.FileModel input parameter", - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/UploadAvatarReq" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UploadAvatarResp" - } - } - } - } - } - } - }, - "/user": { - "get": { - "description": "GetUser 鐢ㄦ埛璇︽儏鎺ュ彛\n灞曠ず濡備綍瀹氫箟甯︽煡璇㈠瓧绗︿覆鍙傛暟鐨凣ET璇锋眰鎺ュ彛\nGetUser is user detail api\ndemo how to define get http request with query string parameters", - "parameters": [ - { - "name": "userId", - "in": "query", - "description": "鐢ㄦ埛ID\nuser id", - "required": true, - "schema": { - "type": "integer", - "format": "int32", - "description": "鐢ㄦ埛ID\nuser id" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetUserResp" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "GetLogoutResp": { - "title": "GetLogoutResp", - "type": "object", - "properties": { - "data": { - "type": "string", - "description": "鎴愬姛杩斿洖OK\nreturn OK if success" - } - }, - "required": [ - "data" - ] - }, - "GetMeResp": { - "title": "GetMeResp", - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/UserVo" - } - }, - "required": [ - "data" - ] - }, - "GetUserResp": { - "title": "GetUserResp", - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/UserVo" - } - }, - "required": [ - "data" - ] - }, - "Order": { - "title": "Order", - "type": "object", - "properties": { - "col": { - "type": "string" - }, - "sort": { - "type": "string" - } - }, - "required": [ - "col", - "sort" - ] - }, - "Page": { - "title": "Page", - "type": "object", - "properties": { - "orders": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Order" - }, - "description": "鎺掑簭瑙勫垯" - }, - "pageNo": { - "type": "integer", - "format": "int32", - "description": "椤电爜" - }, - "size": { - "type": "integer", - "format": "int32", - "description": "姣忛〉琛屾暟" - } - }, - "required": [ - "orders", - "pageNo", - "size" - ] - }, - "PageFilter": { - "title": "PageFilter", - "type": "object", - "properties": { - "dept": { - "type": "string", - "description": "鎵灞為儴闂" - }, - "name": { - "type": "string", - "description": "鐪熷疄濮撳悕锛屽墠缂鍖归厤" - } - }, - "required": [ - "name", - "dept" - ] - }, - "PageQuery": { - "title": "PageQuery", - "type": "object", - "properties": { - "filter": { - "$ref": "#/components/schemas/PageFilter" - }, - "page": { - "$ref": "#/components/schemas/Page" - } - }, - "description": "鍒嗛〉璇锋眰鍙傛暟\npagination parameter\n鍒嗛〉绛涢夋潯浠", - "required": [ - "filter", - "page" - ] - }, - "PageRet": { - "title": "PageRet", - "type": "object", - "properties": { - "hasNext": { - "type": "boolean" - }, - "items": { - "type": "object" - }, - "pageNo": { - "type": "integer", - "format": "int32" - }, - "pageSize": { - "type": "integer", - "format": "int32" - }, - "total": { - "type": "integer", - "format": "int32" - } - }, - "description": "鍒嗛〉缁撴灉\npagination result\n", - "required": [ - "items", - "pageNo", - "pageSize", - "total", - "hasNext" - ] - }, - "PageUsersResp": { - "title": "PageUsersResp", - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PageRet" - } - }, - "required": [ - "data" - ] - }, - "PublicLogInReq": { - "title": "PublicLogInReq", - "type": "object", - "properties": { - "password": { - "type": "string", - "description": "瀵嗙爜\npassword" - }, - "username": { - "type": "string", - "description": "鐢ㄦ埛鍚峔nusername" - } - }, - "required": [ - "username", - "password" - ] - }, - "PublicLogInResp": { - "title": "PublicLogInResp", - "type": "object", - "properties": { - "data": { - "type": "string", - "description": "token" - } - }, - "required": [ - "data" - ] - }, - "PublicSignUpReq": { - "title": "PublicSignUpReq", - "type": "object", - "properties": { - "code": { - "type": "string", - "description": "鍥惧舰楠岃瘉鐮乗nimage code" - }, - "password": { - "type": "string", - "description": "瀵嗙爜\npassword" - }, - "username": { - "type": "string", - "description": "鐢ㄦ埛鍚峔nusername" - } - }, - "required": [ - "username", - "password" - ] - }, - "PublicSignUpResp": { - "title": "PublicSignUpResp", - "type": "object", - "properties": { - "data": { - "type": "integer", - "format": "int32", - "description": "鎴愬姛杩斿洖鐢ㄦ埛ID\nreturn user ID if success" - } - }, - "required": [ - "data" - ] - }, - "PublicTokenValidateReq": { - "title": "PublicTokenValidateReq", - "type": "object", - "properties": { - "token": { - "type": "string" - } - }, - "required": [ - "token" - ] - }, - "PublicTokenValidateResp": { - "title": "PublicTokenValidateResp", - "type": "object", - "properties": { - "user": { - "$ref": "#/components/schemas/UserVo" - } - }, - "required": [ - "user" - ] - }, - "UploadAvatarReq": { - "title": "UploadAvatarReq", - "type": "object", - "properties": { - "avatar": { - "type": "string", - "format": "binary", - "description": "鐢ㄦ埛澶村儚\nuser avatar" - }, - "id": { - "type": "integer", - "format": "int32" - } - }, - "required": [ - "avatar", - "id" - ] - }, - "UploadAvatarResp": { - "title": "UploadAvatarResp", - "type": "object", - "properties": { - "data": { - "type": "string", - "description": "鎴愬姛杩斿洖OK\nreturn OK if success" - } - }, - "required": [ - "data" - ] - }, - "UserVo": { - "title": "UserVo", - "type": "object", - "properties": { - "dept": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "username": { - "type": "string" - } - }, - "description": "\n鐢ㄦ埛璇︽儏\nuser detail\n鐢ㄦ埛璇︽儏\nuser detail\n", - "required": [ - "id", - "username", - "name", - "phone", - "dept" - ] - } - } - } -} \ No newline at end of file diff --git a/unionj-generator-frontend/pom.xml b/unionj-generator-frontend/pom.xml deleted file mode 100644 index 0718a66a..00000000 --- a/unionj-generator-frontend/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - 4.0.0 - - - io.github.unionj-cloud - unionj-generator - 1.6.7-SNAPSHOT - - unionj-generator-frontend - unionj-generator-frontend - - - - io.github.unionj-cloud - unionj-generator-core - ${project.version} - - - io.github.unionj-cloud - unionj-generator-client-typescript - ${project.version} - compile - - - - diff --git a/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/PackageJsonGenerator.java b/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/PackageJsonGenerator.java deleted file mode 100644 index 77afa67f..00000000 --- a/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/PackageJsonGenerator.java +++ /dev/null @@ -1,46 +0,0 @@ -package cloud.unionj.generator.frontend.vue; - -import cloud.unionj.generator.GeneratorUtils; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator - * date 2020/11/22 - */ -public class PackageJsonGenerator extends VueGenerator { - - private String projectName; - private String outputDir = OUTPUT_DIR; - - public PackageJsonGenerator(String projectName) { - this.projectName = projectName; - } - - public PackageJsonGenerator(String projectName, String outputDir) { - this.projectName = projectName; - this.outputDir = outputDir; - } - - @Override - public Map getInput() { - Map input = new HashMap(); - input.put("projectName", this.projectName); - return input; - } - - @Override - public String getTemplate() { - return OUTPUT_DIR + "/package.json.ftl"; - } - - @Override - public String getOutputFile() { - return GeneratorUtils.getOutputDir(this.outputDir) + File.separator + "package.json"; - } - -} diff --git a/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/ReadmeMdGenerator.java b/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/ReadmeMdGenerator.java deleted file mode 100644 index 8eea2fb4..00000000 --- a/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/ReadmeMdGenerator.java +++ /dev/null @@ -1,46 +0,0 @@ -package cloud.unionj.generator.frontend.vue; - -import cloud.unionj.generator.GeneratorUtils; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator - * date 2020/11/22 - */ -public class ReadmeMdGenerator extends VueGenerator { - - private String projectName; - private String outputDir = OUTPUT_DIR; - - public ReadmeMdGenerator(String projectName) { - this.projectName = projectName; - } - - public ReadmeMdGenerator(String projectName, String outputDir) { - this.projectName = projectName; - this.outputDir = outputDir; - } - - @Override - public Map getInput() { - Map input = new HashMap(); - input.put("projectName", this.projectName); - return input; - } - - @Override - public String getTemplate() { - return OUTPUT_DIR + "/README.md.ftl"; - } - - @Override - public String getOutputFile() { - return GeneratorUtils.getOutputDir(this.outputDir) + File.separator + "README.md"; - } - -} diff --git a/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/VueGenerator.java b/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/VueGenerator.java deleted file mode 100644 index 56f7ac17..00000000 --- a/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/VueGenerator.java +++ /dev/null @@ -1,13 +0,0 @@ -package cloud.unionj.generator.frontend.vue; - -import cloud.unionj.generator.DefaultGenerator; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.mock - * date 2020/11/26 - */ -public abstract class VueGenerator extends DefaultGenerator { - protected static final String OUTPUT_DIR = "vue"; -} diff --git a/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/VueProjectGenerator.java b/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/VueProjectGenerator.java deleted file mode 100644 index b18e2f97..00000000 --- a/unionj-generator-frontend/src/main/java/cloud/unionj/generator/frontend/vue/VueProjectGenerator.java +++ /dev/null @@ -1,159 +0,0 @@ -package cloud.unionj.generator.frontend.vue; - -import cloud.unionj.generator.GeneratorUtils; -import cloud.unionj.generator.openapi3.model.Openapi3; -import cloud.unionj.generator.service.ServiceFolderGenerator; -import cloud.unionj.generator.service.docparser.ServiceDocParser; -import cloud.unionj.generator.service.docparser.entity.BizServer; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import lombok.SneakyThrows; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; - -import java.io.File; -import java.io.InputStream; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.Map; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator - * date 2020/11/22 - */ -public class VueProjectGenerator extends VueGenerator { - - private String doc; - private InputStream is; - private Openapi3 openAPI; - private String projectName; - private String outputDir; - private boolean scaffold; - private boolean includeMock; - - public static final class Builder { - private String doc; - private InputStream is; - private Openapi3 openAPI; - private String projectName; - private String outputDir = OUTPUT_DIR; - private boolean scaffold; - private boolean includeMock; - - public Builder(String projectName) { - this.projectName = projectName; - } - - public Builder outputDir(String outputDir) { - this.outputDir = outputDir; - return this; - } - - public Builder doc(String doc) { - this.doc = doc; - return this; - } - - public Builder is(InputStream is) { - this.is = is; - return this; - } - - public Builder openAPI(Openapi3 openAPI) { - this.openAPI = openAPI; - return this; - } - - public Builder scaffold(boolean scaffold) { - this.scaffold = scaffold; - return this; - } - - public Builder includeMock(boolean includeMock) { - this.includeMock = includeMock; - return this; - } - - public VueProjectGenerator build() { - VueProjectGenerator vueProjectGenerator = new VueProjectGenerator(); - vueProjectGenerator.projectName = this.projectName; - vueProjectGenerator.outputDir = this.outputDir; - vueProjectGenerator.doc = this.doc; - vueProjectGenerator.is = this.is; - vueProjectGenerator.openAPI = this.openAPI; - vueProjectGenerator.scaffold = this.scaffold; - vueProjectGenerator.includeMock = this.includeMock; - return vueProjectGenerator; - } - } - - @Override - public Map getInput() { - return null; - } - - @Override - public String getTemplate() { - return null; - } - - @Override - public String getOutputFile() { - return GeneratorUtils.getOutputDir(this.outputDir); - } - - @SneakyThrows - @Override - public String generate() { - if (StringUtils.isBlank(this.doc) && this.openAPI == null && this.is == null) { - return null; - } - - if (scaffold) { - File folderZip = new File(getOutputFile() + ".zip"); - FileUtils.copyInputStreamToFile(ClassLoader.getSystemResourceAsStream(OUTPUT_DIR + ".zip"), folderZip); - GeneratorUtils.unzip(folderZip.getAbsolutePath(), new File(GeneratorUtils.getOutputDir(""))); - folderZip.delete(); - } - - // generate README.md - ReadmeMdGenerator readmeMdGenerator = new ReadmeMdGenerator(this.projectName); - readmeMdGenerator.generate(); - - // generate package.json - PackageJsonGenerator packageJsonGenerator = new PackageJsonGenerator(this.projectName); - packageJsonGenerator.generate(); - - BizServer bizServer; - if (StringUtils.isNotBlank(this.doc)) { - if (this.doc.startsWith("http")) { - bizServer = ServiceDocParser.parse(new URL(this.doc)); - } else { - bizServer = ServiceDocParser.parse(new File(this.doc)); - } - } else if (this.is != null) { - bizServer = ServiceDocParser.parse(this.is); - } else { - bizServer = ServiceDocParser.parse(this.openAPI); - } - if (bizServer != null) { - ServiceFolderGenerator serviceFolderGenerator = new ServiceFolderGenerator.Builder(bizServer).outputDir(getOutputFile() + "/src/services").zip(false).build(); - serviceFolderGenerator.generate(); - - if (StringUtils.isBlank(this.doc) && this.openAPI != null) { - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); - objectMapper.enable(SerializationFeature.INDENT_OUTPUT); - File oas3SpecFile = new File(getOutputFile() + "/src/services" + File.separator + "openapi3.json"); - FileUtils.writeStringToFile(oas3SpecFile, objectMapper.writeValueAsString(openAPI), StandardCharsets.UTF_8.name()); - } - } - - String outputFile = GeneratorUtils.getOutputDir("output") + File.separator + this.projectName + "_vue.zip"; - String sourceFile = getOutputFile(); - return GeneratorUtils.generateFolder(sourceFile, outputFile); - } -} diff --git a/unionj-generator-frontend/src/main/resources/templates/vue/README.md.ftl b/unionj-generator-frontend/src/main/resources/templates/vue/README.md.ftl deleted file mode 100644 index b496d63a..00000000 --- a/unionj-generator-frontend/src/main/resources/templates/vue/README.md.ftl +++ /dev/null @@ -1,44 +0,0 @@ -# ${projectName} - -## Project setup -``` -yarn install -``` - -### Init msw mock service worker -``` -make mock -``` - -### Start local api documentation. Then open http://localhost:4567 from browser -``` -make doc -``` - -### Compiles and hot-reloads for development -``` -yarn serve -``` - -### Compiles and minifies for production -``` -yarn build -``` - -### Run your unit tests -``` -yarn test:unit -``` - -### Run your end-to-end tests -``` -yarn test:e2e -``` - -### Lints and fixes files -``` -yarn lint -``` - -### Customize configuration -See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/unionj-generator-frontend/src/main/resources/templates/vue/package.json.ftl b/unionj-generator-frontend/src/main/resources/templates/vue/package.json.ftl deleted file mode 100644 index a8c45621..00000000 --- a/unionj-generator-frontend/src/main/resources/templates/vue/package.json.ftl +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "${projectName}", - "version": "0.1.0", - "private": true, - "scripts": { - "serve": "npx msw init public && vue-cli-service serve", - "build": "vue-cli-service build", - "test:unit": "vue-cli-service test:unit", - "test:e2e": "vue-cli-service test:e2e", - "lint": "vue-cli-service lint --fix", - "doc": "make doc", - "mock": "make mock" - }, - "dependencies": { - "ant-design-vue": "1.6.5", - "axios": "0.21.0", - "core-js": "3.6.5", - "msw": "0.22.3", - "vue": "2.6.11", - "vue-router": "3.2.0", - "vue2-waterfall": "3.0.1", - "vuex": "3.4.0" - }, - "devDependencies": { - "@ant-design/colors": "3.2.1", - "@babel/plugin-transform-runtime": "7.10.3", - "@babel/preset-env": "7.10.3", - "@types/jest": "24.0.19", - "@typescript-eslint/eslint-plugin": "4.7.0", - "@typescript-eslint/parser": "4.7.0", - "@vue/cli-plugin-babel": "4.5.0", - "@vue/cli-plugin-eslint": "4.5.8", - "@vue/cli-plugin-router": "4.5.0", - "@vue/cli-plugin-typescript": "4.5.0", - "@vue/cli-plugin-unit-jest": "4.5.0", - "@vue/cli-plugin-vuex": "4.5.0", - "@vue/cli-service": "4.5.0", - "@vue/eslint-config-airbnb": "5.1.0", - "@vue/eslint-config-typescript": "7.0.0", - "@vue/test-utils": "1.0.3", - "babel-core": "7.0.0-bridge.0", - "babel-plugin-import": "1.12.2", - "babel-plugin-transform-remove-console": "6.9.4", - "eslint": "7.0.0", - "eslint-plugin-import": "2.20.2", - "eslint-plugin-vue": "7.0.0", - "jest": "24.5.0", - "jquery": "3.5.1", - "less": "3.12.2", - "less-loader": "5.0.0", - "script-loader": "0.7.2", - "surge": "0.20.3", - "ts-jest": "24.0.0", - "typescript": "3.9.3", - "vue-jest": "3.0.4", - "vue-svg-icon-loader": "2.1.1", - "vue-template-compiler": "2.6.11", - "webpack-theme-color-replacer": "1.2.17" - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not dead" - ], - "jest": { - "preset": "@vue/cli-plugin-unit-jest/presets/typescript-and-babel" - } -} diff --git a/unionj-generator-frontend/src/main/resources/vue.zip b/unionj-generator-frontend/src/main/resources/vue.zip deleted file mode 100644 index 506a4e26db6773e1dcd8baa7b1f817b53295c872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124524 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%0Dfd{j3GF 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�U%mGnDo4Em-fbPK{V3h}< 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 diff --git a/unionj-generator-frontend/src/main/resources/vue/.editorconfig b/unionj-generator-frontend/src/main/resources/vue/.editorconfig deleted file mode 100644 index c24743d0..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/.editorconfig +++ /dev/null @@ -1,7 +0,0 @@ -[*.{js,jsx,ts,tsx,vue}] -indent_style = space -indent_size = 2 -end_of_line = lf -trim_trailing_whitespace = true -insert_final_newline = true -max_line_length = 100 diff --git a/unionj-generator-frontend/src/main/resources/vue/.env b/unionj-generator-frontend/src/main/resources/vue/.env deleted file mode 100644 index a49b1d80..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/.env +++ /dev/null @@ -1 +0,0 @@ -VUE_APP_PROXY_TARGET=http://api.union.com diff --git a/unionj-generator-frontend/src/main/resources/vue/.eslintrc.js b/unionj-generator-frontend/src/main/resources/vue/.eslintrc.js deleted file mode 100644 index 613da4f7..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/.eslintrc.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - extends: [ - 'plugin:vue/essential', - '@vue/typescript/recommended', - ], - rules: { - // override/add rules settings here, such as: - 'vue/no-unused-vars': 'error', - "vue/no-unused-properties": ["error", { - "groups": ["props", "data", "computed", "methods", "setup"] - }], - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/ban-ts-comment": "off", - "quotes": "off", - "@typescript-eslint/no-var-requires": "off" - } -} diff --git a/unionj-generator-frontend/src/main/resources/vue/.gitignore b/unionj-generator-frontend/src/main/resources/vue/.gitignore deleted file mode 100644 index 4ec82812..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -.DS_Store -node_modules -/dist - -/tests/e2e/videos/ -/tests/e2e/screenshots/ - - -# local env files -.env.local -.env.*.local - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/unionj-generator-frontend/src/main/resources/vue/Makefile b/unionj-generator-frontend/src/main/resources/vue/Makefile deleted file mode 100644 index 90342bc2..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -current_dir = $(shell pwd) -export current_dir - -doc: - docker run -p 4567:4567 -v $(current_dir)/apidoc:/srv/shins/source shins:latest - -mock: - npx msw init public - - - - - diff --git a/unionj-generator-frontend/src/main/resources/vue/babel.config.js b/unionj-generator-frontend/src/main/resources/vue/babel.config.js deleted file mode 100644 index abb7ba22..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/babel.config.js +++ /dev/null @@ -1,30 +0,0 @@ -const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV) - -const plugins = [ - ["@babel/plugin-transform-runtime"] -] -if (IS_PROD) { - plugins.push('transform-remove-console') -} - -// lazy load ant-design-vue -// if your use import on Demand, Use this code -plugins.push(['import', { - 'libraryName': 'ant-design-vue', - 'libraryDirectory': 'es', - 'style': true // `style: true` 浼氬姞杞 less 鏂囦欢 -}]) - -module.exports = { - presets: [ - '@vue/cli-plugin-babel/preset', - [ - '@babel/preset-env', - { - 'useBuiltIns': 'entry', - 'corejs': {version: 3, proposals: true} - } - ] - ], - plugins -} diff --git a/unionj-generator-frontend/src/main/resources/vue/public/favicon.ico b/unionj-generator-frontend/src/main/resources/vue/public/favicon.ico deleted file mode 100644 index 0d5b28ef281e80fb32bc8d04ae95236c69ab4e80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67646 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 S0u}*_fJML}U=b)e1pWsRVC%jB diff --git a/unionj-generator-frontend/src/main/resources/vue/public/index.html b/unionj-generator-frontend/src/main/resources/vue/public/index.html deleted file mode 100644 index 41235286..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/public/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - <%= htmlWebpackPlugin.options.title %> - - - -
- - - diff --git a/unionj-generator-frontend/src/main/resources/vue/src/App.vue b/unionj-generator-frontend/src/main/resources/vue/src/App.vue deleted file mode 100644 index b64853d8..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/App.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - diff --git a/unionj-generator-frontend/src/main/resources/vue/src/assets/logo.png b/unionj-generator-frontend/src/main/resources/vue/src/assets/logo.png deleted file mode 100644 index 8e942f6fab5eaba0de525002d64243c359a03a21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70216 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�-Q1?7LN-hS`5H9JuVDho?G6*4MmE6&|!rNi*~ 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 diff --git a/unionj-generator-frontend/src/main/resources/vue/src/components/PetStore.vue b/unionj-generator-frontend/src/main/resources/vue/src/components/PetStore.vue deleted file mode 100644 index e13641c3..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/components/PetStore.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - diff --git a/unionj-generator-frontend/src/main/resources/vue/src/components/Usage.vue b/unionj-generator-frontend/src/main/resources/vue/src/components/Usage.vue deleted file mode 100644 index 42d861ce..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/components/Usage.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - diff --git a/unionj-generator-frontend/src/main/resources/vue/src/main.ts b/unionj-generator-frontend/src/main/resources/vue/src/main.ts deleted file mode 100644 index b6021d39..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/main.ts +++ /dev/null @@ -1,19 +0,0 @@ -import Vue from "vue"; -import App from "./App.vue"; -import router from "./router"; -import store from "./store"; -import "./plugins/antd"; -import "./plugins/axios"; - -Vue.config.productionTip = false; - -if (process.env.NODE_ENV === "development") { - const { worker } = require("./mocks/browser"); - worker.start(); -} - -new Vue({ - router, - store, - render: h => h(App) -}).$mount("#app"); diff --git a/unionj-generator-frontend/src/main/resources/vue/src/plugins/antd.ts b/unionj-generator-frontend/src/main/resources/vue/src/plugins/antd.ts deleted file mode 100644 index 741c4896..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/plugins/antd.ts +++ /dev/null @@ -1,90 +0,0 @@ -import Vue from 'vue' -import { - ConfigProvider, - Layout, - Input, - InputNumber, - Button, - Switch, - Radio, - Checkbox, - Select, - Card, - Form, - Row, - Col, - Modal, - Table, - Tabs, - Icon, - Badge, - Popover, - Dropdown, - List, - Avatar, - Breadcrumb, - Steps, - Spin, - Menu, - Drawer, - Tooltip, - Alert, - Tag, - Divider, - DatePicker, - TimePicker, - Upload, - Progress, - Skeleton, - Popconfirm, - message, - notification, - FormModel -} from 'ant-design-vue' - -Vue.use(ConfigProvider) -Vue.use(Layout) -Vue.use(Input) -Vue.use(InputNumber) -Vue.use(Button) -Vue.use(Switch) -Vue.use(Radio) -Vue.use(Checkbox) -Vue.use(Select) -Vue.use(Card) -Vue.use(Form) -Vue.use(Row) -Vue.use(Col) -Vue.use(Modal) -Vue.use(Table) -Vue.use(Tabs) -Vue.use(Icon) -Vue.use(Badge) -Vue.use(Popover) -Vue.use(Dropdown) -Vue.use(List) -Vue.use(Avatar) -Vue.use(Breadcrumb) -Vue.use(Steps) -Vue.use(Spin) -Vue.use(Menu) -Vue.use(Drawer) -Vue.use(Tooltip) -Vue.use(Alert) -Vue.use(Tag) -Vue.use(Divider) -Vue.use(DatePicker) -Vue.use(TimePicker) -Vue.use(Upload) -Vue.use(Progress) -Vue.use(Skeleton) -Vue.use(Popconfirm) -Vue.use(FormModel) - -Vue.prototype.$confirm = Modal.confirm -Vue.prototype.$message = message -// Vue.prototype.$notification = notification -Vue.prototype.$info = Modal.info -Vue.prototype.$success = Modal.success -Vue.prototype.$error = Modal.error -Vue.prototype.$warning = Modal.warning diff --git a/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/AxiosErrorHandler.ts b/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/AxiosErrorHandler.ts deleted file mode 100644 index 408c57c4..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/AxiosErrorHandler.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { AxiosError } from "axios"; - -export default (error: AxiosError): Promise => { - if (error.response) { - // TODO - // add your logic to handle error - } - return Promise.reject(error); -}; diff --git a/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/RequestInterceptor.ts b/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/RequestInterceptor.ts deleted file mode 100644 index 18ab9d09..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/RequestInterceptor.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type {AxiosRequestConfig} from "axios" - -export default (config: AxiosRequestConfig): AxiosRequestConfig => { - // TODO - // add your logic here - return config -} diff --git a/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/ResponseInterceptor.ts b/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/ResponseInterceptor.ts deleted file mode 100644 index f84444c4..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/ResponseInterceptor.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type {AxiosResponse} from "axios" - -export default (response: AxiosResponse): any => { - // TODO - // add your logic here - return response.data -} diff --git a/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/index.ts b/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/index.ts deleted file mode 100644 index 5de638ba..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/plugins/axios/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import axios, { AxiosInstance } from "axios"; -import _Vue from "vue"; -import errorHandler from "./AxiosErrorHandler"; -import requestInterceptor from "./RequestInterceptor"; -import responseInterceptor from "./ResponseInterceptor"; - -const axiosPlugin = { - install(Vue: typeof _Vue, instance: AxiosInstance) { - Object.defineProperties(Vue.prototype, { - $http: { - get: function get() { - return instance; - } - } - }); - } -}; - -const axiosInstance = axios.create({ - // your options here -}); - -// request interceptor -axiosInstance.interceptors.request.use(requestInterceptor, errorHandler); - -// response interceptor -axiosInstance.interceptors.response.use(responseInterceptor, errorHandler); - -_Vue.use(axiosPlugin, axiosInstance); diff --git a/unionj-generator-frontend/src/main/resources/vue/src/router/index.ts b/unionj-generator-frontend/src/main/resources/vue/src/router/index.ts deleted file mode 100644 index 35371348..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/router/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import Vue from 'vue'; -import VueRouter, { RouteConfig } from 'vue-router'; -import Home from '../views/Home.vue'; - -Vue.use(VueRouter); - -const routes: Array = [ - { - path: '/', - name: 'Home', - component: Home, - }, - { - path: '/msw', - name: 'Msw', - // route level code-splitting - // this generates a separate chunk (about.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => import(/* webpackChunkName: "about" */ '../views/Msw.vue'), - }, -]; - -const router = new VueRouter({ - mode: 'history', - base: process.env.BASE_URL, - routes, -}); - -export default router; diff --git a/unionj-generator-frontend/src/main/resources/vue/src/shims-plugin.d.ts b/unionj-generator-frontend/src/main/resources/vue/src/shims-plugin.d.ts deleted file mode 100644 index 00f15be9..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/shims-plugin.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -declare module "vue/types/vue" { - import { AxiosInstance } from "axios"; - - interface Vue { - $http: AxiosInstance; - } -} - -export default { - inject: ['$http'], -} - diff --git a/unionj-generator-frontend/src/main/resources/vue/src/shims-tsx.d.ts b/unionj-generator-frontend/src/main/resources/vue/src/shims-tsx.d.ts deleted file mode 100644 index cbeeb129..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/shims-tsx.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import Vue, { VNode } from "vue"; - -declare global { - namespace JSX { - // tslint:disable no-empty-interface - interface Element extends VNode {} - // tslint:disable no-empty-interface - interface ElementClass extends Vue {} - interface IntrinsicElements { - [elem: string]: any; - } - } - - interface Window { - QRCode: any; - } -} diff --git a/unionj-generator-frontend/src/main/resources/vue/src/shims-vue.d.ts b/unionj-generator-frontend/src/main/resources/vue/src/shims-vue.d.ts deleted file mode 100644 index 58856f64..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/shims-vue.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module "*.vue" { - import Vue from "vue"; - - export default Vue; -} diff --git a/unionj-generator-frontend/src/main/resources/vue/src/shims-waterfall.d.ts b/unionj-generator-frontend/src/main/resources/vue/src/shims-waterfall.d.ts deleted file mode 100644 index 3f7f38a6..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/shims-waterfall.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare module "vue2-waterfall"; - diff --git a/unionj-generator-frontend/src/main/resources/vue/src/store/index.ts b/unionj-generator-frontend/src/main/resources/vue/src/store/index.ts deleted file mode 100644 index 9ea76852..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/store/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Vue from 'vue'; -import Vuex from 'vuex'; - -Vue.use(Vuex); - -export default new Vuex.Store({ - state: { - }, - mutations: { - }, - actions: { - }, - modules: { - }, -}); diff --git a/unionj-generator-frontend/src/main/resources/vue/src/views/Home.vue b/unionj-generator-frontend/src/main/resources/vue/src/views/Home.vue deleted file mode 100644 index 45b11b75..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/views/Home.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/unionj-generator-frontend/src/main/resources/vue/src/views/Msw.vue b/unionj-generator-frontend/src/main/resources/vue/src/views/Msw.vue deleted file mode 100644 index c7853fd6..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/src/views/Msw.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/unionj-generator-frontend/src/main/resources/vue/tsconfig.json b/unionj-generator-frontend/src/main/resources/vue/tsconfig.json deleted file mode 100644 index 8190bd00..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/tsconfig.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "module": "esnext", - "strict": true, - "jsx": "preserve", - "importHelpers": true, - "moduleResolution": "node", - "skipLibCheck": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "sourceMap": true, - "baseUrl": ".", - "types": [ - "webpack-env", - "jest" - ], - "paths": { - "~/*": [ - "src/*" - ], - "@/*": [ - "src/*" - ] - }, - "lib": [ - "esnext", - "dom", - "dom.iterable", - "scripthost" - ] - }, - "include": [ - "src/**/*.ts", - "src/**/*.tsx", - "src/**/*.vue", - "tests/**/*.ts", - "tests/**/*.tsx" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/unionj-generator-frontend/src/main/resources/vue/vue.config.js b/unionj-generator-frontend/src/main/resources/vue/vue.config.js deleted file mode 100644 index ab8dfa75..00000000 --- a/unionj-generator-frontend/src/main/resources/vue/vue.config.js +++ /dev/null @@ -1,99 +0,0 @@ -const path = require("path"); -const webpack = require("webpack"); - -function resolve(dir) { - return path.join(__dirname, dir); -} - -const isProd = process.env.NODE_ENV === "production"; - -const assetsCDN = { - // webpack build externals - externals: { - vue: "Vue", - "vue-router": "VueRouter", - vuex: "Vuex", - axios: "axios" - } -}; - -// vue.config.js -const vueConfig = { - configureWebpack: { - // webpack plugins - plugins: [ - // Ignore all locale files of moment.js - new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/) - ], - // if prod, add externals - externals: isProd ? assetsCDN.externals : {} - }, - - chainWebpack: config => { - config.resolve.alias.set("@$", resolve("src")); - - const svgRule = config.module.rule("svg"); - svgRule.uses.clear(); - svgRule - .oneOf("inline") - .resourceQuery(/inline/) - .use("vue-svg-icon-loader") - .loader("vue-svg-icon-loader") - .end() - .end() - .oneOf("external") - .use("file-loader") - .loader("file-loader") - .options({ - name: "assets/[name].[hash:8].[ext]" - }); - - config.plugin("html").tap(args => { - // TODO - args[0].title = "your title"; - return args; - }); - }, - - css: { - loaderOptions: { - less: { - modifyVars: { - // less vars锛宑ustomize ant design theme - - // 'primary-color': '#F5222D', - // 'link-color': '#F5222D', - "border-radius-base": "2px", - "menu-item-height": "64px", - "menu-inline-toplevel-item-height": "64px" - }, - // DO NOT REMOVE THIS LINE - javascriptEnabled: true - } - } - }, - - devServer: { - port: 8000, - disableHostCheck: true, - proxy: { - "^/api": { - target: process.env.VUE_APP_PROXY_TARGET, - ws: true, - changeOrigin: true, - timeout: 1000 * 60 * 10, - pathRewrite: { - "^/api": "/" - } - } - } - }, - - // disable source map in production - productionSourceMap: false, - lintOnSave: undefined, - // babel-loader no-ignore node_modules/* - transpileDependencies: [] -}; - -module.exports = vueConfig; diff --git a/unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/PackageJsonGeneratorTest.java b/unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/PackageJsonGeneratorTest.java deleted file mode 100644 index e1824d65..00000000 --- a/unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/PackageJsonGeneratorTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package cloud.unionj.generator.frontend.vue; - -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.frontend.vue - * date 2020/11/26 - */ -public class PackageJsonGeneratorTest { - - @Test - public void generate() { - PackageJsonGenerator packageJsonGenerator = new PackageJsonGenerator("娴嬭瘯椤圭洰"); - String outputFile = packageJsonGenerator.generate(); - File file = new File(outputFile); - Assert.assertTrue(file.exists()); - } -} diff --git a/unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/ReadmeMdGeneratorTest.java b/unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/ReadmeMdGeneratorTest.java deleted file mode 100644 index 568b08fc..00000000 --- a/unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/ReadmeMdGeneratorTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package cloud.unionj.generator.frontend.vue; - -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.frontend.vue - * date 2020/11/26 - */ -public class ReadmeMdGeneratorTest { - - @Test - public void generate() { - ReadmeMdGenerator readmeMdGenerator = new ReadmeMdGenerator("娴嬭瘯椤圭洰"); - String outputFile = readmeMdGenerator.generate(); - File file = new File(outputFile); - Assert.assertTrue(file.exists()); - } -} diff --git a/unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/VueProjectGeneratorTest.java b/unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/VueProjectGeneratorTest.java deleted file mode 100644 index 1c994508..00000000 --- a/unionj-generator-frontend/src/test/java/cloud/unionj/generator/frontend/vue/VueProjectGeneratorTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package cloud.unionj.generator.frontend.vue; - -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; - -/** - * @author created by wubin - * @version v0.1 - * cloud.unionj.generator.frontend.vue - * date 2020/11/26 - */ -public class VueProjectGeneratorTest { - - @Test - public void generate() { - String testFilePath = ClassLoader.getSystemResource("test.json").getPath(); - VueProjectGenerator vueProjectGenerator = new VueProjectGenerator.Builder("my-awesome-project").doc(testFilePath).scaffold(true).build(); - String outputFile = vueProjectGenerator.generate(); - File file = new File(outputFile); - Assert.assertTrue(file.exists()); - } -} diff --git a/unionj-generator-frontend/src/test/resources/petstore3.json b/unionj-generator-frontend/src/test/resources/petstore3.json deleted file mode 100644 index 1b8f2393..00000000 --- a/unionj-generator-frontend/src/test/resources/petstore3.json +++ /dev/null @@ -1,1184 +0,0 @@ -{ - "openapi": "3.0.2", - "info": { - "title": "Swagger Petstore - OpenAPI 3.0", - "description": "This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach!\nYou can now help us improve the API whether it's by making changes to the definition itself or to the code.\nThat way, with time, we can improve the API in general, and expose some of the new features in OAS3.\n\nSome useful links:\n- [The Pet Store repository](https://github.com/swagger-api/swagger-petstore)\n- [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml)", - "termsOfService": "http://swagger.io/terms/", - "contact": { - "email": "apiteam@swagger.io" - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" - }, - "version": "1.0.5" - }, - "externalDocs": { - "description": "Find out more about Swagger", - "url": "http://swagger.io" - }, - "servers": [ - { - "url": "/api/v3" - } - ], - "tags": [ - { - "name": "pet", - "description": "Everything about your Pets", - "externalDocs": { - "description": "Find out more", - "url": "http://swagger.io" - } - }, - { - "name": "store", - "description": "Operations about user" - }, - { - "name": "user", - "description": "Access to Petstore orders", - "externalDocs": { - "description": "Find out more about our store", - "url": "http://swagger.io" - } - } - ], - "paths": { - "/pet": { - "put": { - "tags": [ - "pet" - ], - "summary": "Update an existing pet", - "description": "Update an existing pet by Id", - "operationId": "updatePet", - "requestBody": { - "description": "Update an existent pet in the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - }, - "405": { - "description": "Validation exception" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "post": { - "tags": [ - "pet" - ], - "summary": "Add a new pet to the store", - "description": "Add a new pet to the store", - "operationId": "addPet", - "requestBody": { - "description": "Create a new pet in the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/findByStatus": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by status", - "description": "Multiple status values can be provided with comma separated strings", - "operationId": "findPetsByStatus", - "parameters": [ - { - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": false, - "explode": true, - "schema": { - "type": "string", - "default": "available", - "enum": [ - "available", - "pending", - "sold" - ] - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "description": "Invalid status value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/findByTags": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by tags", - "description": "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTags", - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": false, - "explode": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - }, - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - } - } - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/{petId}": { - "get": { - "tags": [ - "pet" - ], - "summary": "Find pet by ID", - "description": "Returns a single pet", - "operationId": "getPetById", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet to return", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - } - }, - "security": [ - { - "api_key": [] - }, - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "post": { - "tags": [ - "pet" - ], - "summary": "Updates a pet in the store with form data", - "description": "", - "operationId": "updatePetWithForm", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be updated", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - }, - { - "name": "name", - "in": "query", - "description": "Name of pet that needs to be updated", - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "Status of pet that needs to be updated", - "schema": { - "type": "string" - } - } - ], - "responses": { - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "delete": { - "tags": [ - "pet" - ], - "summary": "Deletes a pet", - "description": "", - "operationId": "deletePet", - "parameters": [ - { - "name": "api_key", - "in": "header", - "description": "", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "petId", - "in": "path", - "description": "Pet id to delete", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "400": { - "description": "Invalid pet value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/{petId}/uploadImage": { - "post": { - "tags": [ - "pet" - ], - "summary": "uploads an image", - "description": "", - "operationId": "uploadFile", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet to update", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - }, - { - "name": "additionalMetadata", - "in": "query", - "description": "Additional Metadata", - "required": false, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary" - } - } - } - }, - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponse" - } - } - } - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/store/inventory": { - "get": { - "tags": [ - "store" - ], - "summary": "Returns pet inventories by status", - "description": "Returns a map of status codes to quantities", - "operationId": "getInventory", - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "integer", - "format": "int32" - } - } - } - } - } - }, - "security": [ - { - "api_key": [] - } - ] - } - }, - "/store/order": { - "post": { - "tags": [ - "store" - ], - "summary": "Place an order for a pet", - "description": "Place a new order in the store", - "operationId": "placeOrder", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "405": { - "description": "Invalid input" - } - } - } - }, - "/store/order/{orderId}": { - "get": { - "tags": [ - "store" - ], - "summary": "Find purchase order by ID", - "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", - "operationId": "getOrderById", - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of order that needs to be fetched", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Order" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/Order" - } - } - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - }, - "delete": { - "tags": [ - "store" - ], - "summary": "Delete purchase order by ID", - "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", - "operationId": "deleteOrder", - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of the order that needs to be deleted", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - } - }, - "/user": { - "post": { - "tags": [ - "user" - ], - "summary": "Create user", - "description": "This can only be done by the logged in user.", - "operationId": "createUser", - "requestBody": { - "description": "Created user object", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "responses": { - "default": { - "description": "successful operation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - } - } - } - }, - "/user/createWithList": { - "post": { - "tags": [ - "user" - ], - "summary": "Creates list of users with given input array", - "description": "Creates list of users with given input array", - "operationId": "createUsersWithListInput", - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/User" - } - } - } - } - }, - "responses": { - "200": { - "description": "Successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "default": { - "description": "successful operation" - } - } - } - }, - "/user/login": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs user into the system", - "description": "", - "operationId": "loginUser", - "parameters": [ - { - "name": "username", - "in": "query", - "description": "The user name for login", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "password", - "in": "query", - "description": "The password for login in clear text", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "headers": { - "X-Rate-Limit": { - "description": "calls per hour allowed by the user", - "schema": { - "type": "integer", - "format": "int32" - } - }, - "X-Expires-After": { - "description": "date in UTC when toekn expires", - "schema": { - "type": "string", - "format": "date-time" - } - } - }, - "content": { - "application/xml": { - "schema": { - "type": "string" - } - }, - "application/json": { - "schema": { - "type": "string" - } - } - } - }, - "400": { - "description": "Invalid username/password supplied" - } - } - } - }, - "/user/logout": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs out current logged in user session", - "description": "", - "operationId": "logoutUser", - "parameters": [], - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/{username}": { - "get": { - "tags": [ - "user" - ], - "summary": "Get user by user name", - "description": "", - "operationId": "getUserByName", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be fetched. Use user1 for testing. ", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "content": { - "application/xml": { - "schema": { - "$ref": "#/components/schemas/User" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/User" - } - } - } - }, - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "delete": { - "tags": [ - "user" - ], - "summary": "Delete user", - "description": "This can only be done by the logged in user.", - "operationId": "deleteUser", - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be deleted", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - } - } - }, - "components": { - "schemas": { - "Order": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 10 - }, - "petId": { - "type": "integer", - "format": "int64", - "example": 198772 - }, - "quantity": { - "type": "integer", - "format": "int32", - "example": 7 - }, - "shipDate": { - "type": "string", - "format": "date-time" - }, - "status": { - "type": "string", - "description": "Order Status", - "example": "approved", - "enum": [ - "placed", - "approved", - "delivered" - ] - }, - "complete": { - "type": "boolean" - } - }, - "xml": { - "name": "order" - } - }, - "Customer": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 100000 - }, - "username": { - "type": "string", - "example": "fehguy" - }, - "address": { - "type": "array", - "xml": { - "name": "addresses", - "wrapped": true - }, - "items": { - "$ref": "#/components/schemas/Address" - } - } - }, - "xml": { - "name": "customer" - } - }, - "Address": { - "type": "object", - "properties": { - "street": { - "type": "string", - "example": "437 Lytton" - }, - "city": { - "type": "string", - "example": "Palo Alto" - }, - "state": { - "type": "string", - "example": "CA" - }, - "zip": { - "type": "string", - "example": "94301" - } - }, - "xml": { - "name": "address" - } - }, - "Category": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 1 - }, - "name": { - "type": "string", - "example": "Dogs" - } - }, - "xml": { - "name": "category" - } - }, - "User": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 10 - }, - "username": { - "type": "string", - "example": "theUser" - }, - "firstName": { - "type": "string", - "example": "John" - }, - "lastName": { - "type": "string", - "example": "James" - }, - "email": { - "type": "string", - "example": "john@email.com" - }, - "password": { - "type": "string", - "example": "12345" - }, - "phone": { - "type": "string", - "example": "12345" - }, - "userStatus": { - "type": "integer", - "description": "User Status", - "format": "int32", - "example": 1 - } - }, - "xml": { - "name": "user" - } - }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string", - "format": "tag" - } - }, - "xml": { - "name": "tag" - } - }, - "Pet": { - "required": [ - "name", - "photoUrls" - ], - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64", - "example": 10 - }, - "name": { - "type": "string", - "example": "doggie", - "format": "dog" - }, - "category": { - "$ref": "#/components/schemas/Category" - }, - "photoUrls": { - "type": "array", - "xml": { - "wrapped": true - }, - "items": { - "type": "string", - "xml": { - "name": "photoUrl" - }, - "format": "image" - } - }, - "tags": { - "type": "array", - "xml": { - "wrapped": true - }, - "items": { - "$ref": "#/components/schemas/Tag" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - } - }, - "xml": { - "name": "pet" - } - }, - "ApiResponse": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "type": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "xml": { - "name": "##default" - } - } - }, - "requestBodies": { - "Pet": { - "description": "Pet object that needs to be added to the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - }, - "application/xml": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "UserArray": { - "description": "List of user object", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/User" - } - } - } - } - } - }, - "securitySchemes": { - "petstore_auth": { - "type": "oauth2", - "flows": { - "implicit": { - "authorizationUrl": "https://petstore3.swagger.io/oauth/authorize", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - } - }, - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - } - } - } -} diff --git a/unionj-generator-frontend/src/test/resources/test.json b/unionj-generator-frontend/src/test/resources/test.json deleted file mode 100644 index 7f0a8639..00000000 --- a/unionj-generator-frontend/src/test/resources/test.json +++ /dev/null @@ -1,458 +0,0 @@ -{ - "openapi" : "3.0.2", - "info" : { - "title" : "娴嬭瘯", - "version" : "v1.0.0" - }, - "servers" : [ { - "url" : "http://www.unionj.com" - } ], - "paths" : { - "/file/download" : { - "get" : { - "tags" : [ "file" ], - "summary" : "鏂囦欢涓嬭浇", - "parameters" : [ { - "name" : "fileID", - "in" : "query", - "description" : "鏂囦欢ID", - "required" : true, - "deprecated" : false, - "schema" : { - "type" : "string", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "explode" : false, - "allowReserved" : false - } ], - "responses" : { - "200" : { - "content" : { - "application/octet-stream" : { - "schema" : { - "type" : "string", - "format" : "binary", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - } - } - } - }, - "401" : { - "description" : "Unauthorized", - "content" : { - "application/json" : { - "schema" : { - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "$ref" : "#/components/schemas/ResultDTO芦String禄", - "tree" : false - } - } - } - }, - "403" : { - "description" : "Forbidden", - "content" : { - "application/json" : { - "schema" : { - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "$ref" : "#/components/schemas/ResultDTO芦String禄", - "tree" : false - } - } - } - } - }, - "deprecated" : false - } - }, - "/hall/offlineSurvey/update" : { - "post" : { - "tags" : [ "hall_offlinesurvey" ], - "summary" : "鏇存柊淇℃伅, 閲嶆柊鎻愪氦瀹℃牳", - "requestBody" : { - "content" : { - "application/json" : { - "schema" : { - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "$ref" : "#/components/schemas/User芦Integer禄", - "tree" : false - } - } - }, - "required" : true - }, - "responses" : { - "200" : { - "content" : { - "application/json" : { - "schema" : { - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "$ref" : "#/components/schemas/ResultDTO芦Set芦User芦Integer禄禄禄", - "tree" : false - } - } - } - } - }, - "deprecated" : false - } - }, - "/hall/onlineSurvey/list" : { - "post" : { - "tags" : [ "hall_onlinesurvey" ], - "summary" : "缃戠粶璋冩煡鍒嗛〉", - "requestBody" : { - "content" : { - "application/json" : { - "schema" : { - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "$ref" : "#/components/schemas/User芦Date禄", - "tree" : false - } - } - }, - "required" : true - }, - "responses" : { - "200" : { - "content" : { - "application/json" : { - "schema" : { - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "$ref" : "#/components/schemas/ResultDTO芦Set芦User芦Date禄禄禄", - "tree" : false - } - } - } - } - }, - "deprecated" : false - } - } - }, - "components" : { - "schemas" : { - "User" : { - "title" : "User", - "type" : "object", - "properties" : { - "name" : { - "type" : "string", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "info" : { - "type" : "object", - "format" : "T", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - } - }, - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "User芦Integer禄" : { - "title" : "User芦Integer禄", - "type" : "object", - "properties" : { - "name" : { - "type" : "string", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "info" : { - "type" : "integer", - "format" : "int32", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - } - }, - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "ResultDTO芦Set芦User芦Date禄禄禄" : { - "title" : "ResultDTO芦Set芦User芦Date禄禄禄", - "type" : "object", - "properties" : { - "msg" : { - "type" : "string", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "code" : { - "type" : "integer", - "format" : "int32", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "data" : { - "type" : "array", - "items" : { - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "$ref" : "#/components/schemas/User芦Date禄", - "tree" : false - }, - "uniqueItems" : true, - "deprecated" : false, - "nullable" : false, - "tree" : false - } - }, - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "ResultDTO芦Set芦User芦Integer禄禄禄" : { - "title" : "ResultDTO芦Set芦User芦Integer禄禄禄", - "type" : "object", - "properties" : { - "msg" : { - "type" : "string", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "code" : { - "type" : "integer", - "format" : "int32", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "data" : { - "type" : "array", - "items" : { - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "$ref" : "#/components/schemas/User芦Integer禄", - "tree" : false - }, - "uniqueItems" : true, - "deprecated" : false, - "nullable" : false, - "tree" : false - } - }, - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "ShopRecommendApplyDetailCondition" : { - "title" : "ShopRecommendApplyDetailCondition", - "type" : "object", - "properties" : { - "total" : { - "type" : "integer", - "format" : "int64", - "description" : "鎬绘暟锛屽叆鍙備紶鍏ユ鍙傛暟鍒欎笉鍐嶆煡璇ount锛屼互姝otal涓哄噯", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "current" : { - "type" : "integer", - "format" : "int32", - "description" : "褰撳墠椤碉紝浠1寮濮", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "size" : { - "type" : "integer", - "format" : "int32", - "description" : "姣忛〉鏉℃暟锛岄粯璁10锛屼紶-1鏌ュ嚭鍏ㄩ儴鏁版嵁", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "offset" : { - "type" : "integer", - "format" : "int32", - "description" : "鍋忕Щ閲", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "topStatus" : { - "type" : "integer", - "format" : "int32", - "description" : "闇瑕佹帓鍦ㄥ墠鐨勭姸鎬", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "limit" : { - "type" : "integer", - "format" : "int32", - "description" : "姣忛〉鏉℃暟锛岄粯璁10, 浼-1鏌ュ嚭鍏ㄩ儴鏁版嵁", - "uniqueItems" : false, - "example" : 10, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "shopName" : { - "type" : "string", - "description" : "搴楅摵鍚嶇О", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "page" : { - "type" : "integer", - "format" : "int32", - "description" : "褰撳墠椤碉紝浠1寮濮", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "sort" : { - "type" : "string", - "description" : "鎺掑簭鏉′欢瀛楃涓诧細鎺掑簭瀛楁鍓嶄娇鐢'-'(闄嶅簭)鍜'+'(鍗囧簭)鍙疯〃绀烘帓搴忚鍒欙紝澶氫釜鎺掑簭瀛楁鐢','闅斿紑", - "uniqueItems" : false, - "example" : "+id,-create_at", - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "maxPage" : { - "type" : "integer", - "format" : "int32", - "description" : "瀵煎嚭缁撴潫椤", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "status" : { - "type" : "array", - "items" : { - "type" : "integer", - "format" : "int32", - "description" : "瀹℃壒鐘舵", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "description" : "瀹℃壒鐘舵", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - } - }, - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "User芦Date禄" : { - "title" : "User芦Date禄", - "type" : "object", - "properties" : { - "name" : { - "type" : "string", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "info" : { - "type" : "string", - "format" : "date-time", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - } - }, - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "ResultDTO" : { - "title" : "ResultDTO", - "type" : "object", - "properties" : { - "msg" : { - "type" : "string", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "code" : { - "type" : "integer", - "format" : "int32", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - }, - "data" : { - "type" : "object", - "format" : "T", - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - } - }, - "uniqueItems" : false, - "deprecated" : false, - "nullable" : false, - "tree" : false - } - } - } -}