Merge branch 'dev-rewrite' of gitlab.corp.qunar.com:mfe/yapi into dev-rewrite

This commit is contained in:
suxiaoxin 2018-02-08 10:52:16 +08:00
commit 4008501d51
8 changed files with 101 additions and 37 deletions

View File

@ -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>

View File

@ -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>
是否开启邮件通知&nbsp;
邮件通知&nbsp;
<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>
开放接口&nbsp;
<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>

View File

@ -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>

View File

@ -20,6 +20,12 @@
}
}
.dataExport{
padding-bottom: 16px;
font-weight: 500;
width: 100%;
}
.dataSync{
padding-top: 16px;
font-weight: 500;

View File

@ -3,6 +3,8 @@
function exportData(exportDataModule,pid){
exportDataModule.html = {
name: 'html',
route: `/api/plugin/export?type=html&pid=${pid}`,

View File

@ -19,11 +19,14 @@ class exportController extends baseController {
this.projectModel = yapi.getInst(projectModel);
}
async handleListClass(pid) {
async handleListClass(pid, 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')
list = await this.interModel.listByInterStatus(item._id, status)
for (let j = 0; j < list.length; j++) {
list[j] = list[j].toObject()
}
@ -36,8 +39,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 +55,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 +65,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 +100,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 +224,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>');

View File

@ -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 = {

View File

@ -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 }
};
}
@ -163,6 +164,23 @@ class interfaceModel extends baseModel {
.exec();
}
listByInterStatus(catid, status){
let option ={}
if(status === 'open') {
option = {
catid: catid,
api_opened: true
}
} else {
option = {
catid: catid
}
}
return this.model.find(option)
.sort({ title: 1 })
.exec();
}
del(id) {
return this.model.remove({
_id: id