mirror of
https://github.com/YMFE/yapi.git
synced 2025-02-23 13:59:28 +08:00
feat: 添加公开接口功能
This commit is contained in:
parent
54d337a73f
commit
a8f998ab43
@ -88,7 +88,7 @@ class Login extends Component {
|
||||
return (
|
||||
<Form onSubmit={this.handleSubmit}>
|
||||
{/* 登录类型 (普通登录/LDAP登录) */}
|
||||
{isLDAP && <FormItem>
|
||||
{isLDAP && <FormItem>
|
||||
<RadioGroup defaultValue="ldap" onChange={this.handleFormLayoutChange}>
|
||||
<Radio value="ldap">LDAP</Radio>
|
||||
<Radio value="normal">普通登录</Radio>
|
||||
|
@ -135,7 +135,8 @@ class InterfaceEditForm extends Component {
|
||||
jsonType: 'tpl',
|
||||
mockUrl: this.props.mockUrl,
|
||||
req_radio_type: 'req-query',
|
||||
custom_field_value: ''
|
||||
custom_field_value: '',
|
||||
api_opened: false
|
||||
}, curdata)
|
||||
}
|
||||
|
||||
@ -229,7 +230,7 @@ class InterfaceEditForm extends Component {
|
||||
if (HTTP_METHOD[values.method].request_body !== true) {
|
||||
values.req_body_form = []
|
||||
}
|
||||
// console.log('values', values);
|
||||
console.log('values', values);
|
||||
|
||||
this.props.onSubmit(values)
|
||||
EditFormContext.props.changeEditStatus(false);
|
||||
@ -922,35 +923,17 @@ class InterfaceEditForm extends Component {
|
||||
<div id="desc" className="remark-editor"></div>
|
||||
</div>
|
||||
</FormItem>
|
||||
{/* <FormItem
|
||||
className={'interface-edit-item ' + this.state.hideTabs.other.mail}
|
||||
{...formItemLayout}
|
||||
label="是否开启邮件通知"
|
||||
>
|
||||
{getFieldDecorator('switch_notice', { valuePropName: 'checked', initialValue: false })(
|
||||
<Switch checkedChildren="开" unCheckedChildren="关" />
|
||||
)}
|
||||
</FormItem>
|
||||
<FormItem
|
||||
className={'interface-edit-item ' + (this.state.hideTabs.other.mail)}
|
||||
{...formItemLayout}
|
||||
label="改动日志"
|
||||
>
|
||||
{getFieldDecorator('message', { initialValue: "" })(
|
||||
<TextArea style={{ minHeight: "300px" }} placeholder="改动日志会通过邮件发送给关注此项目的用户" />
|
||||
)}
|
||||
</FormItem> */}
|
||||
</div>
|
||||
|
||||
{/* ----------- email ------------- */}
|
||||
<h2 className="interface-title">通 知</h2>
|
||||
<h2 className="interface-title">其 他</h2>
|
||||
<div className="panel-sub">
|
||||
<FormItem
|
||||
className={'interface-edit-item'}
|
||||
{...formItemLayout}
|
||||
label={(
|
||||
<span>
|
||||
是否开启邮件通知
|
||||
邮件通知
|
||||
<Tooltip title={'开启邮件通知,可在 项目设置 里修改'}>
|
||||
<Icon type="question-circle-o" style={{ width: "10px" }} />
|
||||
</Tooltip>
|
||||
@ -962,6 +945,23 @@ class InterfaceEditForm extends Component {
|
||||
<Switch checkedChildren="开" unCheckedChildren="关" />
|
||||
)}
|
||||
</FormItem>
|
||||
<FormItem
|
||||
className={'interface-edit-item'}
|
||||
{...formItemLayout}
|
||||
label={(
|
||||
<span>
|
||||
开放接口
|
||||
<Tooltip title={'用户可以在数据导出时选择导出全部接口或者只导出公开接口'}>
|
||||
<Icon type="question-circle-o" style={{ width: "10px" }} />
|
||||
</Tooltip>
|
||||
|
||||
</span>
|
||||
)}
|
||||
>
|
||||
{getFieldDecorator('api_opened', { valuePropName: 'checked', initialValue: this.state.api_opened })(
|
||||
<Switch checkedChildren="开" unCheckedChildren="关" />
|
||||
)}
|
||||
</FormItem>
|
||||
</div>
|
||||
|
||||
|
||||
|
@ -1,19 +1,34 @@
|
||||
import React, { PureComponent as Component } from 'react'
|
||||
import { Upload, Icon, message, Select, Tooltip, Button, Spin, Switch, Modal } from 'antd';
|
||||
import { Upload, Icon, message, Select, Tooltip, Button, Spin, Switch, Modal,Radio } from 'antd';
|
||||
import PropTypes from 'prop-types';
|
||||
import { connect } from 'react-redux';
|
||||
import './ProjectData.scss';
|
||||
import axios from 'axios';
|
||||
import _ from 'underscore';
|
||||
import URL from 'url'
|
||||
|
||||
const Dragger = Upload.Dragger;
|
||||
import { saveImportData } from '../../../../reducer/modules/interface';
|
||||
import { fetchUpdateLogData } from '../../../../reducer/modules/news.js'
|
||||
const Option = Select.Option;
|
||||
const confirm = Modal.confirm;
|
||||
const plugin = require('client/plugin.js');
|
||||
|
||||
const RadioGroup = Radio.Group;
|
||||
const importDataModule = {};
|
||||
const exportDataModule = {};
|
||||
|
||||
function handleExportRouteParams (url, value) {
|
||||
if(!url) {
|
||||
return
|
||||
}
|
||||
let urlObj = URL.parse(url, true), query = {};
|
||||
query = Object.assign(query, urlObj.query, {status: value});
|
||||
return URL.format({
|
||||
pathname: urlObj.pathname,
|
||||
query
|
||||
});
|
||||
}
|
||||
|
||||
// exportDataModule.pdf = {
|
||||
// name: 'Pdf',
|
||||
// route: '/api/interface/download_crx',
|
||||
@ -42,7 +57,9 @@ class ProjectData extends Component {
|
||||
curImportType: null,
|
||||
curExportType: null,
|
||||
showLoading: false,
|
||||
dataSync: false
|
||||
dataSync: false,
|
||||
exportContent: 'all'
|
||||
|
||||
}
|
||||
}
|
||||
static propTypes = {
|
||||
@ -274,6 +291,10 @@ class ProjectData extends Component {
|
||||
})
|
||||
}
|
||||
|
||||
handleChange = (e) => {
|
||||
this.setState({ exportContent: e.target.value });
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@ -292,6 +313,11 @@ class ProjectData extends Component {
|
||||
customRequest: this.handleFile,
|
||||
onChange: this.uploadChange
|
||||
}
|
||||
|
||||
let exportUrl = this.state.curExportType && exportDataModule[this.state.curExportType] && exportDataModule[this.state.curExportType].route;
|
||||
let exportHref = handleExportRouteParams(exportUrl, this.state.exportContent);
|
||||
|
||||
console.log('inter', this.state.exportContent);
|
||||
return (
|
||||
<div className="g-row">
|
||||
|
||||
@ -350,11 +376,17 @@ class ProjectData extends Component {
|
||||
})}
|
||||
</Select>
|
||||
</div>
|
||||
<div className="dataExport">
|
||||
<RadioGroup defaultValue="all" onChange={this.handleChange}>
|
||||
<Radio value="all">全部接口</Radio>
|
||||
<Radio value="open">公开接口</Radio>
|
||||
</RadioGroup>
|
||||
</div>
|
||||
<div className="export-content">
|
||||
{this.state.curExportType ?
|
||||
<div>
|
||||
<p className="export-desc">{exportDataModule[this.state.curExportType].desc}</p>
|
||||
<a target="_blank" href={this.state.curExportType && exportDataModule[this.state.curExportType] && exportDataModule[this.state.curExportType].route} >
|
||||
<a target="_blank" href={exportHref} >
|
||||
<Button className="export-button" type="primary" size="large"> 导出 </Button>
|
||||
|
||||
</a>
|
||||
|
@ -20,6 +20,12 @@
|
||||
}
|
||||
}
|
||||
|
||||
.dataExport{
|
||||
padding-bottom: 16px;
|
||||
font-weight: 500;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.dataSync{
|
||||
padding-top: 16px;
|
||||
font-weight: 500;
|
||||
|
@ -3,6 +3,8 @@
|
||||
|
||||
|
||||
function exportData(exportDataModule,pid){
|
||||
|
||||
|
||||
exportDataModule.html = {
|
||||
name: 'html',
|
||||
route: `/api/plugin/export?type=html&pid=${pid}`,
|
||||
|
@ -19,8 +19,10 @@ class exportController extends baseController {
|
||||
this.projectModel = yapi.getInst(projectModel);
|
||||
}
|
||||
|
||||
async handleListClass(pid) {
|
||||
async handleListClass(pid, status) {
|
||||
console.log('status', status);
|
||||
let result = await this.catModel.list(pid), newResult = [];
|
||||
|
||||
for (let i = 0, item, list; i < result.length; i++) {
|
||||
item = result[i].toObject()
|
||||
list = await this.interModel.listByCatid(item._id, '_id title method path desc query_path req_headers req_params req_query req_body_type req_body_other req_body_form res_body')
|
||||
@ -36,8 +38,10 @@ class exportController extends baseController {
|
||||
}
|
||||
|
||||
async exportData(ctx) {
|
||||
|
||||
let pid = ctx.request.query.pid;
|
||||
let type = ctx.request.query.type;
|
||||
let status = ctx.request.query.status;
|
||||
if (!pid) {
|
||||
ctx.body = yapi.commons.resReturn(null, 200, "pid 不为空");
|
||||
}
|
||||
@ -50,7 +54,7 @@ class exportController extends baseController {
|
||||
switch (type) {
|
||||
case "markdown": {
|
||||
isMarkdown = true;
|
||||
tp = await createMarkdown.bind(this)(pid, false);
|
||||
tp = await createMarkdown.bind(this)(pid, status, false);
|
||||
ctx.set("Content-Disposition", `attachment; filename=api.md`);
|
||||
return ctx.body = tp;
|
||||
}
|
||||
@ -60,7 +64,7 @@ class exportController extends baseController {
|
||||
// return ctx.body = tp;
|
||||
// }
|
||||
default: {//默认为html
|
||||
tp = await createHtml.bind(this)(pid);
|
||||
tp = await createHtml.bind(this)(pid, status);
|
||||
ctx.set("Content-Disposition", `attachment; filename=api.html`);
|
||||
return ctx.body = tp;
|
||||
}
|
||||
@ -95,8 +99,8 @@ class exportController extends baseController {
|
||||
// return result;
|
||||
// }
|
||||
|
||||
async function createHtml(pid) {
|
||||
let md = await createMarkdown.bind(this)(pid, true);
|
||||
async function createHtml(pid, status) {
|
||||
let md = await createMarkdown.bind(this)(pid, status, true);
|
||||
let markdown = new markdownIt();
|
||||
markdown.use(markdownItAnchor); // Optional, but makes sense as you really want to link to something
|
||||
markdown.use(markdownItTableOfContents, {
|
||||
@ -219,13 +223,13 @@ class exportController extends baseController {
|
||||
return "";
|
||||
}
|
||||
|
||||
async function createMarkdown(pid, isToc) {//拼接markdown
|
||||
async function createMarkdown(pid, status, isToc) {//拼接markdown
|
||||
//模板
|
||||
let mdTemplate = ``;
|
||||
const toc = `[TOC]\n\n`;
|
||||
try {
|
||||
// const interList = await this.interModel.listByPid(pid);
|
||||
const list = await this.handleListClass(pid);
|
||||
const list = await this.handleListClass(pid, status);
|
||||
|
||||
// 项目名、项目描述
|
||||
let title = escapeStr('<h1 class="curproject-name">' + curProject.name + '</h1>');
|
||||
|
@ -69,7 +69,8 @@ class interfaceController extends baseController {
|
||||
'req_body_other': 'string',
|
||||
res_body_type: 'string',
|
||||
res_body: 'string',
|
||||
custom_field_value: 'string'
|
||||
custom_field_value: 'string',
|
||||
'api_opened': 'boolean'
|
||||
}
|
||||
|
||||
this.schemaMap = {
|
||||
|
@ -65,7 +65,8 @@ class interfaceModel extends baseModel {
|
||||
res_body: String,
|
||||
custom_field_value: String,
|
||||
field2: String,
|
||||
field3: String
|
||||
field3: String,
|
||||
api_opened: { type: Boolean, default: false }
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user