-
-
-
Mock地址:
-
{this.state.mockURL}
-
-
+
+
+
+
+
+
+
+
Mock地址:
+
{this.state.mockURL}
+
+
+
+
+
-
-
+
)
}
}
diff --git a/client/containers/News/News.scss b/client/containers/News/News.scss
index 25168165..d445d9b4 100644
--- a/client/containers/News/News.scss
+++ b/client/containers/News/News.scss
@@ -5,7 +5,7 @@
display: -webkit-box;
-webkit-box-flex: 1;
- margin: .88rem auto 0 auto;
+ margin: 0px auto 0 auto;
font-size: 0.14rem;
background: #FFF;
display: block;
diff --git a/client/containers/ProjectGroups/ProjectList/UpDateModal.js b/client/containers/ProjectGroups/ProjectList/UpDateModal.js
index da6b69ef..c4ecfa96 100644
--- a/client/containers/ProjectGroups/ProjectList/UpDateModal.js
+++ b/client/containers/ProjectGroups/ProjectList/UpDateModal.js
@@ -187,13 +187,14 @@ class UpDateModal extends Component {
rules: [{
required: false,
whitespace: true,
- message: "请输入环境名称",
validator(rule, value, callback) {
if (value) {
if (value.length === 0) {
callback('请输入环境域名');
} else if (!/\S/.test(value)) {
callback('请输入环境域名');
+ } else if (/prd/.test(value)) {
+ callback('环境域名不能是"prd"');
} else {
return callback();
}
@@ -319,7 +320,7 @@ class UpDateModal extends Component {
label={(
基本路径
-
+
diff --git a/client/containers/User/Avatar.js b/client/containers/User/Avatar.js
new file mode 100644
index 00000000..4be77668
--- /dev/null
+++ b/client/containers/User/Avatar.js
@@ -0,0 +1,56 @@
+import './index.scss'
+import React, { Component } from 'react'
+// import PropTypes from 'prop-types'
+import { Upload, Icon, message } from 'antd'
+class Avatar extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ imageUrl:""
+ }
+ }
+ handleChange(info){
+ if (info.file.status === 'done') {
+ // Get this url from response in real world.
+ getBase64(info.file.originFileObj, imageUrl => this.setState({ imageUrl }));
+ }
+ }
+ render() {
+ const imageUrl = this.state.imageUrl;
+ return
+
+ {
+ imageUrl ?
+
:
+
+ }
+
+
+ }
+}
+
+function beforeUpload(file) {
+ const isJPG = file.type === 'image/jpeg';
+ if (!isJPG) {
+ message.error('You can only upload JPG file!');
+ }
+ const isLt2M = file.size / 1024 / 1024 < 2;
+ if (!isLt2M) {
+ message.error('Image must smaller than 2MB!');
+ }
+ return isJPG && isLt2M;
+}
+
+function getBase64(img, callback) {
+ const reader = new FileReader();
+ reader.addEventListener('load', () => callback(reader.result));
+ reader.readAsDataURL(img);
+}
+
+export default Avatar;
diff --git a/client/containers/User/LeftMenu.js b/client/containers/User/LeftMenu.js
index c91c089d..0b1be35e 100644
--- a/client/containers/User/LeftMenu.js
+++ b/client/containers/User/LeftMenu.js
@@ -4,6 +4,7 @@ import { Row, Col, Menu, AutoComplete, Input, Icon } from 'antd'
import axios from 'axios'
import { connect } from 'react-redux'
import PropTypes from 'prop-types'
+import Avatar from './Avatar.js'
const Option = AutoComplete.Option;
@connect(
@@ -87,6 +88,7 @@ class LeftMenu extends Component {
const { dataSource } = this.state;
return (
+
用户名 :{`${this.props.curUserName}`}
diff --git a/client/containers/User/index.scss b/client/containers/User/index.scss
index d2e6cc7d..4450acf8 100644
--- a/client/containers/User/index.scss
+++ b/client/containers/User/index.scss
@@ -11,6 +11,7 @@
display: -webkit-box;
-webkit-box-flex: 1;
margin: 0 auto;
+ margin-top: 24px;
.user-list {
box-shadow: 0 2px 4px 0 rgba(0,0,0,0.20);
background: #FFF;
@@ -108,4 +109,28 @@
border-bottom-left-radius: .04rem;
border-bottom-right-radius: .04rem;
}
+ .avatar-uploader,
+ .avatar-uploader-trigger,
+ .avatar {
+ width: 150px;
+ height: 150px;
+ }
+ .avatar-uploader {
+ display: block;
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ cursor: pointer;
+ }
+ .avatar-uploader {
+ display: block;
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ cursor: pointer;
+ }
+ .avatar-uploader-trigger {
+ display: table-cell;
+ vertical-align: middle;
+ font-size: 28px;
+ color: #999;
+ }
}
diff --git a/server/controllers/follow.js b/server/controllers/follow.js
new file mode 100644
index 00000000..f31a4527
--- /dev/null
+++ b/server/controllers/follow.js
@@ -0,0 +1,122 @@
+import yapi from '../yapi.js';
+import baseController from './base.js';
+import followModel from '../models/follow';
+
+class followController extends baseController {
+ constructor(ctx) {
+ super(ctx);
+ this.Model = yapi.getInst(followModel);
+ // try{
+ // var res = this.Model.save({
+ // uid: 107,
+ // projectid: 221,
+ // projectname: 'Flight',
+ // icon: 'code'
+ // });
+ // // var res = this.Model.del(107);
+ // ctx.body = yapi.commons.resReturn(null, 200,res);
+ // }catch(err){
+ // ctx.body = yapi.commons.resReturn(null, 402, err.message);
+ // }
+
+
+ }
+
+ /**
+ * 获取节点列表
+ * @interface /node/list
+ * @method GET
+ * @category node
+ * @foldnumber 10
+ * @param {Number} uid 用户id, 不能为空
+ * @param {Number} [page] 分页页码
+ * @param {Number} [limit] 分页大小
+ * @returns {Object}
+ * @example ./api/project/list.json
+ */
+
+ async list(ctx) {
+ let uid = ctx.request.query.uid,
+ page = ctx.request.query.page || 1,
+ limit = ctx.request.query.limit || 10;
+
+ if (!uid) {
+ return ctx.body = yapi.commons.resReturn(null, 400, '用户id不能为空');
+ }
+
+ try {
+ let result = await this.Model.listWithPaging(uid, page, limit);
+ let count = await this.Model.listCount(uid);
+
+ ctx.body = yapi.commons.resReturn({
+ total: Math.ceil(count / limit),
+ list: result
+ });
+ } catch (err) {
+ ctx.body = yapi.commons.resReturn(null, 402, err.message);
+ }
+ }
+
+ async del(ctx) {
+ let params = ctx.request.body;
+
+ if(params.followid){
+ return ctx.body = yapi.commons.resReturn(null, 400, '关注id不能为空');
+ }
+
+ try {
+ let result = await this.Model.del(params.id);
+ ctx.body = yapi.commons.resReturn(result);
+ } catch (e) {
+ ctx.body = yapi.commons.resReturn(null, 402, e.message);
+ }
+ }
+
+ async add(ctx) {
+ let params = ctx.request.body;
+ params = yapi.commons.handleParams(params, {
+ uid: 'number',
+ projectid: 'number',
+ projectname: 'string',
+ icon: 'string'
+ });
+
+ if (!params.uid) {
+ return ctx.body = yapi.commons.resReturn(null, 400, '用户id不为空');
+ }
+
+ if (!params.projectid) {
+ return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
+ }
+
+ let checkRepeat = await this.Model.checkProjectRepeat(params.uid,params.projectid);
+ if (checkRepeat) {
+ return ctx.body = yapi.commons.resReturn(null, 401, '项目已关注');
+ }
+
+ if (!params.projectname) {
+ return ctx.body = yapi.commons.resReturn(null, 400, '项目名不能为空');
+ }
+ if (!params.icon) {
+ return ctx.body = yapi.commons.resReturn(null, 400, '项目图标标志不能为空');
+ }
+
+ let data = {
+ uid: params.uid,
+ projectid: params.projectid,
+ projectname: params.projectname,
+ icon: params.icon
+ };
+
+ try {
+ let result = await this.Model.save(data);
+ result = yapi.commons.fieldSelect(result, ['_id', 'uid', 'projectid', 'projectname', 'icon']);
+ ctx.body = yapi.commons.resReturn(result);
+ } catch (e) {
+ ctx.body = yapi.commons.resReturn(null, 402, e.message);
+ }
+ }
+
+}
+
+module.exports = followController;
\ No newline at end of file
diff --git a/server/controllers/log.js b/server/controllers/log.js
index d6379b58..1ab1dff4 100644
--- a/server/controllers/log.js
+++ b/server/controllers/log.js
@@ -45,7 +45,7 @@ class logController extends baseController {
limit = ctx.request.query.limit || 10;
if (!typeid) {
- return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
+ return ctx.body = yapi.commons.resReturn(null, 400, 'typeid不能为空');
}
try {
diff --git a/server/controllers/project.js b/server/controllers/project.js
index bdddb5bc..9840f2c1 100644
--- a/server/controllers/project.js
+++ b/server/controllers/project.js
@@ -5,6 +5,8 @@ import interfaceModel from '../models/interface.js';
import groupModel from '../models/group';
import commons from '../utils/commons.js';
import userModel from '../models/user.js';
+import Mock from 'mockjs';
+const send = require('koa-send');
class projectController extends baseController {
@@ -77,7 +79,7 @@ class projectController extends baseController {
return ctx.body = yapi.commons.resReturn(null, 401, '已存在的项目名');
}
-
+
if (!params.prd_host) {
return ctx.body = yapi.commons.resReturn(null, 400, '项目domain不能为空');
}
@@ -98,7 +100,7 @@ class projectController extends baseController {
return ctx.body = yapi.commons.resReturn(null, 401, '已存在domain和basepath');
}
-
+
let data = {
name: params.name,
@@ -513,6 +515,41 @@ class projectController extends baseController {
return ctx.body = yapi.commons.resReturn(queryList, 0, 'ok');
}
+
+ /**
+ * 下载项目的 Mock 数据
+ * @interface /project/download
+ * @method GET
+ * @category project
+ * @foldnumber 10
+ * @param {String} project_id
+ */
+ async download(ctx) {
+ const project_id = ctx.request.query.project_id;
+ let interfaceInst = yapi.getInst(interfaceModel);
+ let count = await interfaceInst.list(project_id);
+ console.log(count);
+ const arr = JSON.stringify(count.map(function(item) {
+ // 返回的json模板数据: item.res_body
+ const mockData = Mock.mock(
+ yapi.commons.json_parse(item.res_body)
+ );
+ return {
+ path: item.path,
+ mock: mockData
+ }
+ }));
+ // console.log(arr);
+
+ const fileName = 'mock.js';
+ ctx.attachment(fileName);
+ await send(ctx, fileName, { root: __dirname + '/public' });
+
+ const res = `
+ var data = ${arr}`
+ .trim();
+ return ctx.body = res;
+ }
}
module.exports = projectController;
diff --git a/server/middleware/mockServer.js b/server/middleware/mockServer.js
index 10e13bf2..af90c30e 100644
--- a/server/middleware/mockServer.js
+++ b/server/middleware/mockServer.js
@@ -46,7 +46,7 @@ module.exports = async (ctx, next) => {
try {
- interfaceData = await interfaceInst.getByPath(project._id, ctx.path.substr(project.basepath.length), ctx.method);
+ interfaceData = await interfaceInst.getByPath(project._id, ctx.path.substr(project.basepath.length), ctx.method);
if (!interfaceData || interfaceData.length === 0) {
//非正常跨域预检请求回应
if(ctx.method === 'OPTIONS'){
@@ -65,9 +65,10 @@ module.exports = async (ctx, next) => {
ctx.set("Access-Control-Allow-Origin", "*")
if (interfaceData.res_body_type === 'json') {
try{
- return ctx.body = Mock.mock(
+ const res = Mock.mock(
yapi.commons.json_parse(interfaceData.res_body)
);
+ return ctx.body = res;
}catch(e){
return ctx.body = {
errcode: 400,
@@ -80,4 +81,4 @@ module.exports = async (ctx, next) => {
} catch (e) {
return ctx.body = yapi.commons.resReturn(null, 409, e.message);
}
-};
\ No newline at end of file
+};
diff --git a/server/models/follow.js b/server/models/follow.js
new file mode 100644
index 00000000..9097b326
--- /dev/null
+++ b/server/models/follow.js
@@ -0,0 +1,64 @@
+import baseModel from './base.js';
+
+class followModel extends baseModel {
+ getName() {
+ return 'follow';
+ }
+
+ getSchema() {
+ return {
+ uid: { type: Number, required: true },
+ projectid: { type: Number, required: true },
+ projectname: { type: String, required: true },
+ icon: String
+ };
+ }
+
+ /**
+ * @param {Number} uid 用户id
+ * @param {Number} projectid 项目id
+ * @param {String} projectname 项目名
+ * @param {String} icon 项目图标
+ */
+
+ save(data) {//关注
+ let saveData = {
+ uid: data.uid,
+ projectid: data.projectid,
+ projectname: data.projectname,
+ icon: data.icon
+ };
+ let follow = new this.model(saveData);
+ return follow.save();
+ }
+
+ del(id){
+ return this.model.deleteOne({
+ _id: id
+ });
+ }
+
+ listWithPaging(uid, page, limit) {
+ page = parseInt(page);
+ limit = parseInt(limit);
+
+ return this.model.find({
+ uid: uid
+ }).skip((page - 1) * limit).limit(limit).exec();
+ }
+
+ listCount(uid) {
+ return this.model.count({
+ uid: uid
+ });
+ }
+
+ checkProjectRepeat(uid,projectid){
+ return this.model.count({
+ uid: uid,
+ projectid: projectid
+ });
+ }
+}
+
+module.exports = followModel;
\ No newline at end of file
diff --git a/server/models/interface.js b/server/models/interface.js
index bddf7b5a..dc65feae 100644
--- a/server/models/interface.js
+++ b/server/models/interface.js
@@ -74,6 +74,7 @@ class interfaceModel extends baseModel {
}
list(project_id) {
+ console.log(project_id);
return this.model.find({
project_id: project_id
})
@@ -86,7 +87,7 @@ class interfaceModel extends baseModel {
_id: id
});
}
-
+
up(id, data) {
data.up_time = yapi.commons.time();
return this.model.update({
@@ -95,4 +96,4 @@ class interfaceModel extends baseModel {
}
}
-module.exports = interfaceModel;
\ No newline at end of file
+module.exports = interfaceModel;
diff --git a/server/models/project.js b/server/models/project.js
index d1bb9c09..d55a9c41 100644
--- a/server/models/project.js
+++ b/server/models/project.js
@@ -140,6 +140,14 @@ class projectModel extends baseModel {
})
.limit(10);
}
+
+ download(id) {
+ console.log('models in download');
+ // return this.model.find({
+ // name: new RegExp(id, 'ig')
+ // })
+ // .limit(10);
+ }
}
-module.exports = projectModel;
\ No newline at end of file
+module.exports = projectModel;
diff --git a/server/router.js b/server/router.js
index 22101b63..0aebdb98 100644
--- a/server/router.js
+++ b/server/router.js
@@ -7,6 +7,7 @@ import interfaceColController from './controllers/interfaceCol.js'
import yapi from './yapi.js';
import projectController from './controllers/project.js';
import logController from './controllers/log.js';
+import followController from './controllers/follow.js';
const router = koaRouter();
@@ -39,6 +40,10 @@ const INTERFACE_CONFIG = {
prefix: '/log/',
controller: logController
},
+ follow: {
+ prefix: '/follow/',
+ controller: followController
+ },
col: {
prefix: '/col/',
controller: interfaceColController
@@ -47,99 +52,99 @@ const INTERFACE_CONFIG = {
const routerConfig = {
"group": [
- {
+ {
"action": "list",
"path": "list",
"method": "get"
},
- {
+ {
"action": "add",
"path": "add",
"method": "post"
},
- {
+ {
"action": "up",
"path": "up",
"method": "post"
},
- {
+ {
"action": "del",
"path": "del",
"method": "post"
},
- {
+ {
"action": "addMember",
"path": "add_member",
"method": "post"
},
- {
+ {
"action": "delMember",
"path": "del_member",
"method": "post"
},
- {
+ {
"action": "getMemberList",
"path": "members",
"method": "get"
}
],
"user": [
- {
+ {
"action": "login",
"path": "login",
"method": "post"
},
- {
+ {
"action": "reg",
"path": "reg",
"method": "post"
},
- {
+ {
"action": "list",
"path": "list",
"method": "get"
},
- {
+ {
"action": "findById",
"path": "find",
"method": "get"
},
- {
+ {
"action": "update",
"path": "update",
"method": "post"
},
- {
+ {
"action": "del",
"path": "del",
"method": "post"
},
- {
+ {
"action": "getLoginStatus",
"path": "status",
"method": "get"
},
- {
+ {
"action": "logout",
"path": "logout",
"method": "get"
},
- {
+ {
"action": "loginByToken",
"path": "login_by_token",
"method": "post"
},
- {
+ {
"action": "changePassword",
"path": "change_password",
"method": "post"
},
- {
+ {
"action": "search",
"path": "search",
"method": "get"
},
- {
+ {
"action": "nav",
"path": "nav",
"method": "get"
@@ -154,69 +159,74 @@ const routerConfig = {
}
],
"project": [
- {
+ {
"action": "add",
"path": "add",
"method": "post"
},
- {
+ {
"action": "list",
"path": "list",
"method": "get"
},
- {
+ {
"action": "get",
"path": "get",
"method": "get"
},
- {
+ {
"action": "up",
"path": "up",
"method": "post"
},
- {
+ {
"action": "del",
"path": "del",
"method": "post"
},
- {
+ {
"action": "addMember",
"path": "add_member",
"method": "post"
},
- {
+ {
"action": "delMember",
"path": "del_member",
"method": "post"
},
- {
+ {
"action": "getMemberList",
"path": "get_member_list",
"method": "get"
},
- {
+ {
"action": "search",
"path": "search",
"method": "get"
+ },
+ {
+ "action": "download",
+ "path": "download",
+ "method": "get"
}
],
"interface": [
- {
+ {
"action": "add",
"path": "add",
"method": "post"
},
- {
+ {
"action": "list",
"path": "list",
"method": "get"
},
- {
+ {
"action": "get",
"path": "get",
"method": "get"
},
- {
+ {
"action": "up",
"path": "up",
"method": "post"
@@ -234,6 +244,19 @@ const routerConfig = {
"method": "get"
}
],
+ "follow": [{
+ "action": "list",
+ "path": "list",
+ "method": "get"
+ },{
+ "action": "add",
+ "path": "add",
+ "method": "post"
+ },{
+ "action": "del",
+ "path": "del",
+ "method": "post"
+ }],
"col": [{
action: "addCol",
path: "add_col",
@@ -279,7 +302,7 @@ for(let ctrl in routerConfig){
actions.forEach( (item) => {
createAction(ctrl, item.action, item.path, item.method);
} )
-}
+}
/**
*
@@ -302,4 +325,4 @@ function createAction(controller, action, path, method) {
});
}
-module.exports = router;
\ No newline at end of file
+module.exports = router;
diff --git a/server_dist/controllers/follow.js b/server_dist/controllers/follow.js
new file mode 100644
index 00000000..ab936225
--- /dev/null
+++ b/server_dist/controllers/follow.js
@@ -0,0 +1,299 @@
+'use strict';
+
+var _regenerator = require('babel-runtime/regenerator');
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
+
+var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
+
+var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
+
+var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
+
+var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
+
+var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
+
+var _createClass2 = require('babel-runtime/helpers/createClass');
+
+var _createClass3 = _interopRequireDefault(_createClass2);
+
+var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
+
+var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
+
+var _inherits2 = require('babel-runtime/helpers/inherits');
+
+var _inherits3 = _interopRequireDefault(_inherits2);
+
+var _yapi = require('../yapi.js');
+
+var _yapi2 = _interopRequireDefault(_yapi);
+
+var _base = require('./base.js');
+
+var _base2 = _interopRequireDefault(_base);
+
+var _follow = require('../models/follow');
+
+var _follow2 = _interopRequireDefault(_follow);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var followController = function (_baseController) {
+ (0, _inherits3.default)(followController, _baseController);
+
+ function followController(ctx) {
+ (0, _classCallCheck3.default)(this, followController);
+
+ var _this = (0, _possibleConstructorReturn3.default)(this, (followController.__proto__ || (0, _getPrototypeOf2.default)(followController)).call(this, ctx));
+
+ _this.Model = _yapi2.default.getInst(_follow2.default);
+ // try{
+ // var res = this.Model.save({
+ // uid: 107,
+ // projectid: 221,
+ // projectname: 'Flight',
+ // icon: 'code'
+ // });
+ // // var res = this.Model.del(107);
+ // ctx.body = yapi.commons.resReturn(null, 200,res);
+ // }catch(err){
+ // ctx.body = yapi.commons.resReturn(null, 402, err.message);
+ // }
+
+
+ return _this;
+ }
+
+ /**
+ * 获取节点列表
+ * @interface /node/list
+ * @method GET
+ * @category node
+ * @foldnumber 10
+ * @param {Number} uid 用户id, 不能为空
+ * @param {Number} [page] 分页页码
+ * @param {Number} [limit] 分页大小
+ * @returns {Object}
+ * @example ./api/project/list.json
+ */
+
+ (0, _createClass3.default)(followController, [{
+ key: 'list',
+ value: function () {
+ var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(ctx) {
+ var uid, page, limit, result, count;
+ return _regenerator2.default.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ uid = ctx.request.query.uid, page = ctx.request.query.page || 1, limit = ctx.request.query.limit || 10;
+
+ if (uid) {
+ _context.next = 3;
+ break;
+ }
+
+ return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '用户id不能为空'));
+
+ case 3:
+ _context.prev = 3;
+ _context.next = 6;
+ return this.Model.listWithPaging(uid, page, limit);
+
+ case 6:
+ result = _context.sent;
+ _context.next = 9;
+ return this.Model.listCount(uid);
+
+ case 9:
+ count = _context.sent;
+
+
+ ctx.body = _yapi2.default.commons.resReturn({
+ total: Math.ceil(count / limit),
+ list: result
+ });
+ _context.next = 16;
+ break;
+
+ case 13:
+ _context.prev = 13;
+ _context.t0 = _context['catch'](3);
+
+ ctx.body = _yapi2.default.commons.resReturn(null, 402, _context.t0.message);
+
+ case 16:
+ case 'end':
+ return _context.stop();
+ }
+ }
+ }, _callee, this, [[3, 13]]);
+ }));
+
+ function list(_x) {
+ return _ref.apply(this, arguments);
+ }
+
+ return list;
+ }()
+ }, {
+ key: 'del',
+ value: function () {
+ var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(ctx) {
+ var params, result;
+ return _regenerator2.default.wrap(function _callee2$(_context2) {
+ while (1) {
+ switch (_context2.prev = _context2.next) {
+ case 0:
+ params = ctx.request.body;
+
+ if (!params.followid) {
+ _context2.next = 3;
+ break;
+ }
+
+ return _context2.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '关注id不能为空'));
+
+ case 3:
+ _context2.prev = 3;
+ _context2.next = 6;
+ return this.Model.del(params.id);
+
+ case 6:
+ result = _context2.sent;
+
+ ctx.body = _yapi2.default.commons.resReturn(result);
+ _context2.next = 13;
+ break;
+
+ case 10:
+ _context2.prev = 10;
+ _context2.t0 = _context2['catch'](3);
+
+ ctx.body = _yapi2.default.commons.resReturn(null, 402, _context2.t0.message);
+
+ case 13:
+ case 'end':
+ return _context2.stop();
+ }
+ }
+ }, _callee2, this, [[3, 10]]);
+ }));
+
+ function del(_x2) {
+ return _ref2.apply(this, arguments);
+ }
+
+ return del;
+ }()
+ }, {
+ key: 'add',
+ value: function () {
+ var _ref3 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3(ctx) {
+ var params, checkRepeat, data, result;
+ return _regenerator2.default.wrap(function _callee3$(_context3) {
+ while (1) {
+ switch (_context3.prev = _context3.next) {
+ case 0:
+ params = ctx.request.body;
+
+ params = _yapi2.default.commons.handleParams(params, {
+ uid: 'number',
+ projectid: 'number',
+ projectname: 'string',
+ icon: 'string'
+ });
+
+ if (params.uid) {
+ _context3.next = 4;
+ break;
+ }
+
+ return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '用户id不为空'));
+
+ case 4:
+ if (params.projectid) {
+ _context3.next = 6;
+ break;
+ }
+
+ return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目id不能为空'));
+
+ case 6:
+ _context3.next = 8;
+ return this.Model.checkProjectRepeat(params.uid, params.projectid);
+
+ case 8:
+ checkRepeat = _context3.sent;
+
+ if (!checkRepeat) {
+ _context3.next = 11;
+ break;
+ }
+
+ return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 401, '项目已关注'));
+
+ case 11:
+ if (params.projectname) {
+ _context3.next = 13;
+ break;
+ }
+
+ return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目名不能为空'));
+
+ case 13:
+ if (params.icon) {
+ _context3.next = 15;
+ break;
+ }
+
+ return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目图标标志不能为空'));
+
+ case 15:
+ data = {
+ uid: params.uid,
+ projectid: params.projectid,
+ projectname: params.projectname,
+ icon: params.icon
+ };
+ _context3.prev = 16;
+ _context3.next = 19;
+ return this.Model.save(data);
+
+ case 19:
+ result = _context3.sent;
+
+ result = _yapi2.default.commons.fieldSelect(result, ['_id', 'uid', 'projectid', 'projectname', 'icon']);
+ ctx.body = _yapi2.default.commons.resReturn(result);
+ _context3.next = 27;
+ break;
+
+ case 24:
+ _context3.prev = 24;
+ _context3.t0 = _context3['catch'](16);
+
+ ctx.body = _yapi2.default.commons.resReturn(null, 402, _context3.t0.message);
+
+ case 27:
+ case 'end':
+ return _context3.stop();
+ }
+ }
+ }, _callee3, this, [[16, 24]]);
+ }));
+
+ function add(_x3) {
+ return _ref3.apply(this, arguments);
+ }
+
+ return add;
+ }()
+ }]);
+ return followController;
+}(_base2.default);
+
+module.exports = followController;
\ No newline at end of file
diff --git a/server_dist/controllers/log.js b/server_dist/controllers/log.js
index 4b252aae..caecf1ff 100644
--- a/server_dist/controllers/log.js
+++ b/server_dist/controllers/log.js
@@ -103,7 +103,7 @@ var logController = function (_baseController) {
break;
}
- return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目id不能为空'));
+ return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, 'typeid不能为空'));
case 3:
_context.prev = 3;
diff --git a/server_dist/controllers/project.js b/server_dist/controllers/project.js
index 90224dd1..5a575fc0 100644
--- a/server_dist/controllers/project.js
+++ b/server_dist/controllers/project.js
@@ -1,5 +1,9 @@
'use strict';
+var _stringify = require('babel-runtime/core-js/json/stringify');
+
+var _stringify2 = _interopRequireDefault(_stringify);
+
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
@@ -56,8 +60,14 @@ var _user = require('../models/user.js');
var _user2 = _interopRequireDefault(_user);
+var _mockjs = require('mockjs');
+
+var _mockjs2 = _interopRequireDefault(_mockjs);
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var send = require('koa-send');
+
var projectController = function (_baseController) {
(0, _inherits3.default)(projectController, _baseController);
@@ -1161,6 +1171,68 @@ var projectController = function (_baseController) {
return search;
}()
+
+ /**
+ * 下载项目的 Mock 数据
+ * @interface /project/download
+ * @method GET
+ * @category project
+ * @foldnumber 10
+ * @param {String} project_id
+ */
+
+ }, {
+ key: 'download',
+ value: function () {
+ var _ref12 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee12(ctx) {
+ var project_id, interfaceInst, count, arr, fileName, res;
+ return _regenerator2.default.wrap(function _callee12$(_context12) {
+ while (1) {
+ switch (_context12.prev = _context12.next) {
+ case 0:
+ project_id = ctx.request.query.project_id;
+ interfaceInst = _yapi2.default.getInst(_interface2.default);
+ _context12.next = 4;
+ return interfaceInst.list(project_id);
+
+ case 4:
+ count = _context12.sent;
+
+ console.log(count);
+ arr = (0, _stringify2.default)(count.map(function (item) {
+ // 返回的json模板数据: item.res_body
+ var mockData = _mockjs2.default.mock(_yapi2.default.commons.json_parse(item.res_body));
+ return {
+ path: item.path,
+ mock: mockData
+ };
+ }));
+ // console.log(arr);
+
+ fileName = 'mock.js';
+
+ ctx.attachment(fileName);
+ _context12.next = 11;
+ return send(ctx, fileName, { root: __dirname + '/public' });
+
+ case 11:
+ res = ('\n var data = ' + arr).trim();
+ return _context12.abrupt('return', ctx.body = res);
+
+ case 13:
+ case 'end':
+ return _context12.stop();
+ }
+ }
+ }, _callee12, this);
+ }));
+
+ function download(_x13) {
+ return _ref12.apply(this, arguments);
+ }
+
+ return download;
+ }()
}]);
return projectController;
}(_base2.default);
diff --git a/server_dist/middleware/mockServer.js b/server_dist/middleware/mockServer.js
index e527eef5..2ee0428d 100644
--- a/server_dist/middleware/mockServer.js
+++ b/server_dist/middleware/mockServer.js
@@ -28,7 +28,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
module.exports = function () {
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(ctx, next) {
- var hostname, config, projectInst, projects, matchProject, maxBasepath, i, l, _project, project, interfaceData, interfaceInst;
+ var hostname, config, projectInst, projects, matchProject, maxBasepath, i, l, _project, project, interfaceData, interfaceInst, res;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
@@ -138,15 +138,16 @@ module.exports = function () {
ctx.set("Access-Control-Allow-Origin", "*");
if (!(interfaceData.res_body_type === 'json')) {
- _context.next = 47;
+ _context.next = 48;
break;
}
_context.prev = 40;
- return _context.abrupt('return', ctx.body = _mockjs2.default.mock(_yapi2.default.commons.json_parse(interfaceData.res_body)));
+ res = _mockjs2.default.mock(_yapi2.default.commons.json_parse(interfaceData.res_body));
+ return _context.abrupt('return', ctx.body = res);
- case 44:
- _context.prev = 44;
+ case 45:
+ _context.prev = 45;
_context.t1 = _context['catch'](40);
return _context.abrupt('return', ctx.body = {
errcode: 400,
@@ -154,20 +155,20 @@ module.exports = function () {
data: interfaceData.res_body
});
- case 47:
+ case 48:
return _context.abrupt('return', ctx.body = interfaceData.res_body);
- case 50:
- _context.prev = 50;
+ case 51:
+ _context.prev = 51;
_context.t2 = _context['catch'](25);
return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 409, _context.t2.message));
- case 53:
+ case 54:
case 'end':
return _context.stop();
}
}
- }, _callee, undefined, [[10, 16], [25, 50], [40, 44]]);
+ }, _callee, undefined, [[10, 16], [25, 51], [40, 45]]);
}));
return function (_x, _x2) {
diff --git a/server_dist/models/follow.js b/server_dist/models/follow.js
new file mode 100644
index 00000000..343250f4
--- /dev/null
+++ b/server_dist/models/follow.js
@@ -0,0 +1,109 @@
+'use strict';
+
+var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
+
+var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
+
+var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
+
+var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
+
+var _createClass2 = require('babel-runtime/helpers/createClass');
+
+var _createClass3 = _interopRequireDefault(_createClass2);
+
+var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
+
+var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
+
+var _inherits2 = require('babel-runtime/helpers/inherits');
+
+var _inherits3 = _interopRequireDefault(_inherits2);
+
+var _base = require('./base.js');
+
+var _base2 = _interopRequireDefault(_base);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var followModel = function (_baseModel) {
+ (0, _inherits3.default)(followModel, _baseModel);
+
+ function followModel() {
+ (0, _classCallCheck3.default)(this, followModel);
+ return (0, _possibleConstructorReturn3.default)(this, (followModel.__proto__ || (0, _getPrototypeOf2.default)(followModel)).apply(this, arguments));
+ }
+
+ (0, _createClass3.default)(followModel, [{
+ key: 'getName',
+ value: function getName() {
+ return 'follow';
+ }
+ }, {
+ key: 'getSchema',
+ value: function getSchema() {
+ return {
+ uid: { type: Number, required: true },
+ projectid: { type: Number, required: true },
+ projectname: { type: String, required: true },
+ icon: String
+ };
+ }
+
+ /**
+ * @param {Number} uid 用户id
+ * @param {Number} projectid 项目id
+ * @param {String} projectname 项目名
+ * @param {String} icon 项目图标
+ */
+
+ }, {
+ key: 'save',
+ value: function save(data) {
+ //关注
+ var saveData = {
+ uid: data.uid,
+ projectid: data.projectid,
+ projectname: data.projectname,
+ icon: data.icon
+ };
+ var follow = new this.model(saveData);
+ return follow.save();
+ }
+ }, {
+ key: 'del',
+ value: function del(id) {
+ return this.model.deleteOne({
+ _id: id
+ });
+ }
+ }, {
+ key: 'listWithPaging',
+ value: function listWithPaging(uid, page, limit) {
+ page = parseInt(page);
+ limit = parseInt(limit);
+
+ return this.model.find({
+ uid: uid
+ }).skip((page - 1) * limit).limit(limit).exec();
+ }
+ }, {
+ key: 'listCount',
+ value: function listCount(uid) {
+ return this.model.count({
+ uid: uid
+ });
+ }
+ }, {
+ key: 'checkProjectRepeat',
+ value: function checkProjectRepeat(uid, projectid) {
+ return this.model.count({
+ uid: uid,
+ projectid: projectid
+ });
+ }
+ }]);
+ return followModel;
+}(_base2.default);
+
+module.exports = followModel;
\ No newline at end of file
diff --git a/server_dist/models/interface.js b/server_dist/models/interface.js
index d51903dd..7caef0e3 100644
--- a/server_dist/models/interface.js
+++ b/server_dist/models/interface.js
@@ -117,6 +117,7 @@ var interfaceModel = function (_baseModel) {
}, {
key: 'list',
value: function list(project_id) {
+ console.log(project_id);
return this.model.find({
project_id: project_id
}).sort({ _id: -1 }).exec();
diff --git a/server_dist/models/project.js b/server_dist/models/project.js
index 2b4ff24d..b9b4988d 100644
--- a/server_dist/models/project.js
+++ b/server_dist/models/project.js
@@ -184,6 +184,15 @@ var projectModel = function (_baseModel) {
name: new RegExp(keyword, 'ig')
}).limit(10);
}
+ }, {
+ key: 'download',
+ value: function download(id) {
+ console.log('models in download');
+ // return this.model.find({
+ // name: new RegExp(id, 'ig')
+ // })
+ // .limit(10);
+ }
}]);
return projectModel;
}(_base2.default);
diff --git a/server_dist/router.js b/server_dist/router.js
index b9771c57..3d8a53e9 100644
--- a/server_dist/router.js
+++ b/server_dist/router.js
@@ -40,6 +40,10 @@ var _log = require('./controllers/log.js');
var _log2 = _interopRequireDefault(_log);
+var _follow = require('./controllers/follow.js');
+
+var _follow2 = _interopRequireDefault(_follow);
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var router = (0, _koaRouter2.default)();
@@ -73,6 +77,10 @@ var INTERFACE_CONFIG = {
prefix: '/log/',
controller: _log2.default
},
+ follow: {
+ prefix: '/follow/',
+ controller: _follow2.default
+ },
col: {
prefix: '/col/',
controller: _interfaceCol2.default
@@ -202,6 +210,10 @@ var routerConfig = {
"action": "search",
"path": "search",
"method": "get"
+ }, {
+ "action": "download",
+ "path": "download",
+ "method": "get"
}],
"interface": [{
"action": "add",
@@ -229,6 +241,19 @@ var routerConfig = {
"path": "list",
"method": "get"
}],
+ "follow": [{
+ "action": "list",
+ "path": "list",
+ "method": "get"
+ }, {
+ "action": "add",
+ "path": "add",
+ "method": "post"
+ }, {
+ "action": "del",
+ "path": "del",
+ "method": "post"
+ }],
"col": [{
action: "addCol",
path: "add_col",