fix: 修复无权限进入项目bug

This commit is contained in:
gaoxiaolin.gao 2018-01-10 15:07:39 +08:00
parent fb1a6d19de
commit 7322e3fc89
13 changed files with 97 additions and 93 deletions

View File

@ -1,3 +1,9 @@
### v1.3.4
#### Bug Fixed
* 修复无权限进入项目bug
### v1.3.3
#### Feature

View File

@ -7,8 +7,8 @@ import showDiffMsg from '../../../common/diff-view.js'
import variable from '../../constants/variable';
import { Link } from 'react-router-dom'
import { fetchNewsData, fetchMoreNews } from '../../reducer/modules/news.js'
import { fetchInterfaceList } from '../../reducer/modules/interface.js'
import ErrMsg from '../ErrMsg/ErrMsg.js';
import axios from 'axios'
const jsondiffpatch = require('jsondiffpatch/public/build/jsondiffpatch-full.js')
const formattersHtml = require('jsondiffpatch/public/build/jsondiffpatch-formatters.js').html;
import 'jsondiffpatch/public/formatters-styles/annotated.css'
@ -97,7 +97,8 @@ function timeago(timestamp) {
},
{
fetchNewsData: fetchNewsData,
fetchMoreNews: fetchMoreNews
fetchMoreNews: fetchMoreNews,
fetchInterfaceList
}
)
@ -111,7 +112,8 @@ class TimeTree extends Component {
curpage: PropTypes.number,
typeid: PropTypes.number,
curUid: PropTypes.number,
type: PropTypes.string
type: PropTypes.string,
fetchInterfaceList: PropTypes.func
}
constructor(props) {
@ -163,9 +165,9 @@ class TimeTree extends Component {
}
async getApiList() {
let result = await axios.get('/api/interface/list?project_id=' + this.props.typeid);
let result = await this.props.fetchInterfaceList(this.props.typeid);
this.setState({
apiList: result.data.data
apiList: JSON.parse(JSON.stringify(result.payload.data.data))
})
}
@ -227,7 +229,7 @@ class TimeTree extends Component {
}
let diffView = showDiffMsg(jsondiffpatch, formattersHtml, curDiffData);
console.log('diff', diffView);
return (
<section className="news-timeline">

View File

@ -3,18 +3,7 @@ import PropTypes from 'prop-types'
// import { connect } from 'react-redux'
import { Table } from 'antd'
import variable from '../../../../constants/variable';
// import { fetchInterfaceList } from '../../../../reducer/modules/interface.js';
// @connect(
// state => {
// return {
// list: state.inter.list
// }
// },
// {
// fetchInterfaceList
// }
// )
export default class ImportInterface extends Component {
constructor(props) {
super(props)

View File

@ -3,7 +3,7 @@ import { connect } from 'react-redux';
import { withRouter } from 'react-router'
import PropTypes from 'prop-types'
import { fetchInterfaceColList, fetchInterfaceCaseList, setColData, fetchCaseList } from '../../../../reducer/modules/interfaceCol'
import { fetchInterfaceList } from '../../../../reducer/modules/interface.js';
import { fetchInterfaceListMenu } from '../../../../reducer/modules/interface.js';
import axios from 'axios';
// import { Input, Icon, Button, Modal, message, Tooltip, Tree, Dropdown, Menu, Form } from 'antd';
import ImportInterface from './ImportInterface'
@ -54,7 +54,7 @@ const ColModalForm = Form.create()((props) => {
{
fetchInterfaceColList,
fetchInterfaceCaseList,
fetchInterfaceList,
fetchInterfaceListMenu,
fetchCaseList,
setColData
}
@ -67,7 +67,7 @@ export default class InterfaceColMenu extends Component {
interfaceColList: PropTypes.array,
fetchInterfaceColList: PropTypes.func,
fetchInterfaceCaseList: PropTypes.func,
fetchInterfaceList: PropTypes.func,
fetchInterfaceListMenu: PropTypes.func,
fetchCaseList: PropTypes.func,
setColData: PropTypes.func,
currCaseId: PropTypes.number,
@ -269,7 +269,7 @@ export default class InterfaceColMenu extends Component {
showImportInterfaceModal = async (colId) => {
const projectId = this.props.match.params.id;
await this.props.fetchInterfaceList(projectId)
await this.props.fetchInterfaceListMenu(projectId)
this.setState({ importInterVisible: true, importColId: colId })
}
handleImportOk = async () => {

View File

@ -2,7 +2,7 @@ import React, { PureComponent as Component } from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux';
import InterfaceEditForm from './InterfaceEditForm.js'
import { updateInterfaceData, fetchInterfaceList, fetchInterfaceData } from '../../../../reducer/modules/interface.js';
import { updateInterfaceData, fetchInterfaceListMenu, fetchInterfaceData } from '../../../../reducer/modules/interface.js';
import axios from 'axios'
import { message } from 'antd'
import './Edit.scss'
@ -16,7 +16,7 @@ import { withRouter, Link } from 'react-router-dom';
}
}, {
updateInterfaceData,
fetchInterfaceList,
fetchInterfaceListMenu,
fetchInterfaceData
}
)
@ -26,7 +26,7 @@ class InterfaceEdit extends Component {
curdata: PropTypes.object,
currProject: PropTypes.object,
updateInterfaceData: PropTypes.func,
fetchInterfaceList: PropTypes.func,
fetchInterfaceListMenu: PropTypes.func,
fetchInterfaceData: PropTypes.func,
match: PropTypes.object,
switchToView: PropTypes.func
@ -45,7 +45,7 @@ class InterfaceEdit extends Component {
onSubmit = async (params) => {
params.id = this.props.match.params.actionId;
let result = await axios.post('/api/interface/up', params);
this.props.fetchInterfaceList(this.props.currProject._id).then();
this.props.fetchInterfaceListMenu(this.props.currProject._id).then();
this.props.fetchInterfaceData(params.id).then()
if (result.data.errcode === 0) {

View File

@ -6,7 +6,7 @@ import {
Table, Button, Modal, message, Tooltip, Select
} from 'antd';
import AddInterfaceForm from './AddInterfaceForm';
import { fetchInterfaceList } from '../../../../reducer/modules/interface.js';
import { fetchInterfaceListMenu, fetchInterfaceList } from '../../../../reducer/modules/interface.js';
import { Link } from 'react-router-dom';
import variable from '../../../../constants/variable';
import './Edit.scss';
@ -20,6 +20,7 @@ const Option = Select.Option;
catList: state.inter.list
}
}, {
fetchInterfaceListMenu,
fetchInterfaceList
})
class InterfaceList extends Component {
@ -38,6 +39,7 @@ class InterfaceList extends Component {
match: PropTypes.object,
curProject: PropTypes.object,
history: PropTypes.object,
fetchInterfaceListMenu: PropTypes.func,
fetchInterfaceList: PropTypes.func
}
@ -48,10 +50,18 @@ class InterfaceList extends Component {
this.setState({
catid: null
})
let r = await axios.get('/api/interface/list?project_id=' + projectId);
// let r = await axios.get('/api/interface/list?project_id=' + projectId);
// if (r.data.errcode) {
// throw new Error(r.data.errmsg);
// }
// this.setState({
// data: r.data.data
// })
let r = await this.props.fetchInterfaceList(projectId);
this.setState({
data: r.data.data
data: JSON.parse(JSON.stringify(r.payload.data.data))
})
} else if (isNaN(params.actionId)) {
let catid = params.actionId.substr(4)
this.setState({ catid: +catid })
@ -92,7 +102,7 @@ class InterfaceList extends Component {
message.success('接口添加成功')
let interfaceId = res.data.data._id;
this.props.history.push("/project/" + data.project_id + "/interface/api/" + interfaceId)
this.props.fetchInterfaceList(data.project_id)
this.props.fetchInterfaceListMenu(data.project_id)
})
}
@ -105,7 +115,7 @@ class InterfaceList extends Component {
if (result.data.errcode === 0) {
message.success('修改成功');
this.handleRequest(this.props);
this.props.fetchInterfaceList(this.props.curProject._id)
this.props.fetchInterfaceListMenu(this.props.curProject._id)
} else {
message.error(result.data.errmsg)
}
@ -126,6 +136,7 @@ class InterfaceList extends Component {
}
render() {
const columns = [{
title: '接口名称',
dataIndex: 'title',
@ -142,7 +153,7 @@ class InterfaceList extends Component {
render: (item, record) => {
const path = this.props.curProject.basepath + item;
let methodColor = variable.METHOD_COLOR[record.method ? record.method.toLowerCase() : 'get'];
return <Tooltip title={path} placement="topLeft" overlayClassName="toolTip">
<span style={{ color: methodColor.color, backgroundColor: methodColor.bac }} className="colValue">{record.method}</span>
<span className="path">{path}</span>
@ -154,8 +165,8 @@ class InterfaceList extends Component {
key: 'catid',
width: 12,
render: (item, record) => {
return <Select value={item + ''} className="select" onChange={(catid)=> this.changeInterfaceCat(record._id, catid)}>
{this.props.catList.map(cat=>{
return <Select value={item + ''} className="select" onChange={(catid) => this.changeInterfaceCat(record._id, catid)}>
{this.props.catList.map(cat => {
return <Option key={cat.id + ''} value={cat._id + ''}><span >{cat.name}</span></Option>
})}
</Select>
@ -182,27 +193,29 @@ class InterfaceList extends Component {
onFilter: (value, record) => record.status.indexOf(value) === 0
}]
let intername = '', desc = '';
if (this.props.curProject.cat) {
for (let i = 0; i < this.props.curProject.cat.length; i++) {
if (this.props.curProject.cat[i]._id === this.state.catid) {
intername = this.props.curProject.cat[i].name;
desc = this.props.curProject.cat[i].desc;
let cat = this.props.curProject ? this.props.curProject.cat : [];
if (cat) {
for (let i = 0; i < cat.length; i++) {
if (cat[i]._id === this.state.catid) {
intername = cat[i].name;
desc = cat[i].desc;
}
}
}
const data = this.state.data ? this.state.data.map(item => {
item.key = item._id;
return item;
}) : null;
}) : [];
return (
<div style={{ padding: '24px' }}>
<h2 className="interface-title" style={{ display: 'inline-block', margin: 0 }}>{intername ? intername : '全部接口'} ({data.length}) </h2>
<Button style={{ float: 'right' }} type="primary" onClick={() => this.setState({ visible: true })}>添加接口</Button>
<div >
{desc &&
<p style={{marginTop: '10px'}}>{desc} </p>
<p style={{ marginTop: '10px' }}>{desc} </p>
}
</div>
<Table className="table-interfacelist" pagination={false} columns={columns} onChange={this.handleChange} dataSource={data} />
@ -213,7 +226,7 @@ class InterfaceList extends Component {
footer={null}
className="addcatmodal"
>
<AddInterfaceForm catid={this.state.catid} catdata={this.props.curProject.cat} onCancel={() => this.setState({ 'visible': false })} onSubmit={this.handleAddInterface} />
<AddInterfaceForm catid={this.state.catid} catdata={cat} onCancel={() => this.setState({ 'visible': false })} onSubmit={this.handleAddInterface} />
</Modal>
</div>
)

View File

@ -1,7 +1,7 @@
import React, { PureComponent as Component } from 'react'
import { connect } from 'react-redux';
import PropTypes from 'prop-types'
import { fetchInterfaceList, fetchInterfaceData, deleteInterfaceData, deleteInterfaceCatData, initInterface } from '../../../../reducer/modules/interface.js';
import { fetchInterfaceListMenu, fetchInterfaceData, deleteInterfaceData, deleteInterfaceCatData, initInterface } from '../../../../reducer/modules/interface.js';
import { getProject } from '../../../../reducer/modules/project.js';
import { Input, Icon, Button, Modal, message, Tree, Tooltip } from 'antd';
import AddInterfaceForm from './AddInterfaceForm';
@ -23,7 +23,7 @@ const TreeNode = Tree.TreeNode;
}
},
{
fetchInterfaceList,
fetchInterfaceListMenu,
fetchInterfaceData,
deleteInterfaceCatData,
deleteInterfaceData,
@ -37,7 +37,7 @@ class InterfaceMenu extends Component {
inter: PropTypes.object,
projectId: PropTypes.string,
list: PropTypes.array,
fetchInterfaceList: PropTypes.func,
fetchInterfaceListMenu: PropTypes.func,
curProject: PropTypes.object,
fetchInterfaceData: PropTypes.func,
addInterfaceData: PropTypes.func,
@ -86,9 +86,9 @@ class InterfaceMenu extends Component {
}
async getList() {
let r = await this.props.fetchInterfaceList(this.props.projectId);
let r = await this.props.fetchInterfaceListMenu(this.props.projectId);
this.setState({
list: JSON.parse(JSON.stringify(r.payload.data))
list: JSON.parse(JSON.stringify(r.payload.data.data))
})
}
@ -263,7 +263,7 @@ class InterfaceMenu extends Component {
const dragCatId = this.props.list[dragCatIndex]._id;
if (id.indexOf('cat') === -1 && dropCatId !== dragCatId) {
await axios.post('/api/interface/up', { id, catid: dropCatId });
this.props.fetchInterfaceList(this.props.projectId);
this.props.fetchInterfaceListMenu(this.props.projectId);
}
}

View File

@ -46,7 +46,7 @@ export default class Project extends Component {
async componentWillMount() {
await this.props.getProject(this.props.match.params.id);
const groupMsg = await this.props.fetchGroupMsg(this.props.curProject.group_id);
this.setState({
currGroup: groupMsg.payload.data.data
})

View File

@ -47,10 +47,13 @@ class ProjectData extends Component {
componentWillMount() {
axios.get(`/api/interface/getCatMenu?project_id=${this.props.match.params.id}`).then((data) => {
let menuList = data.data.data;
this.setState({
menuList: menuList
})
if (data.data.errcode === 0) {
let menuList = data.data.data;
this.setState({
menuList: menuList
})
}
});
plugin.emitHook('import_data', importDataModule);
plugin.emitHook('export_data', exportDataModule, this.props.match.params.id);
@ -76,7 +79,7 @@ class ProjectData extends Component {
}
async handleAddCat(cats) {
let menuList = this.state.menuList;
let catsObj = {};
if (cats && Array.isArray(cats)) {

View File

@ -6,6 +6,7 @@ export default () => next => action => {
message.error((action.payload && action.payload.message) || '服务器错误');
} else if (action.payload && action.payload.data && action.payload.data.errcode && action.payload.data.errcode !== 40011) {
message.error(action.payload.data.errmsg);
throw new Error(action.payload.data.errmsg);
}
return next(action);
};

View File

@ -2,11 +2,12 @@ import axios from 'axios'
// Actions
const INIT_INTERFACE_DATA = 'yapi/interface/INIT_INTERFACE_DATA';
const FETCH_INTERFACE_DATA = 'yapi/interface/FETCH_INTERFACE_DATA';
const FETCH_INTERFACE_LIST = 'yapi/interface/FETCH_INTERFACE_LIST';
const FETCH_INTERFACE_LIST_MENU = 'yapi/interface/FETCH_INTERFACE_LIST_MENU';
const DELETE_INTERFACE_DATA = 'yapi/interface/DELETE_INTERFACE_DATA';
const DELETE_INTERFACE_CAT_DATA = 'yapi/interface/DELETE_INTERFACE_CAT_DATA';
const UPDATE_INTERFACE_DATA = 'yapi/interface/UPDATE_INTERFACE_DATA';
const CHANGE_EDIT_STATUS = 'yapi/interface/CHANGE_EDIT_STATUS';
const FETCH_INTERFACE_LIST = 'yapi/interface/FETCH_INTERFACE_LIST';
// const SAVE_INTERFACE_PROJECT_ID = 'yapi/interface/SAVE_INTERFACE_PROJECT_ID';
// const GET_INTERFACE_GROUP_LIST = 'yapi/interface/GET_INTERFACE_GROUP_LIST';
@ -30,12 +31,12 @@ export default (state = initialState, action) => {
case FETCH_INTERFACE_DATA:
return {
...state,
curdata: action.payload.data
curdata: action.payload.data.data
}
case FETCH_INTERFACE_LIST:
case FETCH_INTERFACE_LIST_MENU:
return {
...state,
list: action.payload.data
list: action.payload.data.data
}
case CHANGE_EDIT_STATUS: {
return {
@ -94,14 +95,23 @@ export async function fetchInterfaceData(interfaceId) {
let result = await axios.get('/api/interface/get?id=' + interfaceId);
return {
type: FETCH_INTERFACE_DATA,
payload: result.data
payload: result
}
}
export async function fetchInterfaceList(projectId) {
export async function fetchInterfaceListMenu(projectId) {
let result = await axios.get('/api/interface/list_menu?project_id=' + projectId);
return {
type: FETCH_INTERFACE_LIST,
payload: result.data
type: FETCH_INTERFACE_LIST_MENU,
payload: result
}
}
export async function fetchInterfaceList(projectId) {
let result = await axios.get('/api/interface/list?project_id=' + projectId);
return {
type: FETCH_INTERFACE_LIST,
payload: result
}
}

View File

@ -3,7 +3,6 @@ import variable from '../../constants/variable';
// Actions
const FETCH_PROJECT_LIST = 'yapi/project/FETCH_PROJECT_LIST';
const GET_PROJECT_MSG = 'yapi/project/GET_PROJECT_MSG';
const PROJECT_ADD = 'yapi/project/PROJECT_ADD';
const PROJECT_DEL = 'yapi/project/PROJECT_DEL';
// const CHANGE_TABLE_LOADING = 'yapi/project/CHANGE_TABLE_LOADING';
@ -26,30 +25,20 @@ const initialState = {
tableLoading: true,
total: 0,
currPage: 1,
currProject: {}
currProject: {
}
};
export default (state = initialState, action) => {
switch (action.type) {
case GET_CURR_PROJECT: {
return {
...state,
currProject: action.payload.data
currProject: action.payload.data.data
}
}
// case CHANGE_UPDATE_MODAL: {
// return {
// ...state,
// isUpdateModalShow: action.payload.data,
// handleUpdateIndex: action.payload.index
// };
// }
// case CHANGE_TABLE_LOADING: {
// return {
// ...state,
// tableLoading: action.payload
// }
// }
case FETCH_PROJECT_LIST: {
return {
...state,
@ -58,12 +47,7 @@ export default (state = initialState, action) => {
userInfo: action.payload.data.data.userinfo
};
}
case GET_PROJECT_MSG: {
return {
...state,
projectMsg: action.payload.data.data
};
}
case PROJECT_ADD: {
return state;
}
@ -218,13 +202,10 @@ export function delProject(id) {
};
}
export function getProject(id){
return async (dispatch) => {
let result = await axios.get('/api/project/get?id=' + id);
dispatch({
type: GET_CURR_PROJECT,
payload: result.data
})
export async function getProject(id) {
let result = await axios.get('/api/project/get?id=' + id);
return {
type: GET_CURR_PROJECT,
payload: result
}
}

View File

@ -791,7 +791,6 @@ class interfaceController extends baseController {
const users = this.arrUnique(projectMenbers, starUsers);
const usersInfo = await this.userModel.findByUids(users)
const emails = usersInfo.map(item => item.email).join(',');
console.log('emails', emails);
try {
yapi.commons.sendMail({