diff --git a/client/plugin-module.js b/client/plugin-module.js index ebec237..a8073e5 100644 --- a/client/plugin-module.js +++ b/client/plugin-module.js @@ -1 +1 @@ -module.exports = {"import-postman" : {module: require('exts/yapi-plugin-import-postman/client.js'),options: null},"import-har" : {module: require('exts/yapi-plugin-import-har/client.js'),options: null},"advanced-mock" : {module: require('exts/yapi-plugin-advanced-mock/client.js'),options: null},"import-swagger" : {module: require('exts/yapi-plugin-import-swagger/client.js'),options: null},"statistics" : {module: require('exts/yapi-plugin-statistics/client.js'),options: null},"export-data" : {module: require('exts/yapi-plugin-export-data/client.js'),options: null},"gen-services" : {module: require('exts/yapi-plugin-gen-services/client.js'),options: null},"export-swagger2-data" : {module: require('exts/yapi-plugin-export-swagger2-data/client.js'),options: null},"import-yapi-json" : {module: require('exts/yapi-plugin-import-yapi-json/client.js'),options: null},"wiki" : {module: require('exts/yapi-plugin-wiki/client.js'),options: null},"swagger-auto-sync" : {module: require('exts/yapi-plugin-swagger-auto-sync/client.js'),options: null},"export-postman" : {module: require('exts/yapi-plugin-export-postman/client.js'),options: null},"export-markdown-template" : {module: require('exts/yapi-plugin-export-markdown-template/client.js'),options: null}} \ No newline at end of file +module.exports = {"import-postman" : {module: require('exts/yapi-plugin-import-postman/client.js'),options: null},"import-har" : {module: require('exts/yapi-plugin-import-har/client.js'),options: null},"advanced-mock" : {module: require('exts/yapi-plugin-advanced-mock/client.js'),options: null},"import-swagger" : {module: require('exts/yapi-plugin-import-swagger/client.js'),options: null},"statistics" : {module: require('exts/yapi-plugin-statistics/client.js'),options: null},"export-data" : {module: require('exts/yapi-plugin-export-data/client.js'),options: null},"gen-java-services" : {module: require('exts/yapi-plugin-gen-java-services/client.js'),options: null},"export-swagger2-data" : {module: require('exts/yapi-plugin-export-swagger2-data/client.js'),options: null},"import-yapi-json" : {module: require('exts/yapi-plugin-import-yapi-json/client.js'),options: null},"wiki" : {module: require('exts/yapi-plugin-wiki/client.js'),options: null},"swagger-auto-sync" : {module: require('exts/yapi-plugin-swagger-auto-sync/client.js'),options: null},"export-postman" : {module: require('exts/yapi-plugin-export-postman/client.js'),options: null},"export-markdown-template" : {module: require('exts/yapi-plugin-export-markdown-template/client.js'),options: null}} \ No newline at end of file diff --git a/common/config.js b/common/config.js index ad575d7..d253121 100644 --- a/common/config.js +++ b/common/config.js @@ -12,7 +12,7 @@ module.exports = { },{ name: 'export-data' },{ - name: 'gen-services' + name: 'gen-java-services' },{ name: 'export-swagger2-data' },{ diff --git a/exts/yapi-plugin-gen-java-services/.sass-cache/3f3d6afdb6793d0137c849fff0c1eee600369f02/defaultTheme.scssc b/exts/yapi-plugin-gen-java-services/.sass-cache/3f3d6afdb6793d0137c849fff0c1eee600369f02/defaultTheme.scssc new file mode 100644 index 0000000..f7fff3a Binary files /dev/null and b/exts/yapi-plugin-gen-java-services/.sass-cache/3f3d6afdb6793d0137c849fff0c1eee600369f02/defaultTheme.scssc differ diff --git a/exts/yapi-plugin-gen-java-services/.sass-cache/8d7dcd37f61732054a9966925c8cce5b23a209ac/defaultTheme.scssc b/exts/yapi-plugin-gen-java-services/.sass-cache/8d7dcd37f61732054a9966925c8cce5b23a209ac/defaultTheme.scssc new file mode 100644 index 0000000..86d3e56 Binary files /dev/null and b/exts/yapi-plugin-gen-java-services/.sass-cache/8d7dcd37f61732054a9966925c8cce5b23a209ac/defaultTheme.scssc differ diff --git a/exts/yapi-plugin-gen-java-services/Services/Services.js b/exts/yapi-plugin-gen-java-services/Services/Services.js new file mode 100644 index 0000000..8d6eec2 --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/Services/Services.js @@ -0,0 +1,76 @@ +import React, {PureComponent as Component} from 'react' +import PropTypes from 'prop-types' +import {connect} from 'react-redux'; +import {getToken} from '../../../client/reducer/modules/project.js' +import './Services.scss'; +import {withRouter} from "react-router-dom"; +import axios from "axios"; +import {message} from "antd"; + +@connect( + state => { + return { + token: state.project.token + } + }, + { + getToken + } +) +class Services extends Component { + static propTypes = { + projectId: PropTypes.number, + token: PropTypes.string, + getToken: PropTypes.func, + match: PropTypes.object + } + + constructor(props, context) { + super(props, context); + this.state = { + render_data: {} + } + } + + componentDidMount() { + this.getSyncData(); + } + + async getSyncData() { + let projectId = this.props.match.params.id; + let interfaceId = this.props.match.params.actionId; + let result = await axios.get(`/api/plugin/codeGen?projectId=${projectId}&interfaceId=${interfaceId}`); + if (result.data) { + this.setState({ + render_data: result.data + }); + } + } + async preCopy(code) { + await navigator.clipboard.writeText(code) + message.success("复制成功") + } + render() { + let render_vide = []; + if (this.state.render_data) { + Object.keys(this.state.render_data) + Object.keys(this.state.render_data).forEach((tag) => { + render_vide.push(
{tag}
) + render_vide.push(
this.preCopy(this.state.render_data[tag])}>复制代码{this.state.render_data[tag] + "\n"}
) + }); + } + console.log(render_vide) + return ( +
+
+
+ {render_vide} +
+
+
+ ); + } +} + + +module.exports = withRouter(Services); diff --git a/exts/yapi-plugin-gen-java-services/Services/Services.scss b/exts/yapi-plugin-gen-java-services/Services/Services.scss new file mode 100644 index 0000000..8aa3f5c --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/Services/Services.scss @@ -0,0 +1,30 @@ +.project-services { + margin: 0; + pre { + background: #efefef; + } +} + + +pre{ + position: relative; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; + padding: 10px; +} +pre .btn-pre-copy{ + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -khtml-user-select: none; + user-select: none; + position: absolute; + top: 10px; + right: 12px; + font-size: 12px; + line-height: 1; + cursor: pointer; + color: hsla(0,0%,54.9%,.8); + transition: color .1s; +} diff --git a/exts/yapi-plugin-gen-java-services/Services/codeTemplate.js b/exts/yapi-plugin-gen-java-services/Services/codeTemplate.js new file mode 100644 index 0000000..1d6cd56 --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/Services/codeTemplate.js @@ -0,0 +1,145 @@ +import React, {Component} from 'react'; +import {connect} from 'react-redux'; +import PropTypes from 'prop-types'; +import {Form, Button, message} from 'antd'; +import {handleSwaggerUrlData} from 'client/reducer/modules/project'; + +const FormItem = Form.Item; +import axios from 'axios'; +import AceEditor from "../../../client/components/AceEditor/AceEditor"; +// layout +const formItemLayout = { + labelCol: { + lg: {span: 5}, + xs: {span: 24}, + sm: {span: 10} + }, + wrapperCol: { + lg: {span: 16}, + xs: {span: 24}, + sm: {span: 12} + }, + className: 'form-item' +}; +const tailFormItemLayout = { + wrapperCol: { + sm: { + span: 16, + offset: 11 + } + } +}; + +@connect( + state => { + return { + projectMsg: state.project.currProject + }; + }, + { + handleSwaggerUrlData + } +) +@Form.create() +export default class CodeGenTemplate extends Component { + static propTypes = { + form: PropTypes.object, + match: PropTypes.object, + projectId: PropTypes.number, + projectMsg: PropTypes.object, + handleSwaggerUrlData: PropTypes.func + }; + + constructor(props) { + super(props); + this.state = { + config_data: {template_data: "", _id: null} + }; + } + + handleSubmit = async () => { + const {form, projectId} = this.props; + let params = { + project_id: projectId, + template_data: this.state.config_data.template_data, + uid: this.props.projectMsg.uid + }; + if (this.state.config_data._id) { + params.id = this.state.config_data._id; + } + form.validateFields(async (err, values) => { + if (!err) { + let assignValue = Object.assign(params, values); + await axios.post('/api/plugin/template/save', assignValue).then(res => { + if (res.data.errcode === 0) { + message.success('保存成功'); + } else { + message.error(res.data.errmsg); + } + }); + } + }); + + }; + + + UNSAFE_componentWillMount() { + //查询同步任务 + this.setState({ + config_data: {} + }); + this.getSyncData(); + } + + async getSyncData() { + let projectId = this.props.projectMsg._id; + let result = await axios.get('/api/plugin/template/get?projectId=' + projectId); + if (result.data.errcode === 0) { + if (result.data.data) { + let templateData = result.data.data.find(it => it.tag === "default") + if (templateData == null) { + templateData = result.data.data[0] + } + this.setState({ + config_data: templateData + }); + } + } + } + + handleTemplateInput = e => { + let config_data = this.state.config_data; + config_data.template_data = e.text; + this.setState({ + config_data: config_data + }); + }; + + + render() { + const templateEditor = ( + + + + + ) + return ( +
+
+
+ {templateEditor} +
+ + + +
+
+ ); + } +} diff --git a/exts/yapi-plugin-gen-java-services/client.js b/exts/yapi-plugin-gen-java-services/client.js new file mode 100644 index 0000000..78ed682 --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/client.js @@ -0,0 +1,21 @@ +import Services from './Services/Services.js'; +import CodeGenTemplate from "./Services/codeTemplate"; + +module.exports = function () { + this.bindHook('interface_tab', function (tabs) { + tabs.javaGen = { + name: '代码生成', + component: Services + } + }) + + + this.bindHook('sub_setting_nav', function (route) { + route.codeGen = { + name: '代码生成模板配置', + component: CodeGenTemplate + }; + }) +} + + diff --git a/exts/yapi-plugin-gen-java-services/controller.js b/exts/yapi-plugin-gen-java-services/controller.js new file mode 100644 index 0000000..1af3be9 --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/controller.js @@ -0,0 +1,140 @@ +const baseController = require('controllers/base.js'); +const interfaceModel = require('models/interface.js'); +const projectModel = require('models/project.js'); +// const wikiModel = require('../yapi-plugin-wiki/wikiModel.js'); +const interfaceCatModel = require('models/interfaceCat.js'); +const groupModel = require("models/group.js"); +const userModel = require("models/user.js"); +const genCodeModel = require("./genCodeModel"); +const yapi = require('yapi.js'); +const {default: Safeify} = require("safeify"); + + +// const htmlToPdf = require("html-pdf"); +class exportController extends baseController { + constructor(ctx) { + super(ctx); + // 分类 + this.catModel = yapi.getInst(interfaceCatModel); + this.interModel = yapi.getInst(interfaceModel); + this.projectModel = yapi.getInst(projectModel); + this.groupModel = yapi.getInst(groupModel); + this.userModel = yapi.getInst(userModel); + this.genCodeModel = yapi.getInst(genCodeModel); + + } + + + async genCode(ctx) { + let projectId = ctx.request.query.projectId; + let interfaceId = ctx.request.query.interfaceId; + try { + let curProject = await this.projectModel.get(projectId); + let interfaceData = await this.interModel.get(interfaceId); + let userData = await this.userModel.findById(this.getUid()); + let errMsg = []; + + let templateList = await this.genCodeModel.listByProjectId(projectId); + let retData = {}; + console.log(templateList) + if (templateList == null || templateList.length === 0) { + ctx.body = yapi.commons.resReturn(errMsg, 502, '请先设置生成模板'); + return; + } + for (const template of templateList) { + const safeVm = new Safeify({ + timeout: 3000, //超时时间 + asyncTimeout: 10000, //包含异步操作的超时时间 + unrestricted: true, + quantity: 4, //沙箱进程数量,默认同 CPU 核数 + memoryQuota: 500, //沙箱最大能使用的内存(单位 m),默认 500m + cpuQuota: 0.5 //沙箱的 cpu 资源配额(百分比),默认 50% + }); + // console.log("curProject", curProject) + const vmContext = { + projectTmp: JSON.stringify(curProject), + interfaceTmp: JSON.stringify(interfaceData), + userTemp: JSON.stringify(userData) + }; + + try { + safeVm.preset("const project = JSON.parse(projectTmp);const interface = JSON.parse(interfaceTmp);const user=JSON.parse(userTemp)") + let model = await safeVm.run(template.template_data, vmContext); + safeVm.destroy(); + retData[template.tag] = model + } catch (e) { + errMsg.push({ + error: e.toString(), + context: vmContext + }); + } + } + ctx.body = retData; + if (errMsg.length) { + ctx.body = yapi.commons.resReturn(errMsg, 502, '渲染出错'); + } + } catch (error) { + yapi.commons.log(error, 'error'); + ctx.body = yapi.commons.resReturn(null, 502, '渲染出错'); + } + } + + + async saveTemplate(ctx) { + let requestBody = ctx.request.body; + let projectId = requestBody.project_id; + if (!projectId) { + return (ctx.body = yapi.commons.resReturn(null, 408, '缺少项目Id')); + } + + if ((await this.checkAuth(projectId, 'project', 'edit')) !== true) { + return (ctx.body = yapi.commons.resReturn(null, 405, '没有权限')); + } + let existData = await this.genCodeModel.listByProjectId(projectId); + + if (existData.find(templ => templ.tag === requestBody.tag)){ + return (ctx.body = yapi.commons.resReturn(null, 502, 'tag已存在')); + } + + let result; + if (requestBody.id) { + result = await this.genCodeModel.up(requestBody); + } else { + result = await this.genCodeModel.save(requestBody); + } + + return (ctx.body = yapi.commons.resReturn(result)); + } + + /** + * 查询配置信息 + * @param {*} ctx + */ + async getTemplate(ctx) { + let projectId = ctx.params.projectId; + if (!projectId) { + return (ctx.body = yapi.commons.resReturn(null, 408, '缺少项目Id')); + } + console.log(this.genCodeModel) + let result = await this.genCodeModel.listByProjectId(projectId); + return (ctx.body = yapi.commons.resReturn(result)); + } + + + /** + * 删除模板 + * @param {*} ctx + */ + async deleteTemplate(ctx) { + let templateId = ctx.params.templateId; + if (!templateId) { + return (ctx.body = yapi.commons.resReturn(null, 408, '缺少模板Id')); + } + let result = await this.genCodeModel.del(templateId); + return (ctx.body = yapi.commons.resReturn(result)); + } + + +} + +module.exports = exportController; diff --git a/exts/yapi-plugin-gen-java-services/defaultTheme.css b/exts/yapi-plugin-gen-java-services/defaultTheme.css new file mode 100644 index 0000000..648c3ba --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/defaultTheme.css @@ -0,0 +1,351 @@ +@charset "UTF-8"; +html, +body, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote { + margin: 0; + padding: 0; + font-weight: normal; + -webkit-font-smoothing: antialiased; +} + +/* 设置滚动条的样式 */ +::-webkit-scrollbar { + width: 6px; +} + +/* 外层轨道 */ +::-webkit-scrollbar-track { + -webkit-box-shadow: inset006pxrgba(255, 0, 0, 0.3); + background: rgba(0, 0, 0, 0.1); +} + +/* 滚动条滑块 */ +::-webkit-scrollbar-thumb { + border-radius: 4px; + background: rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset006pxrgba(0, 0, 0, 0.5); +} + +::-webkit-scrollbar-thumb:window-inactive { + background: rgba(0, 0, 0, 0.2); +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", SimSun, sans-serif; + font-size: 13px; + line-height: 25px; + color: #393838; + position: relative; +} + +table { + margin: 10px 0 15px 0; + border-collapse: collapse; +} + +td, +th { + border: 1px solid #ddd; + padding: 3px 10px; +} + +th { + padding: 5px 10px; +} + +a, a:link, a:visited { + color: #34495e; + text-decoration: none; +} + +a:hover, a:focus { + color: #59d69d; + text-decoration: none; +} + +a img { + border: none; +} + +p { + padding-left: 10px; + margin-bottom: 9px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: #404040; + line-height: 36px; +} + +h1 { + color: #2c3e50; + font-weight: 600; + margin-bottom: 16px; + font-size: 32px; + padding-bottom: 16px; + border-bottom: 1px solid #ddd; + line-height: 50px; +} + +h2 { + font-size: 28px; + padding-top: 10px; + padding-bottom: 10px; +} + +h3 { + clear: both; + font-weight: 400; + margin-top: 20px; + margin-bottom: 20px; + border-left: 3px solid #59d69d; + padding-left: 8px; + font-size: 18px; +} + +h4 { + font-size: 16px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 13px; +} + +hr { + margin: 0 0 19px; + border: 0; + border-bottom: 1px solid #ccc; +} + +blockquote { + padding: 13px 13px 21px 15px; + margin-bottom: 18px; + font-family: georgia, serif; + font-style: italic; +} + +blockquote:before { + font-size: 40px; + margin-left: -10px; + font-family: georgia, serif; + color: #eee; +} + +blockquote p { + font-size: 14px; + font-weight: 300; + line-height: 18px; + margin-bottom: 0; + font-style: italic; +} + +code, +pre { + font-family: Monaco, Andale Mono, Courier New, monospace; +} + +code { + background-color: #fee9cc; + color: rgba(0, 0, 0, 0.75); + padding: 1px 3px; + font-size: 12px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +pre { + display: block; + padding: 14px; + margin: 0 0 18px; + line-height: 16px; + font-size: 11px; + border: 1px solid #d9d9d9; + white-space: pre-wrap; + word-wrap: break-word; + background: #f6f6f6; +} + +pre code { + background-color: #f6f6f6; + color: #737373; + font-size: 11px; + padding: 0; +} + +sup { + font-size: 0.83em; + vertical-align: super; + line-height: 0; +} + +* { + -webkit-print-color-adjust: exact; +} + +@media print { + body, + code, + pre code, + h1, + h2, + h3, + h4, + h5, + h6 { + color: black; + } + + table, + pre { + page-break-inside: avoid; + } +} +html, +body { + height: 100%; +} + +.table-of-contents { + position: fixed; + top: 61px; + left: 0; + bottom: 0; + overflow-x: hidden; + overflow-y: auto; + width: 260px; +} + +.table-of-contents > ul > li > a { + font-size: 20px; + margin-bottom: 16px; + margin-top: 16px; +} + +.table-of-contents ul { + overflow: auto; + margin: 0px; + height: 100%; + padding: 0px 0px; + box-sizing: border-box; + list-style-type: none; +} + +.table-of-contents ul li { + padding-left: 20px; +} + +.table-of-contents a { + padding: 2px 0px; + display: block; + text-decoration: none; +} + +.content-right { + max-width: 700px; + margin-left: 290px; + padding-left: 70px; + flex-grow: 1; +} +.content-right h2:target { + padding-top: 80px; +} + +body > p { + margin-left: 30px; +} + +body > table { + margin-left: 30px; +} + +body > pre { + margin-left: 30px; +} + +.curProject { + position: fixed; + top: 20px; + font-size: 25px; + color: black; + margin-left: -240px; + width: 240px; + padding: 5px; + line-height: 25px; + box-sizing: border-box; +} + +.g-doc { + margin-top: 56px; + padding-top: 24px; + display: flex; +} + +.curproject-name { + font-size: 42px; +} + +.m-header { + background: #32363a; + height: 56px; + line-height: 56px; + padding-left: 60px; + display: flex; + align-items: center; + position: fixed; + z-index: 9; + top: 0; + left: 0; + right: 0; +} +.m-header .title { + font-size: 22px; + color: #fff; + font-weight: normal; + -webkit-font-smoothing: antialiased; + margin: 0; + margin-left: 16px; + padding: 0; + line-height: 56px; + border: none; +} +.m-header .nav { + color: #fff; + font-size: 16px; + position: absolute; + right: 32px; + top: 0; +} +.m-header .nav a { + color: #fff; + margin-left: 16px; + padding: 8px; + transition: color .2s; +} +.m-header .nav a:hover { + color: #59d69d; +} + +.m-footer { + border-top: 1px solid #ddd; + padding-top: 16px; + padding-bottom: 16px; +} + +/*# sourceMappingURL=defaultTheme.css.map */ diff --git a/exts/yapi-plugin-gen-java-services/defaultTheme.css.map b/exts/yapi-plugin-gen-java-services/defaultTheme.css.map new file mode 100644 index 0000000..635776a --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/defaultTheme.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["defaultTheme.scss"], +"names": [], +"file": "defaultTheme.css" +} \ No newline at end of file diff --git a/exts/yapi-plugin-gen-java-services/defaultTheme.js b/exts/yapi-plugin-gen-java-services/defaultTheme.js new file mode 100644 index 0000000..612b787 --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/defaultTheme.js @@ -0,0 +1,4 @@ +const fs = require('fs'); +const sysPath = require('path'); +const css = fs.readFileSync(sysPath.join(__dirname, './defaultTheme.css')); +module.exports = ''; \ No newline at end of file diff --git a/exts/yapi-plugin-gen-java-services/defaultTheme.scss b/exts/yapi-plugin-gen-java-services/defaultTheme.scss new file mode 100644 index 0000000..1c95a67 --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/defaultTheme.scss @@ -0,0 +1,355 @@ +html, +body, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote { + margin: 0; + padding: 0; + font-weight: normal; + -webkit-font-smoothing: antialiased; +} +/* 设置滚动条的样式 */ +::-webkit-scrollbar { + width: 6px; +} +/* 外层轨道 */ +::-webkit-scrollbar-track { + -webkit-box-shadow: inset006pxrgba(255, 0, 0, 0.3); + background: rgba(0, 0, 0, 0.1); +} +/* 滚动条滑块 */ +::-webkit-scrollbar-thumb { + border-radius: 4px; + background: rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset006pxrgba(0, 0, 0, 0.5); +} +::-webkit-scrollbar-thumb:window-inactive { + background: rgba(0, 0, 0, 0.2); +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", SimSun, sans-serif; + font-size: 13px; + line-height: 25px; + color: #393838; + position: relative; + // overflow-x: hidden; +} + +table { + margin: 10px 0 15px 0; + border-collapse: collapse; +} + +td, +th { + border: 1px solid #ddd; + padding: 3px 10px; +} + +th { + padding: 5px 10px; +} + +a, a:link, a:visited { + color: #34495e; + text-decoration: none; +} + +a:hover, a:focus { + color: #59d69d; + text-decoration: none; +} + +a img { + border: none; +} + +p { + padding-left: 10px; + margin-bottom: 9px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: #404040; + line-height: 36px; +} + +h1 { + color: #2c3e50; + font-weight: 600; + // margin-top: 35px; + margin-bottom: 16px; + font-size: 32px; + padding-bottom: 16px; + border-bottom: 1px solid #ddd; + line-height: 50px; +} + +h2 { + font-size: 28px; + padding-top: 10px; + padding-bottom: 10px; +} + +h3 { + clear: both; + font-weight: 400; + margin-top: 20px; + margin-bottom: 20px; + border-left: 3px solid #59d69d; + padding-left: 8px; + font-size: 18px; +} + +h4 { + font-size: 16px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 13px; +} + +hr { + margin: 0 0 19px; + border: 0; + border-bottom: 1px solid #ccc; +} + +blockquote { + padding: 13px 13px 21px 15px; + margin-bottom: 18px; + font-family: georgia, serif; + font-style: italic; +} + +blockquote:before { + font-size: 40px; + margin-left: -10px; + font-family: georgia, serif; + color: #eee; +} + +blockquote p { + font-size: 14px; + font-weight: 300; + line-height: 18px; + margin-bottom: 0; + font-style: italic; +} + +code, +pre { + font-family: Monaco, Andale Mono, Courier New, monospace; +} + +code { + background-color: #fee9cc; + color: rgba(0, 0, 0, 0.75); + padding: 1px 3px; + font-size: 12px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +pre { + display: block; + padding: 14px; + margin: 0 0 18px; + line-height: 16px; + font-size: 11px; + border: 1px solid #d9d9d9; + white-space: pre-wrap; + word-wrap: break-word; + background: #f6f6f6; +} + +pre code { + background-color: #f6f6f6; + color: #737373; + font-size: 11px; + padding: 0; +} + +sup { + font-size: 0.83em; + vertical-align: super; + line-height: 0; +} + +* { + -webkit-print-color-adjust: exact; +} + +@media print { + body, + code, + pre code, + h1, + h2, + h3, + h4, + h5, + h6 { + color: black; + } + table, + pre { + page-break-inside: avoid; + } +} + +html, +body { + height: 100%; +} + +.table-of-contents { + position: fixed; + top: 61px; + left: 0; + bottom: 0; + overflow-x: hidden; + overflow-y: auto; + width: 260px; +} + +.table-of-contents>ul>li>a { + font-size: 20px; + margin-bottom: 16px; + margin-top: 16px; +} + +.table-of-contents ul { + // position: fixed; + // top: 80px; + // left: 40px; + overflow: auto; + margin: 0px; + height: 100%; + padding: 0px 0px; + box-sizing: border-box; + list-style-type: none; +} + +.table-of-contents ul li { + padding-left: 20px; +} + +.table-of-contents a { + padding: 2px 0px; + display: block; + text-decoration: none; +} + + + +.content-right { + // position: relative; + // top: -20px; + max-width: 700px; + margin-left: 290px; + padding-left: 70px; + flex-grow: 1; + h2:target{ + padding-top: 80px; + } +} + + + +body>p { + margin-left: 30px; +} + +body>table { + margin-left: 30px; +} + +body>pre { + margin-left: 30px; +} + +.curProject { + position: fixed; + top: 20px; + font-size: 25px; + color: black; + margin-left: -240px; + width: 240px; + padding: 5px; + line-height: 25px; + box-sizing: border-box; +} + +.g-doc { + margin-top: 56px; + padding-top: 24px; + display: flex; +} + +.curproject-name{ + font-size: 42px; +} + +.m-header { + background: #32363a; + height: 56px; + line-height: 56px; + padding-left: 60px; + display: flex; + align-items: center; + position: fixed; + z-index: 9; + top: 0; + left: 0; + right: 0; + .title { + font-size: 22px; + color: #fff; + font-weight: normal; + -webkit-font-smoothing: antialiased; + margin: 0; + margin-left: 16px; + padding: 0; + line-height: 56px; + border: none; + } + .nav { + color: #fff; + font-size: 16px; + position: absolute; + right: 32px; + top: 0; + a { + color: #fff; + margin-left: 16px; + padding: 8px; + transition: color .2s; + } + a:hover { + color: #59d69d; + } + } +} + +.m-footer { + border-top: 1px solid #ddd; + padding-top: 16px; + padding-bottom: 16px; +} \ No newline at end of file diff --git a/exts/yapi-plugin-gen-java-services/genCodeModel.js b/exts/yapi-plugin-gen-java-services/genCodeModel.js new file mode 100644 index 0000000..9d0447d --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/genCodeModel.js @@ -0,0 +1,83 @@ +const yapi = require('yapi.js'); +const baseModel = require('models/base.js'); + +class genCodeModel extends baseModel { + getName() { + return 'gencode_template_config'; + } + + getSchema() { + return { + uid: { type: Number}, + project_id: { type: Number, required: true }, + //是否开启自动同步 + tag: { type: String, default: "default" }, + tag_desc: { type: String, default: "默认" }, + // 模板 + template_data: String, + add_time: Number, + up_time: Number + }; + } + + getByProjectId(id) { + return this.model.findOne({ + project_id: id, + tag: 'default' + }) + } + + listByProjectId(id) { + return this.model.find({ + project_id: id + }) + } + + delByProjectId(project_id){ + return this.model.remove({ + project_id: project_id + }) + } + + save(data) { + data.up_time = yapi.commons.time(); + let m = new this.model(data); + return m.save(); + } + + listAll() { + return this.model + .find({}) + .select( + '_id uid project_id add_time up_time is_sync_open sync_cron sync_json_url sync_mode old_swagger_content last_sync_time' + ) + .sort({ _id: -1 }) + .exec(); + } + + up(data) { + console.log(data) + let id = data.id; + delete data.id; + data.up_time = yapi.commons.time(); + return this.model.update({ + _id: id + }, data) + } + + upById(id, data) { + delete data.id; + data.up_time = yapi.commons.time(); + return this.model.update({ + _id: id + }, data) + } + + del(id){ + return this.model.remove({ + _id: id + }) + } +} + +module.exports = genCodeModel; diff --git a/exts/yapi-plugin-gen-java-services/index.js b/exts/yapi-plugin-gen-java-services/index.js new file mode 100644 index 0000000..080b4b6 --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/index.js @@ -0,0 +1,4 @@ +module.exports = { + server: true, + client: true + } \ No newline at end of file diff --git a/exts/yapi-plugin-gen-java-services/server.js b/exts/yapi-plugin-gen-java-services/server.js new file mode 100644 index 0000000..7855141 --- /dev/null +++ b/exts/yapi-plugin-gen-java-services/server.js @@ -0,0 +1,32 @@ +const controller = require('./controller'); + + +module.exports = function(){ + this.bindHook('add_router', function(addRouter){ + addRouter({ + controller: controller, + method: 'get', + path: 'codeGen', + action: "genCode" + }); + addRouter({ + controller: controller, + method: 'get', + path: 'template/get', + action: "getTemplate" + }); + addRouter({ + controller: controller, + method: 'post', + path: 'template/save', + action: "saveTemplate" + }); + addRouter({ + controller: controller, + method: 'delete', + path: 'template/:templateId', + action: "deleteTemplate" + }); + }) + +}