diff --git a/client/containers/Follows/Follows.js b/client/containers/Follows/Follows.js index 29ffe86f..7f35f4fc 100644 --- a/client/containers/Follows/Follows.js +++ b/client/containers/Follows/Follows.js @@ -1,11 +1,9 @@ import React, { Component } from 'react'; import './Follows.scss'; import Subnav from '../../components/Subnav/Subnav.js'; -console.log('js in'); class Follows extends Component { render () { - console.log('render'); return (
{ @@ -33,11 +34,8 @@ class News extends Component { componentWillMount(){ const that = this; this.props.getMockUrl(2724).then(function(data){ - const { prd_host, basepath, protocol } = data.payload.data.data; - const mockURL = `${protocol}://${prd_host}${basepath}/{path}`; - console.log(data.payload.data.data); that.setState({ mockURL: mockURL }) @@ -45,17 +43,33 @@ class News extends Component { } render () { return ( -
-
- -
- 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",