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 (
+
+ );
+ }
+}
+
+
+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 (
+
+ );
+ }
+}
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"
+ });
+ })
+
+}