From 966e307d95b02c4218a96c104cef86a1f6999fc2 Mon Sep 17 00:00:00 2001 From: suxiaoxin Date: Fri, 15 Sep 2017 12:01:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 9 +- .../Setting/ProjectData/ProjectData.js | 234 ++++-------------- .../Setting/ProjectData/ProjectData.scss | 4 + client/plugin.js | 66 ++++- exts/yapi-plugin-postman/client.js | 185 ++++++++++++++ server/controllers/interface.js | 16 +- ykit.js | 2 + 7 files changed, 304 insertions(+), 212 deletions(-) create mode 100644 exts/yapi-plugin-postman/client.js diff --git a/.eslintrc.js b/.eslintrc.js index ca5f1d1e..6ebe7542 100755 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -29,14 +29,7 @@ module.exports = { "error", "unix" ], - "quotes": [ - "error", - "single" - ], - "semi": [ - "error", - "always" - ], + "strict": 0, "comma-dangle": ["error", "never"], "no-console": ["off"] diff --git a/client/containers/Project/Setting/ProjectData/ProjectData.js b/client/containers/Project/Setting/ProjectData/ProjectData.js index 5f07be6b..cc062e44 100755 --- a/client/containers/Project/Setting/ProjectData/ProjectData.js +++ b/client/containers/Project/Setting/ProjectData/ProjectData.js @@ -7,6 +7,10 @@ import axios from 'axios'; const Dragger = Upload.Dragger; const Option = Select.Option; +const plugin = require('client/plugin.js'); + +let importDataModule = {}; + @connect( state=>{ // console.log(state); @@ -24,23 +28,24 @@ class ProjectData extends Component { super(props); this.state = { selectCatid:"", - menuList:[] + menuList:[], + curImportType: null } } static propTypes = { match: PropTypes.object, - projectId: PropTypes.number, curCatid: PropTypes.number, basePath: PropTypes.string } - componentWillMount(){ + componentWillMount(){ axios.get(`/api/interface/getCatMenu?project_id=${this.props.match.params.id}`).then((data)=>{ let menuList = data.data.data; this.setState({ menuList: menuList }) }); + plugin.emitHook('import_data', importDataModule, this.props); } selectChange(value){ this.setState({ @@ -48,149 +53,7 @@ class ProjectData extends Component { }) } - parseUrl(url){ - let parser = document.createElement('a'); - parser.href = url; - return { - protocol: parser.protocol, - hostname: parser.hostname, - port: parser.port, - pathname: parser.pathname, - search: parser.search, - host: parser.host - } - } - - checkInterRepeat(interData){ - let obj = {}; - let arr = []; - for(let item in interData){ - // console.log(interData[item].url + "-" + interData[item].method); - if(!obj[interData[item].url + "-" + interData[item].method+ "-"+interData[item].method]){ - arr.push(interData[item]); - obj[interData[item].url + "-" + interData[item].method+ "-"+interData[item].method] = true; - } - } - return arr; - } - - handleReq_query(query){ - let res = []; - if(query&&query.length){ - for(let item in query){ - res.push({ - name: query[item].key, - desc: query[item].description, - required: query[item].enable - }); - } - } - return res; - } - handleReq_headers(headers){ - let res = []; - if(headers&&headers.length){ - for(let item in headers){ - res.push({ - name: headers[item].key, - desc: headers[item].description, - value: headers[item].value, - required: headers[item].enable - }); - } - } - return res; - } - - handleReq_body_form(body_form){ - let res = []; - if(body_form&&body_form.length){ - for(let item in body_form){ - res.push({ - name: body_form[item].key, - value: body_form[item].value, - type: body_form[item].type - }); - } - } - return res; - } - - handlePath(path){ - path = path.replace(/{{(\w*)}}/,""); - path = this.parseUrl(path).pathname; - if(path.indexOf(this.props.basePath)>-1){ - path = path.substr(this.props.basePath.length); - } - if(path.charAt(0) != "/"){ - path = "/" + path; - } - if(path.charAt(path.length-1) === "/"){ - path = path.substr(0,path.length-1); - } - return path; - } - - importPostman(data,key){ - let reflect = {//数据字段映射关系 - title: "name", - path: "url", - method: "method", - desc: "description", - req_query: "queryParams", - req_headers: "headerData", - req_params: "", - req_body_type: "dataMode", - req_body_form: "data", - req_body_other: "rawModeData" - }; - let allKey = ["title","path","method","desc","req_query","req_headers","req_body_type","req_body_form","req_body_other"]; - key = key || allKey; - let res = {}; - for(let item in key){ - item = key[item]; - if(item === "req_query"){ - res[item] = this.handleReq_query.bind(this)(data[reflect[item]]); - }else if(item === "req_headers"){ - res[item] = this.handleReq_headers.bind(this)(data[reflect[item]]); - }else if(item === "req_body_form"){ - res[item] = this.handleReq_body_form.bind(this)(data[reflect[item]]); - }else if(item === "req_body_type"){ - if(data.headers.indexOf('application/json')>-1){ - res[item] = "json"; - }else{ - res[item] = "raw"; - } - }else if(item === "path"){ - res[item] = this.handlePath.bind(this)(data[reflect[item]]); - if(res[item] && res[item].indexOf("/:") > -1){ - let params = res[item].substr(res[item].indexOf("/:")+2).split("/:"); - // res[item] = res[item].substr(0,res[item].indexOf("/:")); - let arr = []; - for(let i in params){ - arr.push({ - name: params[i], - desc: "" - }); - } - res["req_params"] = arr; - } - }else if(item === "title"){ - let path = this.handlePath.bind(this)(data[reflect["path"]]); - if(data[reflect[item]].indexOf(path) > -1){ - res[item] = path; - if(res[item] && res[item].indexOf("/:") > -1){ - res[item] = res[item].substr(0,res[item].indexOf("/:")); - } - }else{ - res[item] = data[reflect[item]]; - } - }else{ - res[item] = data[reflect[item]]; - } - } - return res; - } + uploadChnange(info){ const status = info.file.status; @@ -206,53 +69,46 @@ class ProjectData extends Component { handleAddInterface(info){ if(this.state.selectCatid){ - let filename = info.file.name; - let filetype = filename.substr(filename.lastIndexOf(".")).toLowerCase(); + // let filename = info.file.name; + // let filetype = filename.substr(filename.lastIndexOf(".")).toLowerCase(); // console.log(filename,filetype); - if(filetype != ".json") return message.error("文件格式只能为json"); + //if(filetype != ".json") return message.error("文件格式只能为json"); let reader = new FileReader(); reader.readAsText(info.file); reader.onload = (res)=>{ - - res = res.target.result; - try{ - res = JSON.parse(res); - let interData = res.requests; - interData = this.checkInterRepeat.bind(this)(interData); - - if(interData && interData.length){ - let len = interData.length; - let count = 0; - let successNum = len; - for(let item in interData){ - let data = this.importPostman.bind(this)(interData[item]); - data = { - ...data, - project_id: this.props.projectId, - catid: this.state.selectCatid - } - axios.post('/api/interface/add',data).then((res)=>{ - count++; - if(res.data.errcode){ - successNum--; - } - if(count === len){ - message.success(`成功导入接口 ${successNum} 个`); - } - }); - } + res = importDataModule[this.state.curImportType].run(res.target.result); + res = res.apis; + let len = res.length; + let count = 0; + let successNum = len; + res.forEach(async (item)=>{ + let data = { + ...item, + project_id: this.props.match.params.id, + catid: this.state.selectCatid } - - }catch(e){ - message.error("文件格式必须为JSON"); - } - + let result = await axios.post('/api/interface/add',data); + count++; + if(result.data.errcode){ + successNum--; + } + if(count === len){ + message.success(`成功导入接口 ${successNum} 个`); + } + + }) } }else{ message.error("请选择上传的分类"); } } + handleImportType=(val) =>{ + this.setState({ + curImportType: val + }) + } + /** * * @@ -271,9 +127,17 @@ class ProjectData extends Component { return (
- +

数据导入

-

Postman 数据导入

+
+ +