mirror of
https://github.com/YMFE/yapi.git
synced 2025-03-07 14:16:52 +08:00
feat: add websocket to solve interface edit and add addMember role and add case req_params
This commit is contained in:
parent
1227086a2c
commit
0d3d8a251b
@ -11,22 +11,18 @@ import InterfaceContent from './InterfaceList/InterfaceContent.js'
|
||||
import InterfaceColMenu from './InterfaceCol/InterfaceColMenu.js'
|
||||
import InterfaceColContent from './InterfaceCol/InterfaceColContent.js'
|
||||
|
||||
class InterfaceRoute extends Component {
|
||||
static propTypes = {
|
||||
match: PropTypes.object
|
||||
}
|
||||
constructor(props){
|
||||
super(props)
|
||||
}
|
||||
render() {
|
||||
let C, props = this.props;
|
||||
if (props.match.params.action === 'api') {
|
||||
C = InterfaceContent;
|
||||
} else if (props.match.params.action === 'col') {
|
||||
C = InterfaceColContent;
|
||||
}
|
||||
return <C />
|
||||
const InterfaceRoute = (props) => {
|
||||
let C;
|
||||
if (props.match.params.action === 'api') {
|
||||
C = InterfaceContent;
|
||||
} else if (props.match.params.action === 'col') {
|
||||
C = InterfaceColContent;
|
||||
}
|
||||
return <C />
|
||||
}
|
||||
|
||||
InterfaceRoute.propTypes = {
|
||||
match: PropTypes.object
|
||||
}
|
||||
|
||||
|
||||
@ -42,7 +38,7 @@ class Interface extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
onChange = (key)=>{
|
||||
onChange = (key) => {
|
||||
this.setState({
|
||||
curkey: key
|
||||
})
|
||||
|
@ -44,6 +44,28 @@ class InterfaceEdit extends Component{
|
||||
}
|
||||
}
|
||||
|
||||
componentWillMount(){
|
||||
let s = new WebSocket('ws://yapi.local.qunar.com:3000/api/interface/solve_conflict?id=1');
|
||||
s.onopen = (e)=>{
|
||||
console.log('open',e)
|
||||
s.send('abc')
|
||||
}
|
||||
|
||||
s.onclose = (e)=>{
|
||||
console.log('close',e)
|
||||
}
|
||||
|
||||
s.onmessage = (e)=>{
|
||||
console.log('message',e)
|
||||
}
|
||||
|
||||
s.onerror = (e)=>{
|
||||
console.log('error',e)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
render(){
|
||||
return <div className="interface-edit">
|
||||
<InterfaceEditForm mockUrl={this.state.mockUrl} basepath={this.props.currProject.basepath} onSubmit={this.onSubmit} curdata={this.props.curdata} />
|
||||
|
@ -64,6 +64,7 @@
|
||||
"koa-session-minimal": "^3.0.3",
|
||||
"koa-static": "^3.0.0",
|
||||
"koa-views": "^5.2.0",
|
||||
"koa-websocket": "^4.0.0",
|
||||
"mock": "^0.1.1",
|
||||
"mockjs": "^1.0.1-beta3",
|
||||
"moment": "^2.18.1",
|
||||
|
@ -7,9 +7,12 @@ import Koa from 'koa';
|
||||
import koaStatic from 'koa-static';
|
||||
import bodyParser from 'koa-bodyparser';
|
||||
import router from './router.js';
|
||||
import websockify from 'koa-websocket';
|
||||
import websocket from './websocket.js'
|
||||
|
||||
|
||||
yapi.connect = dbModule.connect();
|
||||
const app = new Koa();
|
||||
const app = websockify(new Koa());
|
||||
let indexFile = process.argv[2] === 'dev' ? 'dev.html' : 'index.html';
|
||||
|
||||
|
||||
@ -18,7 +21,7 @@ app.use(bodyParser());
|
||||
app.use(router.routes());
|
||||
app.use(router.allowedMethods());
|
||||
|
||||
|
||||
websocket(app);
|
||||
|
||||
app.use( async (ctx, next) => {
|
||||
if( /^\/(?!api)[a-zA-Z0-9\/\-]*$/.test(ctx.path) ){
|
||||
|
@ -127,6 +127,7 @@ class groupController extends baseController {
|
||||
* @foldnumber 10
|
||||
* @param {String} id 项目分组id
|
||||
* @param {String} member_uid 项目分组成员uid
|
||||
* @param {String} role 成员角色,owner or dev
|
||||
* @returns {Object}
|
||||
* @example
|
||||
*/
|
||||
@ -144,11 +145,13 @@ class groupController extends baseController {
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '分组id不能为空');
|
||||
}
|
||||
|
||||
params.role = params.role === 'owner' ? 'owner' : 'dev';
|
||||
|
||||
var check = await groupInst.checkMemberRepeat(params.id, params.member_uid);
|
||||
if (check > 0) {
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '成员已存在');
|
||||
}
|
||||
let groupUserdata = await this.getUserdata(params.member_uid);
|
||||
let groupUserdata = await this.getUserdata(params.member_uid, params.role);
|
||||
if (groupUserdata === null) {
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '组长uid不存在')
|
||||
}
|
||||
|
@ -304,6 +304,17 @@ class interfaceController extends baseController {
|
||||
ctx.body = yapi.commons.resReturn(null, 402, err.message);
|
||||
}
|
||||
}
|
||||
|
||||
async solveConflict(ctx) {
|
||||
let id = parseInt(ctx.query.id, 10);
|
||||
if(!id) return ctx.websocket.send("id 参数有误");
|
||||
|
||||
ctx.websocket.send('Hello World');
|
||||
ctx.websocket.on('message', function (message) {
|
||||
// do something with the message from client
|
||||
console.log(message);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = interfaceController;
|
@ -141,7 +141,9 @@ class projectController extends baseController {
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目成员已存在');
|
||||
}
|
||||
|
||||
let userdata = await this.getUserdata(params.member_uid);
|
||||
params.role = params.role === 'owner' ? 'owner' : 'dev';
|
||||
|
||||
let userdata = await this.getUserdata(params.member_uid, params.role);
|
||||
if(userdata === null){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '成员uid不存在')
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ class interfaceModel extends baseModel {
|
||||
path: { type: String, required: true },
|
||||
method: { type: String, required: true },
|
||||
project_id: { type: Number, required: true },
|
||||
edit_uid: {type: Number},
|
||||
status: {type: String, enum: ['undone', 'done'], default: 'undone'},
|
||||
desc: String,
|
||||
add_time: Number,
|
||||
|
@ -19,6 +19,9 @@ class interfaceCase extends baseModel {
|
||||
domain: {type: String },
|
||||
path: { type: String },
|
||||
method: { type: String },
|
||||
req_params: [{
|
||||
name: String, value: String
|
||||
}],
|
||||
req_query: [{
|
||||
name: String, value: String
|
||||
}],
|
||||
|
23
server/websocket.js
Normal file
23
server/websocket.js
Normal file
@ -0,0 +1,23 @@
|
||||
import koaRouter from 'koa-router';
|
||||
const route = require('koa-route');
|
||||
import interfaceController from './controllers/interface.js';
|
||||
|
||||
|
||||
function websocket(app) {
|
||||
console.log('load websocket...')
|
||||
app.ws.use(function (ctx, next) {
|
||||
return next(ctx);
|
||||
});
|
||||
app.ws.use(route.all('/api/interface/solve_conflict', async function (ctx) {
|
||||
let inst = new interfaceController(ctx);
|
||||
await inst.init(ctx);
|
||||
if (inst.$auth === true) {
|
||||
await inst.solveConflict.call(inst, ctx);
|
||||
} else {
|
||||
ctx.ws.send('请登录...');
|
||||
}
|
||||
}));
|
||||
|
||||
}
|
||||
|
||||
module.exports = websocket
|
@ -40,13 +40,21 @@ var _router = require('./router.js');
|
||||
|
||||
var _router2 = _interopRequireDefault(_router);
|
||||
|
||||
var _koaWebsocket = require('koa-websocket');
|
||||
|
||||
var _koaWebsocket2 = _interopRequireDefault(_koaWebsocket);
|
||||
|
||||
var _websocket = require('./websocket.js');
|
||||
|
||||
var _websocket2 = _interopRequireDefault(_websocket);
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
_yapi2.default.commons = _commons2.default;
|
||||
|
||||
|
||||
_yapi2.default.connect = _db2.default.connect();
|
||||
var app = new _koa2.default();
|
||||
var app = (0, _koaWebsocket2.default)(new _koa2.default());
|
||||
var indexFile = process.argv[2] === 'dev' ? 'dev.html' : 'index.html';
|
||||
|
||||
app.use(_mockServer2.default);
|
||||
@ -54,6 +62,8 @@ app.use((0, _koaBodyparser2.default)());
|
||||
app.use(_router2.default.routes());
|
||||
app.use(_router2.default.allowedMethods());
|
||||
|
||||
(0, _websocket2.default)(app);
|
||||
|
||||
app.use(function () {
|
||||
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(ctx, next) {
|
||||
return _regenerator2.default.wrap(function _callee$(_context) {
|
||||
|
@ -325,6 +325,7 @@ var groupController = function (_baseController) {
|
||||
* @foldnumber 10
|
||||
* @param {String} id 项目分组id
|
||||
* @param {String} member_uid 项目分组成员uid
|
||||
* @param {String} role 成员角色,owner or dev
|
||||
* @returns {Object}
|
||||
* @example
|
||||
*/
|
||||
@ -357,66 +358,69 @@ var groupController = function (_baseController) {
|
||||
return _context4.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '分组id不能为空'));
|
||||
|
||||
case 6:
|
||||
_context4.next = 8;
|
||||
|
||||
params.role = params.role === 'owner' ? 'owner' : 'dev';
|
||||
|
||||
_context4.next = 9;
|
||||
return groupInst.checkMemberRepeat(params.id, params.member_uid);
|
||||
|
||||
case 8:
|
||||
case 9:
|
||||
check = _context4.sent;
|
||||
|
||||
if (!(check > 0)) {
|
||||
_context4.next = 11;
|
||||
_context4.next = 12;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context4.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '成员已存在'));
|
||||
|
||||
case 11:
|
||||
_context4.next = 13;
|
||||
return this.getUserdata(params.member_uid);
|
||||
case 12:
|
||||
_context4.next = 14;
|
||||
return this.getUserdata(params.member_uid, params.role);
|
||||
|
||||
case 13:
|
||||
case 14:
|
||||
groupUserdata = _context4.sent;
|
||||
|
||||
if (!(groupUserdata === null)) {
|
||||
_context4.next = 16;
|
||||
_context4.next = 17;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context4.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '组长uid不存在'));
|
||||
|
||||
case 16:
|
||||
case 17:
|
||||
if (!(groupUserdata._role === 'admin')) {
|
||||
_context4.next = 18;
|
||||
_context4.next = 19;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context4.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '不能邀请管理员'));
|
||||
|
||||
case 18:
|
||||
case 19:
|
||||
delete groupUserdata._role;
|
||||
_context4.prev = 19;
|
||||
_context4.next = 22;
|
||||
_context4.prev = 20;
|
||||
_context4.next = 23;
|
||||
return groupInst.addMember(params.id, groupUserdata);
|
||||
|
||||
case 22:
|
||||
case 23:
|
||||
result = _context4.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context4.next = 29;
|
||||
_context4.next = 30;
|
||||
break;
|
||||
|
||||
case 26:
|
||||
_context4.prev = 26;
|
||||
_context4.t0 = _context4['catch'](19);
|
||||
case 27:
|
||||
_context4.prev = 27;
|
||||
_context4.t0 = _context4['catch'](20);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, _context4.t0.message);
|
||||
|
||||
case 29:
|
||||
case 30:
|
||||
case 'end':
|
||||
return _context4.stop();
|
||||
}
|
||||
}
|
||||
}, _callee4, this, [[19, 26]]);
|
||||
}, _callee4, this, [[20, 27]]);
|
||||
}));
|
||||
|
||||
function addMember(_x5) {
|
||||
|
@ -589,6 +589,46 @@ var interfaceController = function (_baseController) {
|
||||
|
||||
return del;
|
||||
}()
|
||||
}, {
|
||||
key: 'solveConflict',
|
||||
value: function () {
|
||||
var _ref6 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee6(ctx) {
|
||||
var id;
|
||||
return _regenerator2.default.wrap(function _callee6$(_context6) {
|
||||
while (1) {
|
||||
switch (_context6.prev = _context6.next) {
|
||||
case 0:
|
||||
id = parseInt(ctx.query.id, 10);
|
||||
|
||||
if (id) {
|
||||
_context6.next = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context6.abrupt('return', ctx.websocket.send("id 参数有误"));
|
||||
|
||||
case 3:
|
||||
|
||||
ctx.websocket.send('Hello World');
|
||||
ctx.websocket.on('message', function (message) {
|
||||
// do something with the message from client
|
||||
console.log(message);
|
||||
});
|
||||
|
||||
case 5:
|
||||
case 'end':
|
||||
return _context6.stop();
|
||||
}
|
||||
}
|
||||
}, _callee6, this);
|
||||
}));
|
||||
|
||||
function solveConflict(_x6) {
|
||||
return _ref6.apply(this, arguments);
|
||||
}
|
||||
|
||||
return solveConflict;
|
||||
}()
|
||||
}]);
|
||||
return interfaceController;
|
||||
}(_base2.default);
|
||||
|
@ -313,25 +313,28 @@ var projectController = function (_baseController) {
|
||||
return _context2.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目成员已存在'));
|
||||
|
||||
case 15:
|
||||
_context2.next = 17;
|
||||
return this.getUserdata(params.member_uid);
|
||||
|
||||
case 17:
|
||||
params.role = params.role === 'owner' ? 'owner' : 'dev';
|
||||
|
||||
_context2.next = 18;
|
||||
return this.getUserdata(params.member_uid, params.role);
|
||||
|
||||
case 18:
|
||||
userdata = _context2.sent;
|
||||
|
||||
if (!(userdata === null)) {
|
||||
_context2.next = 20;
|
||||
_context2.next = 21;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context2.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '成员uid不存在'));
|
||||
|
||||
case 20:
|
||||
_context2.prev = 20;
|
||||
_context2.next = 23;
|
||||
case 21:
|
||||
_context2.prev = 21;
|
||||
_context2.next = 24;
|
||||
return this.Model.addMember(params.id, userdata);
|
||||
|
||||
case 23:
|
||||
case 24:
|
||||
result = _context2.sent;
|
||||
username = this.getUsername();
|
||||
|
||||
@ -343,21 +346,21 @@ var projectController = function (_baseController) {
|
||||
typeid: params.id
|
||||
});
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context2.next = 32;
|
||||
_context2.next = 33;
|
||||
break;
|
||||
|
||||
case 29:
|
||||
_context2.prev = 29;
|
||||
_context2.t1 = _context2['catch'](20);
|
||||
case 30:
|
||||
_context2.prev = 30;
|
||||
_context2.t1 = _context2['catch'](21);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, _context2.t1.message);
|
||||
|
||||
case 32:
|
||||
case 33:
|
||||
case 'end':
|
||||
return _context2.stop();
|
||||
}
|
||||
}
|
||||
}, _callee2, this, [[20, 29]]);
|
||||
}, _callee2, this, [[21, 30]]);
|
||||
}));
|
||||
|
||||
function addMember(_x2) {
|
||||
|
@ -52,6 +52,7 @@ var interfaceModel = function (_baseModel) {
|
||||
path: { type: String, required: true },
|
||||
method: { type: String, required: true },
|
||||
project_id: { type: Number, required: true },
|
||||
edit_uid: { type: Number },
|
||||
status: { type: String, enum: ['undone', 'done'], default: 'undone' },
|
||||
desc: String,
|
||||
add_time: Number,
|
||||
|
@ -58,6 +58,9 @@ var interfaceCase = function (_baseModel) {
|
||||
domain: { type: String },
|
||||
path: { type: String },
|
||||
method: { type: String },
|
||||
req_params: [{
|
||||
name: String, value: String
|
||||
}],
|
||||
req_query: [{
|
||||
name: String, value: String
|
||||
}],
|
||||
|
70
server_dist/websocket.js
Normal file
70
server_dist/websocket.js
Normal file
@ -0,0 +1,70 @@
|
||||
'use strict';
|
||||
|
||||
var _regenerator = require('babel-runtime/regenerator');
|
||||
|
||||
var _regenerator2 = _interopRequireDefault(_regenerator);
|
||||
|
||||
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
|
||||
|
||||
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
|
||||
|
||||
var _koaRouter = require('koa-router');
|
||||
|
||||
var _koaRouter2 = _interopRequireDefault(_koaRouter);
|
||||
|
||||
var _interface = require('./controllers/interface.js');
|
||||
|
||||
var _interface2 = _interopRequireDefault(_interface);
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
var route = require('koa-route');
|
||||
|
||||
|
||||
function websocket(app) {
|
||||
console.log('load websocket...');
|
||||
app.ws.use(function (ctx, next) {
|
||||
return next(ctx);
|
||||
});
|
||||
app.ws.use(route.all('/api/interface/solve_conflict', function () {
|
||||
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(ctx) {
|
||||
var inst;
|
||||
return _regenerator2.default.wrap(function _callee$(_context) {
|
||||
while (1) {
|
||||
switch (_context.prev = _context.next) {
|
||||
case 0:
|
||||
inst = new _interface2.default(ctx);
|
||||
_context.next = 3;
|
||||
return inst.init(ctx);
|
||||
|
||||
case 3:
|
||||
if (!(inst.$auth === true)) {
|
||||
_context.next = 8;
|
||||
break;
|
||||
}
|
||||
|
||||
_context.next = 6;
|
||||
return inst.solveConflict.call(inst, ctx);
|
||||
|
||||
case 6:
|
||||
_context.next = 9;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
ctx.ws.send('请登录...');
|
||||
|
||||
case 9:
|
||||
case 'end':
|
||||
return _context.stop();
|
||||
}
|
||||
}
|
||||
}, _callee, this);
|
||||
}));
|
||||
|
||||
return function (_x) {
|
||||
return _ref.apply(this, arguments);
|
||||
};
|
||||
}()));
|
||||
}
|
||||
|
||||
module.exports = websocket;
|
Loading…
Reference in New Issue
Block a user