diff --git a/mock/index.js b/mock/index.js index 9eb5a47..0e41bf6 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,9 +1,27 @@ import Mock from 'mockjs' -import userAPI from './user' -import tableAPI from './table' -// Fix an issue with setting withCredentials = true, cross-domain request lost cookies -// https://github.com/nuysoft/Mock/issues/300 +import user from './system/user' +import resource from './system/resource' +import dict from './system/dict' +import dept from './system/dept' +import area from './system/area' +import role from './system/role' +import log from './system/log' +import config from './system/config' +import search from './remote-search' + +const mocks = [ + ...user, + ...resource, + ...dict, + ...area, + ...dept, + ...role, + ...log, + ...config, + ...search +] + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { @@ -11,16 +29,13 @@ } this.proxy_send(...arguments) } -// Mock.setup({ -// timeout: '350-600' -// }) +Mock.setup({ + timeout: '350-600' +}) -// User -Mock.mock(/\/user\/login/, 'post', userAPI.login) -Mock.mock(/\/user\/info/, 'get', userAPI.getInfo) -Mock.mock(/\/user\/logout/, 'post', userAPI.logout) - -// Table -Mock.mock(/\/table\/list/, 'get', tableAPI.list) +for (const i of mocks) { + console.log(i) + Mock.mock(new RegExp(i.url), i.type || 'get', i.response) +} export default Mock diff --git a/mock/index.js b/mock/index.js index 9eb5a47..0e41bf6 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,9 +1,27 @@ import Mock from 'mockjs' -import userAPI from './user' -import tableAPI from './table' -// Fix an issue with setting withCredentials = true, cross-domain request lost cookies -// https://github.com/nuysoft/Mock/issues/300 +import user from './system/user' +import resource from './system/resource' +import dict from './system/dict' +import dept from './system/dept' +import area from './system/area' +import role from './system/role' +import log from './system/log' +import config from './system/config' +import search from './remote-search' + +const mocks = [ + ...user, + ...resource, + ...dict, + ...area, + ...dept, + ...role, + ...log, + ...config, + ...search +] + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { @@ -11,16 +29,13 @@ } this.proxy_send(...arguments) } -// Mock.setup({ -// timeout: '350-600' -// }) +Mock.setup({ + timeout: '350-600' +}) -// User -Mock.mock(/\/user\/login/, 'post', userAPI.login) -Mock.mock(/\/user\/info/, 'get', userAPI.getInfo) -Mock.mock(/\/user\/logout/, 'post', userAPI.logout) - -// Table -Mock.mock(/\/table\/list/, 'get', tableAPI.list) +for (const i of mocks) { + console.log(i) + Mock.mock(new RegExp(i.url), i.type || 'get', i.response) +} export default Mock diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..4c4cb2a --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,68 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocks).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/index.js b/mock/index.js index 9eb5a47..0e41bf6 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,9 +1,27 @@ import Mock from 'mockjs' -import userAPI from './user' -import tableAPI from './table' -// Fix an issue with setting withCredentials = true, cross-domain request lost cookies -// https://github.com/nuysoft/Mock/issues/300 +import user from './system/user' +import resource from './system/resource' +import dict from './system/dict' +import dept from './system/dept' +import area from './system/area' +import role from './system/role' +import log from './system/log' +import config from './system/config' +import search from './remote-search' + +const mocks = [ + ...user, + ...resource, + ...dict, + ...area, + ...dept, + ...role, + ...log, + ...config, + ...search +] + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { @@ -11,16 +29,13 @@ } this.proxy_send(...arguments) } -// Mock.setup({ -// timeout: '350-600' -// }) +Mock.setup({ + timeout: '350-600' +}) -// User -Mock.mock(/\/user\/login/, 'post', userAPI.login) -Mock.mock(/\/user\/info/, 'get', userAPI.getInfo) -Mock.mock(/\/user\/logout/, 'post', userAPI.logout) - -// Table -Mock.mock(/\/table\/list/, 'get', tableAPI.list) +for (const i of mocks) { + console.log(i) + Mock.mock(new RegExp(i.url), i.type || 'get', i.response) +} export default Mock diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..4c4cb2a --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,68 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocks).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/remote-search.js b/mock/remote-search.js new file mode 100644 index 0000000..bb33c2f --- /dev/null +++ b/mock/remote-search.js @@ -0,0 +1,51 @@ +import Mock from 'mockjs' + +const NameList = [] +const count = 100 + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })) +} +NameList.push({ name: 'mock-Pan' }) + +export default [ + // username search + { + url: '/search/user', + type: 'get', + response: config => { + const { name } = config.query + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) + }) + return { + code: 20000, + data: { items: mockNameList } + } + } + }, + + // transaction list + { + url: '/transaction/list', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + total: 20, + 'items|20': [{ + order_no: '@guid()', + timestamp: +Mock.Random.date('T'), + username: '@name()', + price: '@float(1000, 15000, 0, 2)', + 'status|1': ['success', 'pending'] + }] + } + } + } + } +] diff --git a/mock/index.js b/mock/index.js index 9eb5a47..0e41bf6 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,9 +1,27 @@ import Mock from 'mockjs' -import userAPI from './user' -import tableAPI from './table' -// Fix an issue with setting withCredentials = true, cross-domain request lost cookies -// https://github.com/nuysoft/Mock/issues/300 +import user from './system/user' +import resource from './system/resource' +import dict from './system/dict' +import dept from './system/dept' +import area from './system/area' +import role from './system/role' +import log from './system/log' +import config from './system/config' +import search from './remote-search' + +const mocks = [ + ...user, + ...resource, + ...dict, + ...area, + ...dept, + ...role, + ...log, + ...config, + ...search +] + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { @@ -11,16 +29,13 @@ } this.proxy_send(...arguments) } -// Mock.setup({ -// timeout: '350-600' -// }) +Mock.setup({ + timeout: '350-600' +}) -// User -Mock.mock(/\/user\/login/, 'post', userAPI.login) -Mock.mock(/\/user\/info/, 'get', userAPI.getInfo) -Mock.mock(/\/user\/logout/, 'post', userAPI.logout) - -// Table -Mock.mock(/\/table\/list/, 'get', tableAPI.list) +for (const i of mocks) { + console.log(i) + Mock.mock(new RegExp(i.url), i.type || 'get', i.response) +} export default Mock diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..4c4cb2a --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,68 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocks).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/remote-search.js b/mock/remote-search.js new file mode 100644 index 0000000..bb33c2f --- /dev/null +++ b/mock/remote-search.js @@ -0,0 +1,51 @@ +import Mock from 'mockjs' + +const NameList = [] +const count = 100 + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })) +} +NameList.push({ name: 'mock-Pan' }) + +export default [ + // username search + { + url: '/search/user', + type: 'get', + response: config => { + const { name } = config.query + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) + }) + return { + code: 20000, + data: { items: mockNameList } + } + } + }, + + // transaction list + { + url: '/transaction/list', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + total: 20, + 'items|20': [{ + order_no: '@guid()', + timestamp: +Mock.Random.date('T'), + username: '@name()', + price: '@float(1000, 15000, 0, 2)', + 'status|1': ['success', 'pending'] + }] + } + } + } + } +] diff --git a/mock/system/area.js b/mock/system/area.js new file mode 100644 index 0000000..3495001 --- /dev/null +++ b/mock/system/area.js @@ -0,0 +1,83 @@ +const list = [ + { + 'id': '11010100102', + 'lat': '', + 'level': 5, + 'levelName': '社区', + 'lng': '', + 'name': '测试社区3', + 'num': 1, + 'pid': '110101001', + 'pids': '[0],[110000],[110100],[110101],[110101001],', + 'simplename': '测试社区2' + } +] +export default [ + // mock get all routes form server + { + url: '/area/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/area/list', + type: 'get', + response: _ => { + return { + code: 200, + data: [ + { + 'id': '110000', + 'pid': '0', + 'name': '北京市', + 'level': 1, + 'pids': [0], + 'levelName': '省级', + 'simplename': '北京' + } + ] + } + } + }, + { + url: '/area/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/index.js b/mock/index.js index 9eb5a47..0e41bf6 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,9 +1,27 @@ import Mock from 'mockjs' -import userAPI from './user' -import tableAPI from './table' -// Fix an issue with setting withCredentials = true, cross-domain request lost cookies -// https://github.com/nuysoft/Mock/issues/300 +import user from './system/user' +import resource from './system/resource' +import dict from './system/dict' +import dept from './system/dept' +import area from './system/area' +import role from './system/role' +import log from './system/log' +import config from './system/config' +import search from './remote-search' + +const mocks = [ + ...user, + ...resource, + ...dict, + ...area, + ...dept, + ...role, + ...log, + ...config, + ...search +] + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { @@ -11,16 +29,13 @@ } this.proxy_send(...arguments) } -// Mock.setup({ -// timeout: '350-600' -// }) +Mock.setup({ + timeout: '350-600' +}) -// User -Mock.mock(/\/user\/login/, 'post', userAPI.login) -Mock.mock(/\/user\/info/, 'get', userAPI.getInfo) -Mock.mock(/\/user\/logout/, 'post', userAPI.logout) - -// Table -Mock.mock(/\/table\/list/, 'get', tableAPI.list) +for (const i of mocks) { + console.log(i) + Mock.mock(new RegExp(i.url), i.type || 'get', i.response) +} export default Mock diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..4c4cb2a --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,68 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocks).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/remote-search.js b/mock/remote-search.js new file mode 100644 index 0000000..bb33c2f --- /dev/null +++ b/mock/remote-search.js @@ -0,0 +1,51 @@ +import Mock from 'mockjs' + +const NameList = [] +const count = 100 + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })) +} +NameList.push({ name: 'mock-Pan' }) + +export default [ + // username search + { + url: '/search/user', + type: 'get', + response: config => { + const { name } = config.query + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) + }) + return { + code: 20000, + data: { items: mockNameList } + } + } + }, + + // transaction list + { + url: '/transaction/list', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + total: 20, + 'items|20': [{ + order_no: '@guid()', + timestamp: +Mock.Random.date('T'), + username: '@name()', + price: '@float(1000, 15000, 0, 2)', + 'status|1': ['success', 'pending'] + }] + } + } + } + } +] diff --git a/mock/system/area.js b/mock/system/area.js new file mode 100644 index 0000000..3495001 --- /dev/null +++ b/mock/system/area.js @@ -0,0 +1,83 @@ +const list = [ + { + 'id': '11010100102', + 'lat': '', + 'level': 5, + 'levelName': '社区', + 'lng': '', + 'name': '测试社区3', + 'num': 1, + 'pid': '110101001', + 'pids': '[0],[110000],[110100],[110101],[110101001],', + 'simplename': '测试社区2' + } +] +export default [ + // mock get all routes form server + { + url: '/area/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/area/list', + type: 'get', + response: _ => { + return { + code: 200, + data: [ + { + 'id': '110000', + 'pid': '0', + 'name': '北京市', + 'level': 1, + 'pids': [0], + 'levelName': '省级', + 'simplename': '北京' + } + ] + } + } + }, + { + url: '/area/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/config.js b/mock/system/config.js new file mode 100644 index 0000000..ab64c0a --- /dev/null +++ b/mock/system/config.js @@ -0,0 +1,18 @@ +export default [ + { + url: '/config/baseConfig', + type: 'get', + response: _ => { + return { + 'code': 200, + 'data': { + 'kaptcha': false, + 'publicKey': 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu5k8gcTFJy5UtMfmtKiR3f/EcUe93kzfteRj6+sM5fHRvOib82+uqQMjgaRZiMcr3HiHIFY5vA6c+Rfb5R2COitoOhxyA9U2eLXknzxLUQIAqXAvKQO8KnerA1Qjcds7xhJB2XPhWFlY4RVtMT2wr2lMd29QDE4F/kzyDhNBpxwIDAQAB', + 'sid': 'f390b7d7-337b-431b-be22-fb860a6c04d4' + }, + 'message': '请求成功', + 'success': true + } + } + } +] diff --git a/mock/index.js b/mock/index.js index 9eb5a47..0e41bf6 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,9 +1,27 @@ import Mock from 'mockjs' -import userAPI from './user' -import tableAPI from './table' -// Fix an issue with setting withCredentials = true, cross-domain request lost cookies -// https://github.com/nuysoft/Mock/issues/300 +import user from './system/user' +import resource from './system/resource' +import dict from './system/dict' +import dept from './system/dept' +import area from './system/area' +import role from './system/role' +import log from './system/log' +import config from './system/config' +import search from './remote-search' + +const mocks = [ + ...user, + ...resource, + ...dict, + ...area, + ...dept, + ...role, + ...log, + ...config, + ...search +] + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { @@ -11,16 +29,13 @@ } this.proxy_send(...arguments) } -// Mock.setup({ -// timeout: '350-600' -// }) +Mock.setup({ + timeout: '350-600' +}) -// User -Mock.mock(/\/user\/login/, 'post', userAPI.login) -Mock.mock(/\/user\/info/, 'get', userAPI.getInfo) -Mock.mock(/\/user\/logout/, 'post', userAPI.logout) - -// Table -Mock.mock(/\/table\/list/, 'get', tableAPI.list) +for (const i of mocks) { + console.log(i) + Mock.mock(new RegExp(i.url), i.type || 'get', i.response) +} export default Mock diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..4c4cb2a --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,68 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocks).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/remote-search.js b/mock/remote-search.js new file mode 100644 index 0000000..bb33c2f --- /dev/null +++ b/mock/remote-search.js @@ -0,0 +1,51 @@ +import Mock from 'mockjs' + +const NameList = [] +const count = 100 + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })) +} +NameList.push({ name: 'mock-Pan' }) + +export default [ + // username search + { + url: '/search/user', + type: 'get', + response: config => { + const { name } = config.query + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) + }) + return { + code: 20000, + data: { items: mockNameList } + } + } + }, + + // transaction list + { + url: '/transaction/list', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + total: 20, + 'items|20': [{ + order_no: '@guid()', + timestamp: +Mock.Random.date('T'), + username: '@name()', + price: '@float(1000, 15000, 0, 2)', + 'status|1': ['success', 'pending'] + }] + } + } + } + } +] diff --git a/mock/system/area.js b/mock/system/area.js new file mode 100644 index 0000000..3495001 --- /dev/null +++ b/mock/system/area.js @@ -0,0 +1,83 @@ +const list = [ + { + 'id': '11010100102', + 'lat': '', + 'level': 5, + 'levelName': '社区', + 'lng': '', + 'name': '测试社区3', + 'num': 1, + 'pid': '110101001', + 'pids': '[0],[110000],[110100],[110101],[110101001],', + 'simplename': '测试社区2' + } +] +export default [ + // mock get all routes form server + { + url: '/area/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/area/list', + type: 'get', + response: _ => { + return { + code: 200, + data: [ + { + 'id': '110000', + 'pid': '0', + 'name': '北京市', + 'level': 1, + 'pids': [0], + 'levelName': '省级', + 'simplename': '北京' + } + ] + } + } + }, + { + url: '/area/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/config.js b/mock/system/config.js new file mode 100644 index 0000000..ab64c0a --- /dev/null +++ b/mock/system/config.js @@ -0,0 +1,18 @@ +export default [ + { + url: '/config/baseConfig', + type: 'get', + response: _ => { + return { + 'code': 200, + 'data': { + 'kaptcha': false, + 'publicKey': 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu5k8gcTFJy5UtMfmtKiR3f/EcUe93kzfteRj6+sM5fHRvOib82+uqQMjgaRZiMcr3HiHIFY5vA6c+Rfb5R2COitoOhxyA9U2eLXknzxLUQIAqXAvKQO8KnerA1Qjcds7xhJB2XPhWFlY4RVtMT2wr2lMd29QDE4F/kzyDhNBpxwIDAQAB', + 'sid': 'f390b7d7-337b-431b-be22-fb860a6c04d4' + }, + 'message': '请求成功', + 'success': true + } + } + } +] diff --git a/mock/system/dept.js b/mock/system/dept.js new file mode 100644 index 0000000..30675b9 --- /dev/null +++ b/mock/system/dept.js @@ -0,0 +1,88 @@ +const list = [ + { + 'id': '1', + 'simplename': '二分公司', + 'fullname': '二分公司', + 'num': 1, + 'pid': '0', + 'pids': '[0,1,2]', + 'pName': '顶级', + 'version': '', + 'tips': '' + } +] +export default [ + // mock get all routes form server + { + url: '/dept/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: list + } + } + } + }, + { + url: '/dept/tree', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: [ + { + 'id': '0', + 'pid': '', + 'name': '顶级', + 'open': 'false', + 'checked': '' + }, + { + 'id': '26', + 'pid': '24', + 'name': '运行二所', + 'open': 'false', + 'checked': '' + } + ] + } + } + } + }, + { + url: '/dept/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/index.js b/mock/index.js index 9eb5a47..0e41bf6 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,9 +1,27 @@ import Mock from 'mockjs' -import userAPI from './user' -import tableAPI from './table' -// Fix an issue with setting withCredentials = true, cross-domain request lost cookies -// https://github.com/nuysoft/Mock/issues/300 +import user from './system/user' +import resource from './system/resource' +import dict from './system/dict' +import dept from './system/dept' +import area from './system/area' +import role from './system/role' +import log from './system/log' +import config from './system/config' +import search from './remote-search' + +const mocks = [ + ...user, + ...resource, + ...dict, + ...area, + ...dept, + ...role, + ...log, + ...config, + ...search +] + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { @@ -11,16 +29,13 @@ } this.proxy_send(...arguments) } -// Mock.setup({ -// timeout: '350-600' -// }) +Mock.setup({ + timeout: '350-600' +}) -// User -Mock.mock(/\/user\/login/, 'post', userAPI.login) -Mock.mock(/\/user\/info/, 'get', userAPI.getInfo) -Mock.mock(/\/user\/logout/, 'post', userAPI.logout) - -// Table -Mock.mock(/\/table\/list/, 'get', tableAPI.list) +for (const i of mocks) { + console.log(i) + Mock.mock(new RegExp(i.url), i.type || 'get', i.response) +} export default Mock diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..4c4cb2a --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,68 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocks).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/remote-search.js b/mock/remote-search.js new file mode 100644 index 0000000..bb33c2f --- /dev/null +++ b/mock/remote-search.js @@ -0,0 +1,51 @@ +import Mock from 'mockjs' + +const NameList = [] +const count = 100 + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })) +} +NameList.push({ name: 'mock-Pan' }) + +export default [ + // username search + { + url: '/search/user', + type: 'get', + response: config => { + const { name } = config.query + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) + }) + return { + code: 20000, + data: { items: mockNameList } + } + } + }, + + // transaction list + { + url: '/transaction/list', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + total: 20, + 'items|20': [{ + order_no: '@guid()', + timestamp: +Mock.Random.date('T'), + username: '@name()', + price: '@float(1000, 15000, 0, 2)', + 'status|1': ['success', 'pending'] + }] + } + } + } + } +] diff --git a/mock/system/area.js b/mock/system/area.js new file mode 100644 index 0000000..3495001 --- /dev/null +++ b/mock/system/area.js @@ -0,0 +1,83 @@ +const list = [ + { + 'id': '11010100102', + 'lat': '', + 'level': 5, + 'levelName': '社区', + 'lng': '', + 'name': '测试社区3', + 'num': 1, + 'pid': '110101001', + 'pids': '[0],[110000],[110100],[110101],[110101001],', + 'simplename': '测试社区2' + } +] +export default [ + // mock get all routes form server + { + url: '/area/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/area/list', + type: 'get', + response: _ => { + return { + code: 200, + data: [ + { + 'id': '110000', + 'pid': '0', + 'name': '北京市', + 'level': 1, + 'pids': [0], + 'levelName': '省级', + 'simplename': '北京' + } + ] + } + } + }, + { + url: '/area/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/config.js b/mock/system/config.js new file mode 100644 index 0000000..ab64c0a --- /dev/null +++ b/mock/system/config.js @@ -0,0 +1,18 @@ +export default [ + { + url: '/config/baseConfig', + type: 'get', + response: _ => { + return { + 'code': 200, + 'data': { + 'kaptcha': false, + 'publicKey': 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu5k8gcTFJy5UtMfmtKiR3f/EcUe93kzfteRj6+sM5fHRvOib82+uqQMjgaRZiMcr3HiHIFY5vA6c+Rfb5R2COitoOhxyA9U2eLXknzxLUQIAqXAvKQO8KnerA1Qjcds7xhJB2XPhWFlY4RVtMT2wr2lMd29QDE4F/kzyDhNBpxwIDAQAB', + 'sid': 'f390b7d7-337b-431b-be22-fb860a6c04d4' + }, + 'message': '请求成功', + 'success': true + } + } + } +] diff --git a/mock/system/dept.js b/mock/system/dept.js new file mode 100644 index 0000000..30675b9 --- /dev/null +++ b/mock/system/dept.js @@ -0,0 +1,88 @@ +const list = [ + { + 'id': '1', + 'simplename': '二分公司', + 'fullname': '二分公司', + 'num': 1, + 'pid': '0', + 'pids': '[0,1,2]', + 'pName': '顶级', + 'version': '', + 'tips': '' + } +] +export default [ + // mock get all routes form server + { + url: '/dept/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: list + } + } + } + }, + { + url: '/dept/tree', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: [ + { + 'id': '0', + 'pid': '', + 'name': '顶级', + 'open': 'false', + 'checked': '' + }, + { + 'id': '26', + 'pid': '24', + 'name': '运行二所', + 'open': 'false', + 'checked': '' + } + ] + } + } + } + }, + { + url: '/dept/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/dict.js b/mock/system/dict.js new file mode 100644 index 0000000..75410dc --- /dev/null +++ b/mock/system/dict.js @@ -0,0 +1,69 @@ +const list = [ + { + 'code': 'sysStatus', + 'num': 0, + 'name': '状态', + 'pid': '0', + 'id': '16', + 'detail': '1:启用:1;2:禁用:2', + 'tips': '' + }, + { + 'code': 'sysSex', + 'num': 0, + 'name': '性别', + 'pid': '0', + 'id': '29', + 'detail': '1:男:1;2:女:2', + 'tips': '' + } +] +export default [ + // mock get all routes form server + { + url: '/dict/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/dict/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dict/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dict/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/index.js b/mock/index.js index 9eb5a47..0e41bf6 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,9 +1,27 @@ import Mock from 'mockjs' -import userAPI from './user' -import tableAPI from './table' -// Fix an issue with setting withCredentials = true, cross-domain request lost cookies -// https://github.com/nuysoft/Mock/issues/300 +import user from './system/user' +import resource from './system/resource' +import dict from './system/dict' +import dept from './system/dept' +import area from './system/area' +import role from './system/role' +import log from './system/log' +import config from './system/config' +import search from './remote-search' + +const mocks = [ + ...user, + ...resource, + ...dict, + ...area, + ...dept, + ...role, + ...log, + ...config, + ...search +] + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { @@ -11,16 +29,13 @@ } this.proxy_send(...arguments) } -// Mock.setup({ -// timeout: '350-600' -// }) +Mock.setup({ + timeout: '350-600' +}) -// User -Mock.mock(/\/user\/login/, 'post', userAPI.login) -Mock.mock(/\/user\/info/, 'get', userAPI.getInfo) -Mock.mock(/\/user\/logout/, 'post', userAPI.logout) - -// Table -Mock.mock(/\/table\/list/, 'get', tableAPI.list) +for (const i of mocks) { + console.log(i) + Mock.mock(new RegExp(i.url), i.type || 'get', i.response) +} export default Mock diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..4c4cb2a --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,68 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocks).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/remote-search.js b/mock/remote-search.js new file mode 100644 index 0000000..bb33c2f --- /dev/null +++ b/mock/remote-search.js @@ -0,0 +1,51 @@ +import Mock from 'mockjs' + +const NameList = [] +const count = 100 + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })) +} +NameList.push({ name: 'mock-Pan' }) + +export default [ + // username search + { + url: '/search/user', + type: 'get', + response: config => { + const { name } = config.query + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) + }) + return { + code: 20000, + data: { items: mockNameList } + } + } + }, + + // transaction list + { + url: '/transaction/list', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + total: 20, + 'items|20': [{ + order_no: '@guid()', + timestamp: +Mock.Random.date('T'), + username: '@name()', + price: '@float(1000, 15000, 0, 2)', + 'status|1': ['success', 'pending'] + }] + } + } + } + } +] diff --git a/mock/system/area.js b/mock/system/area.js new file mode 100644 index 0000000..3495001 --- /dev/null +++ b/mock/system/area.js @@ -0,0 +1,83 @@ +const list = [ + { + 'id': '11010100102', + 'lat': '', + 'level': 5, + 'levelName': '社区', + 'lng': '', + 'name': '测试社区3', + 'num': 1, + 'pid': '110101001', + 'pids': '[0],[110000],[110100],[110101],[110101001],', + 'simplename': '测试社区2' + } +] +export default [ + // mock get all routes form server + { + url: '/area/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/area/list', + type: 'get', + response: _ => { + return { + code: 200, + data: [ + { + 'id': '110000', + 'pid': '0', + 'name': '北京市', + 'level': 1, + 'pids': [0], + 'levelName': '省级', + 'simplename': '北京' + } + ] + } + } + }, + { + url: '/area/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/config.js b/mock/system/config.js new file mode 100644 index 0000000..ab64c0a --- /dev/null +++ b/mock/system/config.js @@ -0,0 +1,18 @@ +export default [ + { + url: '/config/baseConfig', + type: 'get', + response: _ => { + return { + 'code': 200, + 'data': { + 'kaptcha': false, + 'publicKey': 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu5k8gcTFJy5UtMfmtKiR3f/EcUe93kzfteRj6+sM5fHRvOib82+uqQMjgaRZiMcr3HiHIFY5vA6c+Rfb5R2COitoOhxyA9U2eLXknzxLUQIAqXAvKQO8KnerA1Qjcds7xhJB2XPhWFlY4RVtMT2wr2lMd29QDE4F/kzyDhNBpxwIDAQAB', + 'sid': 'f390b7d7-337b-431b-be22-fb860a6c04d4' + }, + 'message': '请求成功', + 'success': true + } + } + } +] diff --git a/mock/system/dept.js b/mock/system/dept.js new file mode 100644 index 0000000..30675b9 --- /dev/null +++ b/mock/system/dept.js @@ -0,0 +1,88 @@ +const list = [ + { + 'id': '1', + 'simplename': '二分公司', + 'fullname': '二分公司', + 'num': 1, + 'pid': '0', + 'pids': '[0,1,2]', + 'pName': '顶级', + 'version': '', + 'tips': '' + } +] +export default [ + // mock get all routes form server + { + url: '/dept/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: list + } + } + } + }, + { + url: '/dept/tree', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: [ + { + 'id': '0', + 'pid': '', + 'name': '顶级', + 'open': 'false', + 'checked': '' + }, + { + 'id': '26', + 'pid': '24', + 'name': '运行二所', + 'open': 'false', + 'checked': '' + } + ] + } + } + } + }, + { + url: '/dept/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/dict.js b/mock/system/dict.js new file mode 100644 index 0000000..75410dc --- /dev/null +++ b/mock/system/dict.js @@ -0,0 +1,69 @@ +const list = [ + { + 'code': 'sysStatus', + 'num': 0, + 'name': '状态', + 'pid': '0', + 'id': '16', + 'detail': '1:启用:1;2:禁用:2', + 'tips': '' + }, + { + 'code': 'sysSex', + 'num': 0, + 'name': '性别', + 'pid': '0', + 'id': '29', + 'detail': '1:男:1;2:女:2', + 'tips': '' + } +] +export default [ + // mock get all routes form server + { + url: '/dict/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/dict/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dict/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dict/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/log.js b/mock/system/log.js new file mode 100644 index 0000000..41f2e94 --- /dev/null +++ b/mock/system/log.js @@ -0,0 +1,115 @@ +const logTypes = [ + { + 'value': '0', + 'name': '业务日志' + }, + { + 'value': '1', + 'name': '登录日志' + } +] +const loglist = [ + { + 'id': 'c4cdba483fb1449aaad1e6c49353c6b3', + 'logtype': '业务日志', + 'createtime': '2019-04-04 14:23:31', + 'logname': '修改用户', + 'succeed': '成功', + 'deptid': '24', + 'deptName': '总公司', + 'message': '账号=yxssadmin...', + 'userName': 'bruser', + 'userid': '45' + } +] +const loginloglist = [ + { + 'createtime': '2020-03-26 16:03:23', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.184', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }, + { + 'createtime': '2020-03-26 15:13:50', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.184', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }, + { + 'createtime': '2020-03-26 14:47:05', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.105', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }] +export default [ + { + url: '/loginLog/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: loginloglist, + total: 2 + } + } + } + }, + { + url: '/log/list', + type: 'post', + response: _ => { + return { + code: 200, + data: { + rows: loglist, + total: 2 + } + } + } + }, + { + url: '/log/detail', + type: 'get', + response: _ => { + return { + code: 200, + data: { + "createtime":"2020-03-26", + "logtype":"业务日志", + "classname":"com.casic.missiles.modular.system.controller.RoleController", + "method":"dataAuthor", + "logname":"数据权限配置", + "succeed":"成功", + "id":"1243081729056264193", + "message":"角色名称=十一室管理员,资源名称=", + "userName":"超级管理员", + "regularMessage":"角色名称=十一室管理员,资源名称=", + "userid":"1" + } + } + } + }, + { + url: '/dict/code/logType', + type: 'get', + response: _ => { + return { + code: 200, + data: logTypes + } + } + } +] diff --git a/mock/index.js b/mock/index.js index 9eb5a47..0e41bf6 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,9 +1,27 @@ import Mock from 'mockjs' -import userAPI from './user' -import tableAPI from './table' -// Fix an issue with setting withCredentials = true, cross-domain request lost cookies -// https://github.com/nuysoft/Mock/issues/300 +import user from './system/user' +import resource from './system/resource' +import dict from './system/dict' +import dept from './system/dept' +import area from './system/area' +import role from './system/role' +import log from './system/log' +import config from './system/config' +import search from './remote-search' + +const mocks = [ + ...user, + ...resource, + ...dict, + ...area, + ...dept, + ...role, + ...log, + ...config, + ...search +] + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { @@ -11,16 +29,13 @@ } this.proxy_send(...arguments) } -// Mock.setup({ -// timeout: '350-600' -// }) +Mock.setup({ + timeout: '350-600' +}) -// User -Mock.mock(/\/user\/login/, 'post', userAPI.login) -Mock.mock(/\/user\/info/, 'get', userAPI.getInfo) -Mock.mock(/\/user\/logout/, 'post', userAPI.logout) - -// Table -Mock.mock(/\/table\/list/, 'get', tableAPI.list) +for (const i of mocks) { + console.log(i) + Mock.mock(new RegExp(i.url), i.type || 'get', i.response) +} export default Mock diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..4c4cb2a --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,68 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocks).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/remote-search.js b/mock/remote-search.js new file mode 100644 index 0000000..bb33c2f --- /dev/null +++ b/mock/remote-search.js @@ -0,0 +1,51 @@ +import Mock from 'mockjs' + +const NameList = [] +const count = 100 + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })) +} +NameList.push({ name: 'mock-Pan' }) + +export default [ + // username search + { + url: '/search/user', + type: 'get', + response: config => { + const { name } = config.query + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) + }) + return { + code: 20000, + data: { items: mockNameList } + } + } + }, + + // transaction list + { + url: '/transaction/list', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + total: 20, + 'items|20': [{ + order_no: '@guid()', + timestamp: +Mock.Random.date('T'), + username: '@name()', + price: '@float(1000, 15000, 0, 2)', + 'status|1': ['success', 'pending'] + }] + } + } + } + } +] diff --git a/mock/system/area.js b/mock/system/area.js new file mode 100644 index 0000000..3495001 --- /dev/null +++ b/mock/system/area.js @@ -0,0 +1,83 @@ +const list = [ + { + 'id': '11010100102', + 'lat': '', + 'level': 5, + 'levelName': '社区', + 'lng': '', + 'name': '测试社区3', + 'num': 1, + 'pid': '110101001', + 'pids': '[0],[110000],[110100],[110101],[110101001],', + 'simplename': '测试社区2' + } +] +export default [ + // mock get all routes form server + { + url: '/area/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/area/list', + type: 'get', + response: _ => { + return { + code: 200, + data: [ + { + 'id': '110000', + 'pid': '0', + 'name': '北京市', + 'level': 1, + 'pids': [0], + 'levelName': '省级', + 'simplename': '北京' + } + ] + } + } + }, + { + url: '/area/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/config.js b/mock/system/config.js new file mode 100644 index 0000000..ab64c0a --- /dev/null +++ b/mock/system/config.js @@ -0,0 +1,18 @@ +export default [ + { + url: '/config/baseConfig', + type: 'get', + response: _ => { + return { + 'code': 200, + 'data': { + 'kaptcha': false, + 'publicKey': 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu5k8gcTFJy5UtMfmtKiR3f/EcUe93kzfteRj6+sM5fHRvOib82+uqQMjgaRZiMcr3HiHIFY5vA6c+Rfb5R2COitoOhxyA9U2eLXknzxLUQIAqXAvKQO8KnerA1Qjcds7xhJB2XPhWFlY4RVtMT2wr2lMd29QDE4F/kzyDhNBpxwIDAQAB', + 'sid': 'f390b7d7-337b-431b-be22-fb860a6c04d4' + }, + 'message': '请求成功', + 'success': true + } + } + } +] diff --git a/mock/system/dept.js b/mock/system/dept.js new file mode 100644 index 0000000..30675b9 --- /dev/null +++ b/mock/system/dept.js @@ -0,0 +1,88 @@ +const list = [ + { + 'id': '1', + 'simplename': '二分公司', + 'fullname': '二分公司', + 'num': 1, + 'pid': '0', + 'pids': '[0,1,2]', + 'pName': '顶级', + 'version': '', + 'tips': '' + } +] +export default [ + // mock get all routes form server + { + url: '/dept/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: list + } + } + } + }, + { + url: '/dept/tree', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: [ + { + 'id': '0', + 'pid': '', + 'name': '顶级', + 'open': 'false', + 'checked': '' + }, + { + 'id': '26', + 'pid': '24', + 'name': '运行二所', + 'open': 'false', + 'checked': '' + } + ] + } + } + } + }, + { + url: '/dept/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/dict.js b/mock/system/dict.js new file mode 100644 index 0000000..75410dc --- /dev/null +++ b/mock/system/dict.js @@ -0,0 +1,69 @@ +const list = [ + { + 'code': 'sysStatus', + 'num': 0, + 'name': '状态', + 'pid': '0', + 'id': '16', + 'detail': '1:启用:1;2:禁用:2', + 'tips': '' + }, + { + 'code': 'sysSex', + 'num': 0, + 'name': '性别', + 'pid': '0', + 'id': '29', + 'detail': '1:男:1;2:女:2', + 'tips': '' + } +] +export default [ + // mock get all routes form server + { + url: '/dict/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/dict/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dict/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dict/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/log.js b/mock/system/log.js new file mode 100644 index 0000000..41f2e94 --- /dev/null +++ b/mock/system/log.js @@ -0,0 +1,115 @@ +const logTypes = [ + { + 'value': '0', + 'name': '业务日志' + }, + { + 'value': '1', + 'name': '登录日志' + } +] +const loglist = [ + { + 'id': 'c4cdba483fb1449aaad1e6c49353c6b3', + 'logtype': '业务日志', + 'createtime': '2019-04-04 14:23:31', + 'logname': '修改用户', + 'succeed': '成功', + 'deptid': '24', + 'deptName': '总公司', + 'message': '账号=yxssadmin...', + 'userName': 'bruser', + 'userid': '45' + } +] +const loginloglist = [ + { + 'createtime': '2020-03-26 16:03:23', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.184', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }, + { + 'createtime': '2020-03-26 15:13:50', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.184', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }, + { + 'createtime': '2020-03-26 14:47:05', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.105', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }] +export default [ + { + url: '/loginLog/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: loginloglist, + total: 2 + } + } + } + }, + { + url: '/log/list', + type: 'post', + response: _ => { + return { + code: 200, + data: { + rows: loglist, + total: 2 + } + } + } + }, + { + url: '/log/detail', + type: 'get', + response: _ => { + return { + code: 200, + data: { + "createtime":"2020-03-26", + "logtype":"业务日志", + "classname":"com.casic.missiles.modular.system.controller.RoleController", + "method":"dataAuthor", + "logname":"数据权限配置", + "succeed":"成功", + "id":"1243081729056264193", + "message":"角色名称=十一室管理员,资源名称=", + "userName":"超级管理员", + "regularMessage":"角色名称=十一室管理员,资源名称=", + "userid":"1" + } + } + } + }, + { + url: '/dict/code/logType', + type: 'get', + response: _ => { + return { + code: 200, + data: logTypes + } + } + } +] diff --git a/mock/system/resource.js b/mock/system/resource.js new file mode 100644 index 0000000..9d4a048 --- /dev/null +++ b/mock/system/resource.js @@ -0,0 +1,1569 @@ +const tree = [ + { + 'checked': false, + 'code': 'system', + 'id': '105', + 'name': '系统管理', + 'open': false, + 'pcodes': '[0],[sys],', + 'pid': '1189107859077373954', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr', + 'id': '106', + 'name': '用户管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_add', + 'id': '107', + 'name': '添加用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_edit', + 'id': '108', + 'name': '修改用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_delete', + 'id': '109', + 'name': '删除用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_reset', + 'id': '110', + 'name': '重置密码', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_freeze', + 'id': '111', + 'name': '冻结用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_unfreeze', + 'id': '112', + 'name': '解除冻结用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_setRole', + 'id': '113', + 'name': '分配角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'role', + 'id': '114', + 'name': '角色管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_add', + 'id': '115', + 'name': '添加角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_edit', + 'id': '116', + 'name': '修改角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_remove', + 'id': '117', + 'name': '删除角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_setAuthority', + 'id': '118', + 'name': '配置权限', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu', + 'id': '119', + 'name': '资源管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_add', + 'id': '120', + 'name': '添加菜单', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_edit', + 'id': '121', + 'name': '修改菜单', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_remove', + 'id': '122', + 'name': '删除菜单', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'log', + 'id': '128', + 'name': '日志管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept', + 'id': '131', + 'name': '组织管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict', + 'id': '132', + 'name': '字典管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'loginLog', + 'id': '133', + 'name': '登录日志', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'log_clean', + 'id': '134', + 'name': '清空日志', + 'open': false, + 'pcodes': '[0],[sys],[system],[log],', + 'pid': '128', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_add', + 'id': '135', + 'name': '添加部门', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_update', + 'id': '136', + 'name': '修改部门', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_delete', + 'id': '137', + 'name': '删除部门', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_add', + 'id': '138', + 'name': '添加字典', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_update', + 'id': '139', + 'name': '修改字典', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_delete', + 'id': '140', + 'name': '删除字典', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_list', + 'id': '151', + 'name': '菜单列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_list', + 'id': '153', + 'name': '部门列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_detail', + 'id': '154', + 'name': '部门详情', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_list', + 'id': '156', + 'name': '字典列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_detail', + 'id': '157', + 'name': '字典详情', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'log_list', + 'id': '158', + 'name': '日志列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[log],', + 'pid': '128', + 'value': '' + }, + { + 'checked': false, + 'code': 'log_detail', + 'id': '159', + 'name': '日志详情', + 'open': false, + 'pcodes': '[0],[sys],[system],[log],', + 'pid': '128', + 'value': '' + }, + { + 'checked': false, + 'code': 'del_login_log', + 'id': '160', + 'name': '清空登录日志', + 'open': false, + 'pcodes': '[0],[sys],[system],[loginLog],', + 'pid': '133', + 'value': '' + }, + { + 'checked': false, + 'code': 'login_log_list', + 'id': '161', + 'name': '登录日志列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[loginLog],', + 'pid': '133', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_list', + 'id': '164', + 'name': '角色列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_list', + 'id': '167', + 'name': '用户列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'data_author', + 'id': '1138364388198715393', + 'name': '数据权限', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'AreaAdmin', + 'id': '1170945119300976642', + 'name': '区域管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'sys', + 'id': '1189107859077373954', + 'name': '基础权限管理', + 'open': true, + 'pcodes': '[0],', + 'pid': '0', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_listPage', + 'id': '1191975090689810434', + 'name': '区域列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_add', + 'id': '1191975312815955969', + 'name': '新增区域', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_update', + 'id': '1191975427559530497', + 'name': '修改区域', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_delete', + 'id': '1191975543687225346', + 'name': '区域删除', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': true, + 'code': '', + 'id': '0', + 'name': '顶级', + 'open': true, + 'pcodes': '', + 'pid': '', + 'value': '' + } +] +const list = [ + { + 'isopen': '1', + 'code': 'system', + 'pcode': 'sys', + 'num': 4, + 'icon': 'icon-setting', + 'pid': '1189107859077373954', + 'isMenu': '是', + 'url': '/system', + 'tips': '', + 'pcodes': '[0],[sys],', + 'name': '系统管理', + 'statusName': '启用', + 'id': '105', + 'ismenu': '1', + 'levels': 2, + 'open': true, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'mgr', + 'pcode': 'system', + 'num': 1, + 'icon': 'icon-user', + 'pid': '105', + 'isMenu': '是', + 'url': '/mgr', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '用户管理', + 'statusName': '启用', + 'id': '106', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'mgr_add', + 'pcode': 'mgr', + 'num': 1, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '添加用户', + 'statusName': '启用', + 'id': '107', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_edit', + 'pcode': 'mgr', + 'num': 2, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '修改用户', + 'statusName': '启用', + 'id': '108', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_delete', + 'pcode': 'mgr', + 'num': 3, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '删除用户', + 'statusName': '启用', + 'id': '109', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_reset', + 'pcode': 'mgr', + 'num': 4, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/reset', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '重置密码', + 'statusName': '启用', + 'id': '110', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_freeze', + 'pcode': 'mgr', + 'num': 5, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/freeze', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '冻结用户', + 'statusName': '启用', + 'id': '111', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_unfreeze', + 'pcode': 'mgr', + 'num': 6, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/unfreeze', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '解除冻结用户', + 'statusName': '启用', + 'id': '112', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_setRole', + 'pcode': 'mgr', + 'num': 7, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/roleAssign', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '分配角色', + 'statusName': '启用', + 'id': '113', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'role', + 'pcode': 'system', + 'num': 2, + 'icon': 'permission', + 'pid': '105', + 'isMenu': '是', + 'url': '/role', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '角色管理', + 'statusName': '启用', + 'id': '114', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'role_add', + 'pcode': 'role', + 'num': 1, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '添加角色', + 'statusName': '启用', + 'id': '115', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'role_edit', + 'pcode': 'role', + 'num': 2, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '修改角色', + 'statusName': '启用', + 'id': '116', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'role_remove', + 'pcode': 'role', + 'num': 3, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '删除角色', + 'statusName': '启用', + 'id': '117', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'role_setAuthority', + 'pcode': 'role', + 'num': 4, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/funcAuthor', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '配置权限', + 'statusName': '启用', + 'id': '118', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'menu', + 'pcode': 'system', + 'num': 4, + 'icon': 'function', + 'pid': '105', + 'isMenu': '是', + 'url': '/resource', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '资源管理', + 'statusName': '启用', + 'id': '119', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'menu_add', + 'pcode': 'menu', + 'num': 1, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '添加菜单', + 'statusName': '启用', + 'id': '120', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'menu_edit', + 'pcode': 'menu', + 'num': 2, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '修改菜单', + 'statusName': '启用', + 'id': '121', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'menu_remove', + 'pcode': 'menu', + 'num': 3, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '删除菜单', + 'statusName': '启用', + 'id': '122', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'log', + 'pcode': 'system', + 'num': 6, + 'icon': 'log', + 'pid': '105', + 'isMenu': '是', + 'url': '/log', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '日志管理', + 'statusName': '启用', + 'id': '128', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'dept', + 'pcode': 'system', + 'num': 3, + 'icon': 'dept2', + 'pid': '105', + 'isMenu': '是', + 'url': '/dept', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '组织管理', + 'statusName': '启用', + 'id': '131', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'dict', + 'pcode': 'system', + 'num': 4, + 'icon': 'icon-dict', + 'pid': '105', + 'isMenu': '是', + 'url': '/dict', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '字典管理', + 'statusName': '启用', + 'id': '132', + 'ismenu': '1', + 'levels': 3, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'loginLog', + 'pcode': 'system', + 'num': 6, + 'icon': 'task', + 'pid': '105', + 'isMenu': '是', + 'url': '/loginLog', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '登录日志', + 'statusName': '启用', + 'id': '133', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'log_clean', + 'pcode': 'log', + 'num': 3, + 'icon': '', + 'pid': '128', + 'isMenu': '不是', + 'url': '/log/delLog', + 'tips': '', + 'pcodes': '[0],[sys],[system],[log],', + 'name': '清空日志', + 'statusName': '启用', + 'id': '134', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_add', + 'pcode': 'dept', + 'num': 1, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '添加部门', + 'statusName': '启用', + 'id': '135', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_update', + 'pcode': 'dept', + 'num': 1, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '修改部门', + 'statusName': '启用', + 'id': '136', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_delete', + 'pcode': 'dept', + 'num': 1, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '删除部门', + 'statusName': '启用', + 'id': '137', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_add', + 'pcode': 'dict', + 'num': 1, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '添加字典', + 'statusName': '启用', + 'id': '138', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_update', + 'pcode': 'dict', + 'num': 1, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '修改字典', + 'statusName': '启用', + 'id': '139', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_delete', + 'pcode': 'dict', + 'num': 1, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '删除字典', + 'statusName': '启用', + 'id': '140', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'menu_list', + 'pcode': 'menu', + 'num': 5, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '菜单列表', + 'statusName': '启用', + 'id': '151', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'dept_list', + 'pcode': 'dept', + 'num': 5, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '部门列表', + 'statusName': '启用', + 'id': '153', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_detail', + 'pcode': 'dept', + 'num': 6, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/detail', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '部门详情', + 'statusName': '启用', + 'id': '154', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_list', + 'pcode': 'dict', + 'num': 5, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '字典列表', + 'statusName': '启用', + 'id': '156', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_detail', + 'pcode': 'dict', + 'num': 6, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/detail', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '字典详情', + 'statusName': '启用', + 'id': '157', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'log_list', + 'pcode': 'log', + 'num': 2, + 'icon': '', + 'pid': '128', + 'isMenu': '不是', + 'url': '/log/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[log],', + 'name': '日志列表', + 'statusName': '启用', + 'id': '158', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'log_detail', + 'pcode': 'log', + 'num': 3, + 'icon': '', + 'pid': '128', + 'isMenu': '不是', + 'url': '/log/detail', + 'tips': '', + 'pcodes': '[0],[sys],[system],[log],', + 'name': '日志详情', + 'statusName': '启用', + 'id': '159', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'del_login_log', + 'pcode': 'loginLog', + 'num': 1, + 'icon': '', + 'pid': '133', + 'isMenu': '不是', + 'url': '/loginLog/delLoginLog', + 'tips': '', + 'pcodes': '[0],[sys],[system],[loginLog],', + 'name': '清空登录日志', + 'statusName': '启用', + 'id': '160', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'login_log_list', + 'pcode': 'loginLog', + 'num': 2, + 'icon': '', + 'pid': '133', + 'isMenu': '不是', + 'url': '/loginLog/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[loginLog],', + 'name': '登录日志列表', + 'statusName': '启用', + 'id': '161', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'role_list', + 'pcode': 'role', + 'num': 7, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '角色列表', + 'statusName': '启用', + 'id': '164', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_list', + 'pcode': 'mgr', + 'num': 10, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': ' /mgr/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '用户列表', + 'statusName': '启用', + 'id': '167', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'data_author', + 'pcode': 'role', + 'num': 0, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/dataAuthor', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '数据权限', + 'statusName': '启用', + 'id': '1138364388198715393', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'AreaAdmin', + 'pcode': 'system', + 'num': 0, + 'icon': 'icon-base', + 'pid': '105', + 'isMenu': '是', + 'url': '/area', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '区域管理', + 'statusName': '启用', + 'id': '1170945119300976642', + 'ismenu': '1', + 'levels': 3, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'sys', + 'pcode': '0', + 'num': 0, + 'icon': 'icon-setting', + 'pid': '0', + 'isMenu': '不是', + 'url': '/sys', + 'tips': '', + 'pcodes': '[0],', + 'name': '基础权限管理', + 'statusName': '启用', + 'id': '1189107859077373954', + 'ismenu': '0', + 'levels': 1, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '02' + }, + { + 'isopen': '0', + 'code': 'area_listPage', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/listPage', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '区域列表', + 'statusName': '启用', + 'id': '1191975090689810434', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'area_add', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '新增区域', + 'statusName': '启用', + 'id': '1191975312815955969', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'area_update', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '修改区域', + 'statusName': '启用', + 'id': '1191975427559530497', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'area_delete', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '区域删除', + 'statusName': '启用', + 'id': '1191975543687225346', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + } +] +export default [ + // mock get all routes form server + { + url: '/resource/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: list + } + } + } + }, + + // mock get all roles form server + { + url: '/resource/tree', + type: 'get', + response: _ => { + return { + 'code': 200, + 'message': 'success', + 'data': { + 'list': tree + } + } + } + }, + { + url: '/dict/code/resourceType', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: [ + { + 'name': '菜单', + 'id': '55', + 'value': '03' + }, + { + 'name': '按钮', + 'id': '56', + 'value': '04' + } + ] + } + } + }, + { + url: '/resource/treeListByRoleId', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: { + 'list': tree + } + } + } + }, + { + url: 'resource/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/resource/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/resource/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/index.js b/mock/index.js index 9eb5a47..0e41bf6 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,9 +1,27 @@ import Mock from 'mockjs' -import userAPI from './user' -import tableAPI from './table' -// Fix an issue with setting withCredentials = true, cross-domain request lost cookies -// https://github.com/nuysoft/Mock/issues/300 +import user from './system/user' +import resource from './system/resource' +import dict from './system/dict' +import dept from './system/dept' +import area from './system/area' +import role from './system/role' +import log from './system/log' +import config from './system/config' +import search from './remote-search' + +const mocks = [ + ...user, + ...resource, + ...dict, + ...area, + ...dept, + ...role, + ...log, + ...config, + ...search +] + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { @@ -11,16 +29,13 @@ } this.proxy_send(...arguments) } -// Mock.setup({ -// timeout: '350-600' -// }) +Mock.setup({ + timeout: '350-600' +}) -// User -Mock.mock(/\/user\/login/, 'post', userAPI.login) -Mock.mock(/\/user\/info/, 'get', userAPI.getInfo) -Mock.mock(/\/user\/logout/, 'post', userAPI.logout) - -// Table -Mock.mock(/\/table\/list/, 'get', tableAPI.list) +for (const i of mocks) { + console.log(i) + Mock.mock(new RegExp(i.url), i.type || 'get', i.response) +} export default Mock diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..4c4cb2a --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,68 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocks).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/remote-search.js b/mock/remote-search.js new file mode 100644 index 0000000..bb33c2f --- /dev/null +++ b/mock/remote-search.js @@ -0,0 +1,51 @@ +import Mock from 'mockjs' + +const NameList = [] +const count = 100 + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })) +} +NameList.push({ name: 'mock-Pan' }) + +export default [ + // username search + { + url: '/search/user', + type: 'get', + response: config => { + const { name } = config.query + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) + }) + return { + code: 20000, + data: { items: mockNameList } + } + } + }, + + // transaction list + { + url: '/transaction/list', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + total: 20, + 'items|20': [{ + order_no: '@guid()', + timestamp: +Mock.Random.date('T'), + username: '@name()', + price: '@float(1000, 15000, 0, 2)', + 'status|1': ['success', 'pending'] + }] + } + } + } + } +] diff --git a/mock/system/area.js b/mock/system/area.js new file mode 100644 index 0000000..3495001 --- /dev/null +++ b/mock/system/area.js @@ -0,0 +1,83 @@ +const list = [ + { + 'id': '11010100102', + 'lat': '', + 'level': 5, + 'levelName': '社区', + 'lng': '', + 'name': '测试社区3', + 'num': 1, + 'pid': '110101001', + 'pids': '[0],[110000],[110100],[110101],[110101001],', + 'simplename': '测试社区2' + } +] +export default [ + // mock get all routes form server + { + url: '/area/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/area/list', + type: 'get', + response: _ => { + return { + code: 200, + data: [ + { + 'id': '110000', + 'pid': '0', + 'name': '北京市', + 'level': 1, + 'pids': [0], + 'levelName': '省级', + 'simplename': '北京' + } + ] + } + } + }, + { + url: '/area/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/config.js b/mock/system/config.js new file mode 100644 index 0000000..ab64c0a --- /dev/null +++ b/mock/system/config.js @@ -0,0 +1,18 @@ +export default [ + { + url: '/config/baseConfig', + type: 'get', + response: _ => { + return { + 'code': 200, + 'data': { + 'kaptcha': false, + 'publicKey': 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu5k8gcTFJy5UtMfmtKiR3f/EcUe93kzfteRj6+sM5fHRvOib82+uqQMjgaRZiMcr3HiHIFY5vA6c+Rfb5R2COitoOhxyA9U2eLXknzxLUQIAqXAvKQO8KnerA1Qjcds7xhJB2XPhWFlY4RVtMT2wr2lMd29QDE4F/kzyDhNBpxwIDAQAB', + 'sid': 'f390b7d7-337b-431b-be22-fb860a6c04d4' + }, + 'message': '请求成功', + 'success': true + } + } + } +] diff --git a/mock/system/dept.js b/mock/system/dept.js new file mode 100644 index 0000000..30675b9 --- /dev/null +++ b/mock/system/dept.js @@ -0,0 +1,88 @@ +const list = [ + { + 'id': '1', + 'simplename': '二分公司', + 'fullname': '二分公司', + 'num': 1, + 'pid': '0', + 'pids': '[0,1,2]', + 'pName': '顶级', + 'version': '', + 'tips': '' + } +] +export default [ + // mock get all routes form server + { + url: '/dept/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: list + } + } + } + }, + { + url: '/dept/tree', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: [ + { + 'id': '0', + 'pid': '', + 'name': '顶级', + 'open': 'false', + 'checked': '' + }, + { + 'id': '26', + 'pid': '24', + 'name': '运行二所', + 'open': 'false', + 'checked': '' + } + ] + } + } + } + }, + { + url: '/dept/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/dict.js b/mock/system/dict.js new file mode 100644 index 0000000..75410dc --- /dev/null +++ b/mock/system/dict.js @@ -0,0 +1,69 @@ +const list = [ + { + 'code': 'sysStatus', + 'num': 0, + 'name': '状态', + 'pid': '0', + 'id': '16', + 'detail': '1:启用:1;2:禁用:2', + 'tips': '' + }, + { + 'code': 'sysSex', + 'num': 0, + 'name': '性别', + 'pid': '0', + 'id': '29', + 'detail': '1:男:1;2:女:2', + 'tips': '' + } +] +export default [ + // mock get all routes form server + { + url: '/dict/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/dict/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dict/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dict/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/log.js b/mock/system/log.js new file mode 100644 index 0000000..41f2e94 --- /dev/null +++ b/mock/system/log.js @@ -0,0 +1,115 @@ +const logTypes = [ + { + 'value': '0', + 'name': '业务日志' + }, + { + 'value': '1', + 'name': '登录日志' + } +] +const loglist = [ + { + 'id': 'c4cdba483fb1449aaad1e6c49353c6b3', + 'logtype': '业务日志', + 'createtime': '2019-04-04 14:23:31', + 'logname': '修改用户', + 'succeed': '成功', + 'deptid': '24', + 'deptName': '总公司', + 'message': '账号=yxssadmin...', + 'userName': 'bruser', + 'userid': '45' + } +] +const loginloglist = [ + { + 'createtime': '2020-03-26 16:03:23', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.184', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }, + { + 'createtime': '2020-03-26 15:13:50', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.184', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }, + { + 'createtime': '2020-03-26 14:47:05', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.105', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }] +export default [ + { + url: '/loginLog/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: loginloglist, + total: 2 + } + } + } + }, + { + url: '/log/list', + type: 'post', + response: _ => { + return { + code: 200, + data: { + rows: loglist, + total: 2 + } + } + } + }, + { + url: '/log/detail', + type: 'get', + response: _ => { + return { + code: 200, + data: { + "createtime":"2020-03-26", + "logtype":"业务日志", + "classname":"com.casic.missiles.modular.system.controller.RoleController", + "method":"dataAuthor", + "logname":"数据权限配置", + "succeed":"成功", + "id":"1243081729056264193", + "message":"角色名称=十一室管理员,资源名称=", + "userName":"超级管理员", + "regularMessage":"角色名称=十一室管理员,资源名称=", + "userid":"1" + } + } + } + }, + { + url: '/dict/code/logType', + type: 'get', + response: _ => { + return { + code: 200, + data: logTypes + } + } + } +] diff --git a/mock/system/resource.js b/mock/system/resource.js new file mode 100644 index 0000000..9d4a048 --- /dev/null +++ b/mock/system/resource.js @@ -0,0 +1,1569 @@ +const tree = [ + { + 'checked': false, + 'code': 'system', + 'id': '105', + 'name': '系统管理', + 'open': false, + 'pcodes': '[0],[sys],', + 'pid': '1189107859077373954', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr', + 'id': '106', + 'name': '用户管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_add', + 'id': '107', + 'name': '添加用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_edit', + 'id': '108', + 'name': '修改用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_delete', + 'id': '109', + 'name': '删除用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_reset', + 'id': '110', + 'name': '重置密码', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_freeze', + 'id': '111', + 'name': '冻结用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_unfreeze', + 'id': '112', + 'name': '解除冻结用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_setRole', + 'id': '113', + 'name': '分配角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'role', + 'id': '114', + 'name': '角色管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_add', + 'id': '115', + 'name': '添加角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_edit', + 'id': '116', + 'name': '修改角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_remove', + 'id': '117', + 'name': '删除角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_setAuthority', + 'id': '118', + 'name': '配置权限', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu', + 'id': '119', + 'name': '资源管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_add', + 'id': '120', + 'name': '添加菜单', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_edit', + 'id': '121', + 'name': '修改菜单', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_remove', + 'id': '122', + 'name': '删除菜单', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'log', + 'id': '128', + 'name': '日志管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept', + 'id': '131', + 'name': '组织管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict', + 'id': '132', + 'name': '字典管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'loginLog', + 'id': '133', + 'name': '登录日志', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'log_clean', + 'id': '134', + 'name': '清空日志', + 'open': false, + 'pcodes': '[0],[sys],[system],[log],', + 'pid': '128', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_add', + 'id': '135', + 'name': '添加部门', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_update', + 'id': '136', + 'name': '修改部门', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_delete', + 'id': '137', + 'name': '删除部门', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_add', + 'id': '138', + 'name': '添加字典', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_update', + 'id': '139', + 'name': '修改字典', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_delete', + 'id': '140', + 'name': '删除字典', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_list', + 'id': '151', + 'name': '菜单列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_list', + 'id': '153', + 'name': '部门列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_detail', + 'id': '154', + 'name': '部门详情', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_list', + 'id': '156', + 'name': '字典列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_detail', + 'id': '157', + 'name': '字典详情', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'log_list', + 'id': '158', + 'name': '日志列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[log],', + 'pid': '128', + 'value': '' + }, + { + 'checked': false, + 'code': 'log_detail', + 'id': '159', + 'name': '日志详情', + 'open': false, + 'pcodes': '[0],[sys],[system],[log],', + 'pid': '128', + 'value': '' + }, + { + 'checked': false, + 'code': 'del_login_log', + 'id': '160', + 'name': '清空登录日志', + 'open': false, + 'pcodes': '[0],[sys],[system],[loginLog],', + 'pid': '133', + 'value': '' + }, + { + 'checked': false, + 'code': 'login_log_list', + 'id': '161', + 'name': '登录日志列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[loginLog],', + 'pid': '133', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_list', + 'id': '164', + 'name': '角色列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_list', + 'id': '167', + 'name': '用户列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'data_author', + 'id': '1138364388198715393', + 'name': '数据权限', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'AreaAdmin', + 'id': '1170945119300976642', + 'name': '区域管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'sys', + 'id': '1189107859077373954', + 'name': '基础权限管理', + 'open': true, + 'pcodes': '[0],', + 'pid': '0', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_listPage', + 'id': '1191975090689810434', + 'name': '区域列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_add', + 'id': '1191975312815955969', + 'name': '新增区域', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_update', + 'id': '1191975427559530497', + 'name': '修改区域', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_delete', + 'id': '1191975543687225346', + 'name': '区域删除', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': true, + 'code': '', + 'id': '0', + 'name': '顶级', + 'open': true, + 'pcodes': '', + 'pid': '', + 'value': '' + } +] +const list = [ + { + 'isopen': '1', + 'code': 'system', + 'pcode': 'sys', + 'num': 4, + 'icon': 'icon-setting', + 'pid': '1189107859077373954', + 'isMenu': '是', + 'url': '/system', + 'tips': '', + 'pcodes': '[0],[sys],', + 'name': '系统管理', + 'statusName': '启用', + 'id': '105', + 'ismenu': '1', + 'levels': 2, + 'open': true, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'mgr', + 'pcode': 'system', + 'num': 1, + 'icon': 'icon-user', + 'pid': '105', + 'isMenu': '是', + 'url': '/mgr', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '用户管理', + 'statusName': '启用', + 'id': '106', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'mgr_add', + 'pcode': 'mgr', + 'num': 1, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '添加用户', + 'statusName': '启用', + 'id': '107', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_edit', + 'pcode': 'mgr', + 'num': 2, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '修改用户', + 'statusName': '启用', + 'id': '108', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_delete', + 'pcode': 'mgr', + 'num': 3, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '删除用户', + 'statusName': '启用', + 'id': '109', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_reset', + 'pcode': 'mgr', + 'num': 4, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/reset', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '重置密码', + 'statusName': '启用', + 'id': '110', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_freeze', + 'pcode': 'mgr', + 'num': 5, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/freeze', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '冻结用户', + 'statusName': '启用', + 'id': '111', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_unfreeze', + 'pcode': 'mgr', + 'num': 6, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/unfreeze', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '解除冻结用户', + 'statusName': '启用', + 'id': '112', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_setRole', + 'pcode': 'mgr', + 'num': 7, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/roleAssign', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '分配角色', + 'statusName': '启用', + 'id': '113', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'role', + 'pcode': 'system', + 'num': 2, + 'icon': 'permission', + 'pid': '105', + 'isMenu': '是', + 'url': '/role', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '角色管理', + 'statusName': '启用', + 'id': '114', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'role_add', + 'pcode': 'role', + 'num': 1, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '添加角色', + 'statusName': '启用', + 'id': '115', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'role_edit', + 'pcode': 'role', + 'num': 2, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '修改角色', + 'statusName': '启用', + 'id': '116', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'role_remove', + 'pcode': 'role', + 'num': 3, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '删除角色', + 'statusName': '启用', + 'id': '117', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'role_setAuthority', + 'pcode': 'role', + 'num': 4, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/funcAuthor', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '配置权限', + 'statusName': '启用', + 'id': '118', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'menu', + 'pcode': 'system', + 'num': 4, + 'icon': 'function', + 'pid': '105', + 'isMenu': '是', + 'url': '/resource', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '资源管理', + 'statusName': '启用', + 'id': '119', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'menu_add', + 'pcode': 'menu', + 'num': 1, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '添加菜单', + 'statusName': '启用', + 'id': '120', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'menu_edit', + 'pcode': 'menu', + 'num': 2, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '修改菜单', + 'statusName': '启用', + 'id': '121', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'menu_remove', + 'pcode': 'menu', + 'num': 3, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '删除菜单', + 'statusName': '启用', + 'id': '122', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'log', + 'pcode': 'system', + 'num': 6, + 'icon': 'log', + 'pid': '105', + 'isMenu': '是', + 'url': '/log', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '日志管理', + 'statusName': '启用', + 'id': '128', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'dept', + 'pcode': 'system', + 'num': 3, + 'icon': 'dept2', + 'pid': '105', + 'isMenu': '是', + 'url': '/dept', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '组织管理', + 'statusName': '启用', + 'id': '131', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'dict', + 'pcode': 'system', + 'num': 4, + 'icon': 'icon-dict', + 'pid': '105', + 'isMenu': '是', + 'url': '/dict', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '字典管理', + 'statusName': '启用', + 'id': '132', + 'ismenu': '1', + 'levels': 3, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'loginLog', + 'pcode': 'system', + 'num': 6, + 'icon': 'task', + 'pid': '105', + 'isMenu': '是', + 'url': '/loginLog', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '登录日志', + 'statusName': '启用', + 'id': '133', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'log_clean', + 'pcode': 'log', + 'num': 3, + 'icon': '', + 'pid': '128', + 'isMenu': '不是', + 'url': '/log/delLog', + 'tips': '', + 'pcodes': '[0],[sys],[system],[log],', + 'name': '清空日志', + 'statusName': '启用', + 'id': '134', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_add', + 'pcode': 'dept', + 'num': 1, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '添加部门', + 'statusName': '启用', + 'id': '135', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_update', + 'pcode': 'dept', + 'num': 1, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '修改部门', + 'statusName': '启用', + 'id': '136', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_delete', + 'pcode': 'dept', + 'num': 1, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '删除部门', + 'statusName': '启用', + 'id': '137', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_add', + 'pcode': 'dict', + 'num': 1, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '添加字典', + 'statusName': '启用', + 'id': '138', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_update', + 'pcode': 'dict', + 'num': 1, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '修改字典', + 'statusName': '启用', + 'id': '139', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_delete', + 'pcode': 'dict', + 'num': 1, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '删除字典', + 'statusName': '启用', + 'id': '140', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'menu_list', + 'pcode': 'menu', + 'num': 5, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '菜单列表', + 'statusName': '启用', + 'id': '151', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'dept_list', + 'pcode': 'dept', + 'num': 5, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '部门列表', + 'statusName': '启用', + 'id': '153', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_detail', + 'pcode': 'dept', + 'num': 6, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/detail', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '部门详情', + 'statusName': '启用', + 'id': '154', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_list', + 'pcode': 'dict', + 'num': 5, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '字典列表', + 'statusName': '启用', + 'id': '156', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_detail', + 'pcode': 'dict', + 'num': 6, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/detail', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '字典详情', + 'statusName': '启用', + 'id': '157', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'log_list', + 'pcode': 'log', + 'num': 2, + 'icon': '', + 'pid': '128', + 'isMenu': '不是', + 'url': '/log/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[log],', + 'name': '日志列表', + 'statusName': '启用', + 'id': '158', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'log_detail', + 'pcode': 'log', + 'num': 3, + 'icon': '', + 'pid': '128', + 'isMenu': '不是', + 'url': '/log/detail', + 'tips': '', + 'pcodes': '[0],[sys],[system],[log],', + 'name': '日志详情', + 'statusName': '启用', + 'id': '159', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'del_login_log', + 'pcode': 'loginLog', + 'num': 1, + 'icon': '', + 'pid': '133', + 'isMenu': '不是', + 'url': '/loginLog/delLoginLog', + 'tips': '', + 'pcodes': '[0],[sys],[system],[loginLog],', + 'name': '清空登录日志', + 'statusName': '启用', + 'id': '160', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'login_log_list', + 'pcode': 'loginLog', + 'num': 2, + 'icon': '', + 'pid': '133', + 'isMenu': '不是', + 'url': '/loginLog/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[loginLog],', + 'name': '登录日志列表', + 'statusName': '启用', + 'id': '161', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'role_list', + 'pcode': 'role', + 'num': 7, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '角色列表', + 'statusName': '启用', + 'id': '164', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_list', + 'pcode': 'mgr', + 'num': 10, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': ' /mgr/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '用户列表', + 'statusName': '启用', + 'id': '167', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'data_author', + 'pcode': 'role', + 'num': 0, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/dataAuthor', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '数据权限', + 'statusName': '启用', + 'id': '1138364388198715393', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'AreaAdmin', + 'pcode': 'system', + 'num': 0, + 'icon': 'icon-base', + 'pid': '105', + 'isMenu': '是', + 'url': '/area', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '区域管理', + 'statusName': '启用', + 'id': '1170945119300976642', + 'ismenu': '1', + 'levels': 3, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'sys', + 'pcode': '0', + 'num': 0, + 'icon': 'icon-setting', + 'pid': '0', + 'isMenu': '不是', + 'url': '/sys', + 'tips': '', + 'pcodes': '[0],', + 'name': '基础权限管理', + 'statusName': '启用', + 'id': '1189107859077373954', + 'ismenu': '0', + 'levels': 1, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '02' + }, + { + 'isopen': '0', + 'code': 'area_listPage', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/listPage', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '区域列表', + 'statusName': '启用', + 'id': '1191975090689810434', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'area_add', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '新增区域', + 'statusName': '启用', + 'id': '1191975312815955969', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'area_update', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '修改区域', + 'statusName': '启用', + 'id': '1191975427559530497', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'area_delete', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '区域删除', + 'statusName': '启用', + 'id': '1191975543687225346', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + } +] +export default [ + // mock get all routes form server + { + url: '/resource/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: list + } + } + } + }, + + // mock get all roles form server + { + url: '/resource/tree', + type: 'get', + response: _ => { + return { + 'code': 200, + 'message': 'success', + 'data': { + 'list': tree + } + } + } + }, + { + url: '/dict/code/resourceType', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: [ + { + 'name': '菜单', + 'id': '55', + 'value': '03' + }, + { + 'name': '按钮', + 'id': '56', + 'value': '04' + } + ] + } + } + }, + { + url: '/resource/treeListByRoleId', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: { + 'list': tree + } + } + } + }, + { + url: 'resource/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/resource/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/resource/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/role.js b/mock/system/role.js new file mode 100644 index 0000000..f555ddf --- /dev/null +++ b/mock/system/role.js @@ -0,0 +1,180 @@ +const tree = [ + { + "id":1, + "pid":"0", + "name":"超级管理员" + } +] +const list = [ + { + "deptName":"顶级", + "pName":"", + "num":1, + "name":"超级管理员", + "deptid":"0", + "pid":"0", + "id":1, + "version":1, + "tips":"administrator" + }, + { + "deptName":"高压管网分公司", + "pName":"超级管理员", + "num":2, + "name":"高压管网分公司系统管理员", + "deptid":"24", + "pid":1, + "id":2, + "version":"", + "tips":"rqadmin" + } +] +export default [ + // mock get all routes form server + { + url: '/role/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: list + } + } + } + }, + + // mock get all roles form server + { + url: '/role/tree', + type: 'get', + response: _ => { + return { + 'code': 200, + 'message': 'success', + 'data': { + 'list': tree + } + } + } + }, + { + url: '/dict/code/roleType', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: [ + { + 'name': '菜单', + 'id': '55', + 'value': '03' + }, + { + 'name': '按钮', + 'id': '56', + 'value': '04' + } + ] + } + } + }, + { + url: '/role/treeByUserId', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: { + 'list': [ + { + "id":1, + "pid":"0", + "name":"超级管理员", + "open":true, + "checked":false + } + ] + } + } + } + }, + { + url: '/role/treeByRoleId', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: { + 'list': [ + { + "id":"26", + "pid":"24", + "name":"运行二所", + "open":true, + "checked":true + } + ] + } + } + } + }, + { + url: '/role/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/role/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/role/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/role/funcAuthor', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/role/dataAuthor', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/index.js b/mock/index.js index 9eb5a47..0e41bf6 100644 --- a/mock/index.js +++ b/mock/index.js @@ -1,9 +1,27 @@ import Mock from 'mockjs' -import userAPI from './user' -import tableAPI from './table' -// Fix an issue with setting withCredentials = true, cross-domain request lost cookies -// https://github.com/nuysoft/Mock/issues/300 +import user from './system/user' +import resource from './system/resource' +import dict from './system/dict' +import dept from './system/dept' +import area from './system/area' +import role from './system/role' +import log from './system/log' +import config from './system/config' +import search from './remote-search' + +const mocks = [ + ...user, + ...resource, + ...dict, + ...area, + ...dept, + ...role, + ...log, + ...config, + ...search +] + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.XHR.prototype.send = function() { if (this.custom.xhr) { @@ -11,16 +29,13 @@ } this.proxy_send(...arguments) } -// Mock.setup({ -// timeout: '350-600' -// }) +Mock.setup({ + timeout: '350-600' +}) -// User -Mock.mock(/\/user\/login/, 'post', userAPI.login) -Mock.mock(/\/user\/info/, 'get', userAPI.getInfo) -Mock.mock(/\/user\/logout/, 'post', userAPI.logout) - -// Table -Mock.mock(/\/table\/list/, 'get', tableAPI.list) +for (const i of mocks) { + console.log(i) + Mock.mock(new RegExp(i.url), i.type || 'get', i.response) +} export default Mock diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 0000000..4c4cb2a --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,68 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocks).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/mock/remote-search.js b/mock/remote-search.js new file mode 100644 index 0000000..bb33c2f --- /dev/null +++ b/mock/remote-search.js @@ -0,0 +1,51 @@ +import Mock from 'mockjs' + +const NameList = [] +const count = 100 + +for (let i = 0; i < count; i++) { + NameList.push(Mock.mock({ + name: '@first' + })) +} +NameList.push({ name: 'mock-Pan' }) + +export default [ + // username search + { + url: '/search/user', + type: 'get', + response: config => { + const { name } = config.query + const mockNameList = NameList.filter(item => { + const lowerCaseName = item.name.toLowerCase() + return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0) + }) + return { + code: 20000, + data: { items: mockNameList } + } + } + }, + + // transaction list + { + url: '/transaction/list', + type: 'get', + response: _ => { + return { + code: 20000, + data: { + total: 20, + 'items|20': [{ + order_no: '@guid()', + timestamp: +Mock.Random.date('T'), + username: '@name()', + price: '@float(1000, 15000, 0, 2)', + 'status|1': ['success', 'pending'] + }] + } + } + } + } +] diff --git a/mock/system/area.js b/mock/system/area.js new file mode 100644 index 0000000..3495001 --- /dev/null +++ b/mock/system/area.js @@ -0,0 +1,83 @@ +const list = [ + { + 'id': '11010100102', + 'lat': '', + 'level': 5, + 'levelName': '社区', + 'lng': '', + 'name': '测试社区3', + 'num': 1, + 'pid': '110101001', + 'pids': '[0],[110000],[110100],[110101],[110101001],', + 'simplename': '测试社区2' + } +] +export default [ + // mock get all routes form server + { + url: '/area/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/area/list', + type: 'get', + response: _ => { + return { + code: 200, + data: [ + { + 'id': '110000', + 'pid': '0', + 'name': '北京市', + 'level': 1, + 'pids': [0], + 'levelName': '省级', + 'simplename': '北京' + } + ] + } + } + }, + { + url: '/area/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/area/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/config.js b/mock/system/config.js new file mode 100644 index 0000000..ab64c0a --- /dev/null +++ b/mock/system/config.js @@ -0,0 +1,18 @@ +export default [ + { + url: '/config/baseConfig', + type: 'get', + response: _ => { + return { + 'code': 200, + 'data': { + 'kaptcha': false, + 'publicKey': 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu5k8gcTFJy5UtMfmtKiR3f/EcUe93kzfteRj6+sM5fHRvOib82+uqQMjgaRZiMcr3HiHIFY5vA6c+Rfb5R2COitoOhxyA9U2eLXknzxLUQIAqXAvKQO8KnerA1Qjcds7xhJB2XPhWFlY4RVtMT2wr2lMd29QDE4F/kzyDhNBpxwIDAQAB', + 'sid': 'f390b7d7-337b-431b-be22-fb860a6c04d4' + }, + 'message': '请求成功', + 'success': true + } + } + } +] diff --git a/mock/system/dept.js b/mock/system/dept.js new file mode 100644 index 0000000..30675b9 --- /dev/null +++ b/mock/system/dept.js @@ -0,0 +1,88 @@ +const list = [ + { + 'id': '1', + 'simplename': '二分公司', + 'fullname': '二分公司', + 'num': 1, + 'pid': '0', + 'pids': '[0,1,2]', + 'pName': '顶级', + 'version': '', + 'tips': '' + } +] +export default [ + // mock get all routes form server + { + url: '/dept/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: list + } + } + } + }, + { + url: '/dept/tree', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: [ + { + 'id': '0', + 'pid': '', + 'name': '顶级', + 'open': 'false', + 'checked': '' + }, + { + 'id': '26', + 'pid': '24', + 'name': '运行二所', + 'open': 'false', + 'checked': '' + } + ] + } + } + } + }, + { + url: '/dept/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dept/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/dict.js b/mock/system/dict.js new file mode 100644 index 0000000..75410dc --- /dev/null +++ b/mock/system/dict.js @@ -0,0 +1,69 @@ +const list = [ + { + 'code': 'sysStatus', + 'num': 0, + 'name': '状态', + 'pid': '0', + 'id': '16', + 'detail': '1:启用:1;2:禁用:2', + 'tips': '' + }, + { + 'code': 'sysSex', + 'num': 0, + 'name': '性别', + 'pid': '0', + 'id': '29', + 'detail': '1:男:1;2:女:2', + 'tips': '' + } +] +export default [ + // mock get all routes form server + { + url: '/dict/listPage', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/dict/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dict/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/dict/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/log.js b/mock/system/log.js new file mode 100644 index 0000000..41f2e94 --- /dev/null +++ b/mock/system/log.js @@ -0,0 +1,115 @@ +const logTypes = [ + { + 'value': '0', + 'name': '业务日志' + }, + { + 'value': '1', + 'name': '登录日志' + } +] +const loglist = [ + { + 'id': 'c4cdba483fb1449aaad1e6c49353c6b3', + 'logtype': '业务日志', + 'createtime': '2019-04-04 14:23:31', + 'logname': '修改用户', + 'succeed': '成功', + 'deptid': '24', + 'deptName': '总公司', + 'message': '账号=yxssadmin...', + 'userName': 'bruser', + 'userid': '45' + } +] +const loginloglist = [ + { + 'createtime': '2020-03-26 16:03:23', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.184', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }, + { + 'createtime': '2020-03-26 15:13:50', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.184', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }, + { + 'createtime': '2020-03-26 14:47:05', + 'logname': '登录日志', + 'succeed': '成功', + 'ip': '192.168.8.105', + 'deptid': '0', + 'message': '', + 'userName': '超级管理员', + 'userid': '1' + }] +export default [ + { + url: '/loginLog/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + rows: loginloglist, + total: 2 + } + } + } + }, + { + url: '/log/list', + type: 'post', + response: _ => { + return { + code: 200, + data: { + rows: loglist, + total: 2 + } + } + } + }, + { + url: '/log/detail', + type: 'get', + response: _ => { + return { + code: 200, + data: { + "createtime":"2020-03-26", + "logtype":"业务日志", + "classname":"com.casic.missiles.modular.system.controller.RoleController", + "method":"dataAuthor", + "logname":"数据权限配置", + "succeed":"成功", + "id":"1243081729056264193", + "message":"角色名称=十一室管理员,资源名称=", + "userName":"超级管理员", + "regularMessage":"角色名称=十一室管理员,资源名称=", + "userid":"1" + } + } + } + }, + { + url: '/dict/code/logType', + type: 'get', + response: _ => { + return { + code: 200, + data: logTypes + } + } + } +] diff --git a/mock/system/resource.js b/mock/system/resource.js new file mode 100644 index 0000000..9d4a048 --- /dev/null +++ b/mock/system/resource.js @@ -0,0 +1,1569 @@ +const tree = [ + { + 'checked': false, + 'code': 'system', + 'id': '105', + 'name': '系统管理', + 'open': false, + 'pcodes': '[0],[sys],', + 'pid': '1189107859077373954', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr', + 'id': '106', + 'name': '用户管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_add', + 'id': '107', + 'name': '添加用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_edit', + 'id': '108', + 'name': '修改用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_delete', + 'id': '109', + 'name': '删除用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_reset', + 'id': '110', + 'name': '重置密码', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_freeze', + 'id': '111', + 'name': '冻结用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_unfreeze', + 'id': '112', + 'name': '解除冻结用户', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_setRole', + 'id': '113', + 'name': '分配角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'role', + 'id': '114', + 'name': '角色管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_add', + 'id': '115', + 'name': '添加角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_edit', + 'id': '116', + 'name': '修改角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_remove', + 'id': '117', + 'name': '删除角色', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_setAuthority', + 'id': '118', + 'name': '配置权限', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu', + 'id': '119', + 'name': '资源管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_add', + 'id': '120', + 'name': '添加菜单', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_edit', + 'id': '121', + 'name': '修改菜单', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_remove', + 'id': '122', + 'name': '删除菜单', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'log', + 'id': '128', + 'name': '日志管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept', + 'id': '131', + 'name': '组织管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict', + 'id': '132', + 'name': '字典管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'loginLog', + 'id': '133', + 'name': '登录日志', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'log_clean', + 'id': '134', + 'name': '清空日志', + 'open': false, + 'pcodes': '[0],[sys],[system],[log],', + 'pid': '128', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_add', + 'id': '135', + 'name': '添加部门', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_update', + 'id': '136', + 'name': '修改部门', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_delete', + 'id': '137', + 'name': '删除部门', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_add', + 'id': '138', + 'name': '添加字典', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_update', + 'id': '139', + 'name': '修改字典', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_delete', + 'id': '140', + 'name': '删除字典', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'menu_list', + 'id': '151', + 'name': '菜单列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[menu],', + 'pid': '119', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_list', + 'id': '153', + 'name': '部门列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dept_detail', + 'id': '154', + 'name': '部门详情', + 'open': false, + 'pcodes': '[0],[sys],[system],[dept],', + 'pid': '131', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_list', + 'id': '156', + 'name': '字典列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'dict_detail', + 'id': '157', + 'name': '字典详情', + 'open': false, + 'pcodes': '[0],[sys],[system],[dict],', + 'pid': '132', + 'value': '' + }, + { + 'checked': false, + 'code': 'log_list', + 'id': '158', + 'name': '日志列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[log],', + 'pid': '128', + 'value': '' + }, + { + 'checked': false, + 'code': 'log_detail', + 'id': '159', + 'name': '日志详情', + 'open': false, + 'pcodes': '[0],[sys],[system],[log],', + 'pid': '128', + 'value': '' + }, + { + 'checked': false, + 'code': 'del_login_log', + 'id': '160', + 'name': '清空登录日志', + 'open': false, + 'pcodes': '[0],[sys],[system],[loginLog],', + 'pid': '133', + 'value': '' + }, + { + 'checked': false, + 'code': 'login_log_list', + 'id': '161', + 'name': '登录日志列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[loginLog],', + 'pid': '133', + 'value': '' + }, + { + 'checked': false, + 'code': 'role_list', + 'id': '164', + 'name': '角色列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'mgr_list', + 'id': '167', + 'name': '用户列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[mgr],', + 'pid': '106', + 'value': '' + }, + { + 'checked': false, + 'code': 'data_author', + 'id': '1138364388198715393', + 'name': '数据权限', + 'open': false, + 'pcodes': '[0],[sys],[system],[role],', + 'pid': '114', + 'value': '' + }, + { + 'checked': false, + 'code': 'AreaAdmin', + 'id': '1170945119300976642', + 'name': '区域管理', + 'open': false, + 'pcodes': '[0],[sys],[system],', + 'pid': '105', + 'value': '' + }, + { + 'checked': false, + 'code': 'sys', + 'id': '1189107859077373954', + 'name': '基础权限管理', + 'open': true, + 'pcodes': '[0],', + 'pid': '0', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_listPage', + 'id': '1191975090689810434', + 'name': '区域列表', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_add', + 'id': '1191975312815955969', + 'name': '新增区域', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_update', + 'id': '1191975427559530497', + 'name': '修改区域', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': false, + 'code': 'area_delete', + 'id': '1191975543687225346', + 'name': '区域删除', + 'open': false, + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'pid': '1170945119300976642', + 'value': '' + }, + { + 'checked': true, + 'code': '', + 'id': '0', + 'name': '顶级', + 'open': true, + 'pcodes': '', + 'pid': '', + 'value': '' + } +] +const list = [ + { + 'isopen': '1', + 'code': 'system', + 'pcode': 'sys', + 'num': 4, + 'icon': 'icon-setting', + 'pid': '1189107859077373954', + 'isMenu': '是', + 'url': '/system', + 'tips': '', + 'pcodes': '[0],[sys],', + 'name': '系统管理', + 'statusName': '启用', + 'id': '105', + 'ismenu': '1', + 'levels': 2, + 'open': true, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'mgr', + 'pcode': 'system', + 'num': 1, + 'icon': 'icon-user', + 'pid': '105', + 'isMenu': '是', + 'url': '/mgr', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '用户管理', + 'statusName': '启用', + 'id': '106', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'mgr_add', + 'pcode': 'mgr', + 'num': 1, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '添加用户', + 'statusName': '启用', + 'id': '107', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_edit', + 'pcode': 'mgr', + 'num': 2, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '修改用户', + 'statusName': '启用', + 'id': '108', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_delete', + 'pcode': 'mgr', + 'num': 3, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '删除用户', + 'statusName': '启用', + 'id': '109', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_reset', + 'pcode': 'mgr', + 'num': 4, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/reset', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '重置密码', + 'statusName': '启用', + 'id': '110', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_freeze', + 'pcode': 'mgr', + 'num': 5, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/freeze', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '冻结用户', + 'statusName': '启用', + 'id': '111', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_unfreeze', + 'pcode': 'mgr', + 'num': 6, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/unfreeze', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '解除冻结用户', + 'statusName': '启用', + 'id': '112', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_setRole', + 'pcode': 'mgr', + 'num': 7, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': '/mgr/roleAssign', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '分配角色', + 'statusName': '启用', + 'id': '113', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'role', + 'pcode': 'system', + 'num': 2, + 'icon': 'permission', + 'pid': '105', + 'isMenu': '是', + 'url': '/role', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '角色管理', + 'statusName': '启用', + 'id': '114', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'role_add', + 'pcode': 'role', + 'num': 1, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '添加角色', + 'statusName': '启用', + 'id': '115', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'role_edit', + 'pcode': 'role', + 'num': 2, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '修改角色', + 'statusName': '启用', + 'id': '116', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'role_remove', + 'pcode': 'role', + 'num': 3, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '删除角色', + 'statusName': '启用', + 'id': '117', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'role_setAuthority', + 'pcode': 'role', + 'num': 4, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/funcAuthor', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '配置权限', + 'statusName': '启用', + 'id': '118', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'menu', + 'pcode': 'system', + 'num': 4, + 'icon': 'function', + 'pid': '105', + 'isMenu': '是', + 'url': '/resource', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '资源管理', + 'statusName': '启用', + 'id': '119', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'menu_add', + 'pcode': 'menu', + 'num': 1, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '添加菜单', + 'statusName': '启用', + 'id': '120', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'menu_edit', + 'pcode': 'menu', + 'num': 2, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '修改菜单', + 'statusName': '启用', + 'id': '121', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'menu_remove', + 'pcode': 'menu', + 'num': 3, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '删除菜单', + 'statusName': '启用', + 'id': '122', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'log', + 'pcode': 'system', + 'num': 6, + 'icon': 'log', + 'pid': '105', + 'isMenu': '是', + 'url': '/log', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '日志管理', + 'statusName': '启用', + 'id': '128', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'dept', + 'pcode': 'system', + 'num': 3, + 'icon': 'dept2', + 'pid': '105', + 'isMenu': '是', + 'url': '/dept', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '组织管理', + 'statusName': '启用', + 'id': '131', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'dict', + 'pcode': 'system', + 'num': 4, + 'icon': 'icon-dict', + 'pid': '105', + 'isMenu': '是', + 'url': '/dict', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '字典管理', + 'statusName': '启用', + 'id': '132', + 'ismenu': '1', + 'levels': 3, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'loginLog', + 'pcode': 'system', + 'num': 6, + 'icon': 'task', + 'pid': '105', + 'isMenu': '是', + 'url': '/loginLog', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '登录日志', + 'statusName': '启用', + 'id': '133', + 'ismenu': '1', + 'levels': 2, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'log_clean', + 'pcode': 'log', + 'num': 3, + 'icon': '', + 'pid': '128', + 'isMenu': '不是', + 'url': '/log/delLog', + 'tips': '', + 'pcodes': '[0],[sys],[system],[log],', + 'name': '清空日志', + 'statusName': '启用', + 'id': '134', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_add', + 'pcode': 'dept', + 'num': 1, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '添加部门', + 'statusName': '启用', + 'id': '135', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_update', + 'pcode': 'dept', + 'num': 1, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '修改部门', + 'statusName': '启用', + 'id': '136', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_delete', + 'pcode': 'dept', + 'num': 1, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '删除部门', + 'statusName': '启用', + 'id': '137', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_add', + 'pcode': 'dict', + 'num': 1, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '添加字典', + 'statusName': '启用', + 'id': '138', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_update', + 'pcode': 'dict', + 'num': 1, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '修改字典', + 'statusName': '启用', + 'id': '139', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_delete', + 'pcode': 'dict', + 'num': 1, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '删除字典', + 'statusName': '启用', + 'id': '140', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'menu_list', + 'pcode': 'menu', + 'num': 5, + 'icon': '', + 'pid': '119', + 'isMenu': '不是', + 'url': '/resource/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[menu],', + 'name': '菜单列表', + 'statusName': '启用', + 'id': '151', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'dept_list', + 'pcode': 'dept', + 'num': 5, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '部门列表', + 'statusName': '启用', + 'id': '153', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dept_detail', + 'pcode': 'dept', + 'num': 6, + 'icon': '', + 'pid': '131', + 'isMenu': '不是', + 'url': '/dept/detail', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dept],', + 'name': '部门详情', + 'statusName': '启用', + 'id': '154', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_list', + 'pcode': 'dict', + 'num': 5, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '字典列表', + 'statusName': '启用', + 'id': '156', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'dict_detail', + 'pcode': 'dict', + 'num': 6, + 'icon': '', + 'pid': '132', + 'isMenu': '不是', + 'url': '/dict/detail', + 'tips': '', + 'pcodes': '[0],[sys],[system],[dict],', + 'name': '字典详情', + 'statusName': '启用', + 'id': '157', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'log_list', + 'pcode': 'log', + 'num': 2, + 'icon': '', + 'pid': '128', + 'isMenu': '不是', + 'url': '/log/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[log],', + 'name': '日志列表', + 'statusName': '启用', + 'id': '158', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'log_detail', + 'pcode': 'log', + 'num': 3, + 'icon': '', + 'pid': '128', + 'isMenu': '不是', + 'url': '/log/detail', + 'tips': '', + 'pcodes': '[0],[sys],[system],[log],', + 'name': '日志详情', + 'statusName': '启用', + 'id': '159', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'del_login_log', + 'pcode': 'loginLog', + 'num': 1, + 'icon': '', + 'pid': '133', + 'isMenu': '不是', + 'url': '/loginLog/delLoginLog', + 'tips': '', + 'pcodes': '[0],[sys],[system],[loginLog],', + 'name': '清空登录日志', + 'statusName': '启用', + 'id': '160', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'login_log_list', + 'pcode': 'loginLog', + 'num': 2, + 'icon': '', + 'pid': '133', + 'isMenu': '不是', + 'url': '/loginLog/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[loginLog],', + 'name': '登录日志列表', + 'statusName': '启用', + 'id': '161', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'role_list', + 'pcode': 'role', + 'num': 7, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '角色列表', + 'statusName': '启用', + 'id': '164', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'mgr_list', + 'pcode': 'mgr', + 'num': 10, + 'icon': '', + 'pid': '106', + 'isMenu': '不是', + 'url': ' /mgr/list', + 'tips': '', + 'pcodes': '[0],[sys],[system],[mgr],', + 'name': '用户列表', + 'statusName': '启用', + 'id': '167', + 'ismenu': '0', + 'levels': 3, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'data_author', + 'pcode': 'role', + 'num': 0, + 'icon': '', + 'pid': '114', + 'isMenu': '不是', + 'url': '/role/dataAuthor', + 'tips': '', + 'pcodes': '[0],[sys],[system],[role],', + 'name': '数据权限', + 'statusName': '启用', + 'id': '1138364388198715393', + 'ismenu': '0', + 'levels': 2, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '0' + }, + { + 'isopen': '0', + 'code': 'AreaAdmin', + 'pcode': 'system', + 'num': 0, + 'icon': 'icon-base', + 'pid': '105', + 'isMenu': '是', + 'url': '/area', + 'tips': '', + 'pcodes': '[0],[sys],[system],', + 'name': '区域管理', + 'statusName': '启用', + 'id': '1170945119300976642', + 'ismenu': '1', + 'levels': 3, + 'open': false, + 'resourceTypeName': '菜单', + 'status': '1', + 'resourceType': '03' + }, + { + 'isopen': '0', + 'code': 'sys', + 'pcode': '0', + 'num': 0, + 'icon': 'icon-setting', + 'pid': '0', + 'isMenu': '不是', + 'url': '/sys', + 'tips': '', + 'pcodes': '[0],', + 'name': '基础权限管理', + 'statusName': '启用', + 'id': '1189107859077373954', + 'ismenu': '0', + 'levels': 1, + 'open': false, + 'resourceTypeName': '', + 'status': '1', + 'resourceType': '02' + }, + { + 'isopen': '0', + 'code': 'area_listPage', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/listPage', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '区域列表', + 'statusName': '启用', + 'id': '1191975090689810434', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'area_add', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/add', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '新增区域', + 'statusName': '启用', + 'id': '1191975312815955969', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'area_update', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/update', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '修改区域', + 'statusName': '启用', + 'id': '1191975427559530497', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + }, + { + 'isopen': '0', + 'code': 'area_delete', + 'pcode': 'AreaAdmin', + 'num': 0, + 'icon': '', + 'pid': '1170945119300976642', + 'isMenu': '不是', + 'url': '/area/delete', + 'tips': '', + 'pcodes': '[0],[sys],[system],[AreaAdmin],', + 'name': '区域删除', + 'statusName': '启用', + 'id': '1191975543687225346', + 'ismenu': '0', + 'levels': 4, + 'open': false, + 'resourceTypeName': '按钮', + 'status': '1', + 'resourceType': '04' + } +] +export default [ + // mock get all routes form server + { + url: '/resource/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: list + } + } + } + }, + + // mock get all roles form server + { + url: '/resource/tree', + type: 'get', + response: _ => { + return { + 'code': 200, + 'message': 'success', + 'data': { + 'list': tree + } + } + } + }, + { + url: '/dict/code/resourceType', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: [ + { + 'name': '菜单', + 'id': '55', + 'value': '03' + }, + { + 'name': '按钮', + 'id': '56', + 'value': '04' + } + ] + } + } + }, + { + url: '/resource/treeListByRoleId', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: { + 'list': tree + } + } + } + }, + { + url: 'resource/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/resource/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/resource/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/role.js b/mock/system/role.js new file mode 100644 index 0000000..f555ddf --- /dev/null +++ b/mock/system/role.js @@ -0,0 +1,180 @@ +const tree = [ + { + "id":1, + "pid":"0", + "name":"超级管理员" + } +] +const list = [ + { + "deptName":"顶级", + "pName":"", + "num":1, + "name":"超级管理员", + "deptid":"0", + "pid":"0", + "id":1, + "version":1, + "tips":"administrator" + }, + { + "deptName":"高压管网分公司", + "pName":"超级管理员", + "num":2, + "name":"高压管网分公司系统管理员", + "deptid":"24", + "pid":1, + "id":2, + "version":"", + "tips":"rqadmin" + } +] +export default [ + // mock get all routes form server + { + url: '/role/list', + type: 'get', + response: _ => { + return { + code: 200, + data: { + list: list + } + } + } + }, + + // mock get all roles form server + { + url: '/role/tree', + type: 'get', + response: _ => { + return { + 'code': 200, + 'message': 'success', + 'data': { + 'list': tree + } + } + } + }, + { + url: '/dict/code/roleType', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: [ + { + 'name': '菜单', + 'id': '55', + 'value': '03' + }, + { + 'name': '按钮', + 'id': '56', + 'value': '04' + } + ] + } + } + }, + { + url: '/role/treeByUserId', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: { + 'list': [ + { + "id":1, + "pid":"0", + "name":"超级管理员", + "open":true, + "checked":false + } + ] + } + } + } + }, + { + url: '/role/treeByRoleId', + type: 'get', + response: _ => { + return { + code: 200, + message: 'success', + data: { + 'list': [ + { + "id":"26", + "pid":"24", + "name":"运行二所", + "open":true, + "checked":true + } + ] + } + } + } + }, + { + url: '/role/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/role/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/role/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/role/funcAuthor', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/role/dataAuthor', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +] diff --git a/mock/system/user.js b/mock/system/user.js new file mode 100644 index 0000000..5b377e6 --- /dev/null +++ b/mock/system/user.js @@ -0,0 +1,860 @@ +// 用户详情 +const userinfo = { + 'account': 'admin', + 'avatar': 'girl.gif', + 'dataScope': [ + '0', + '1236854643826184194', + '1236856061500936193', + '1236856816081391617', + '1236856889875976194', + '1236856952987668481', + '1236857009937928194', + '1236857134915604482', + '1236857274443321346', + '1236857346400800770', + '1236857428776931330', + '1236857492744261633', + '1236857661695021057', + '1236857767731220481', + '1236857826057211905', + '1236857873113108481', + '1236857966566395906', + '1236858049731055618', + '1236858125752815618', + '1236858179561541633', + '1236858248830472194', + '1236858330946555905', + '1236858380556783617', + '1236858422894088194', + '1236858475780067330', + '1236858517333037058', + '1236858579396153346', + '1236858642176495618', + '1236858704961032194', + '1236858748544045057', + '1236858806672904193', + '1236858863296008193', + '1236858908317667330' + ], + 'deptId': '0', + 'deptName': '顶级', + 'devices': [], + 'id': '1', + 'ipAddr': '124.64.16.144', + 'name': '超超级管理员', + 'phone': '18200000000', + 'roleList': [ + '1' + ], + 'roleNames': [ + '超级管理员' + ], + 'roleTips': [ + 'administrator' + ], + 'scopeType': '4', + 'targetId': '', + 'targetName': '', + 'tenantId': '' +} +const list = [ + { + 'birthday': '2017-05-05 00:00:00', + 'deptName': '顶级', + 'createtime': '2016-01-29 08:49:53', + 'roleid': '1', + 'sex': '2', + 'deptid': '0', + 'avatar': 'girl.gif', + 'version': 25, + 'phone': '18200000000', + 'sexName': '女', + 'name': '超级管理员', + 'roleName': '超级管理员', + 'statusName': '启用', + 'id': '1', + 'account': 'admin', + 'email': 'sn93@qq.com', + 'status': '1' + } +] +// 权限列表 +const permisson = { + 'menus': [ + { + 'children': '', + 'code': 'sys', + 'icon': 'icon-setting', + 'id': '1189107859077373954', + 'ismenu': '0', + 'levels': 1, + 'name': '基础权限管理', + 'num': 0, + 'parentId': '0', + 'resourceType': '02', + 'url': '/sys' + }, + { + 'children': '', + 'code': 'data_author', + 'icon': '', + 'id': '1138364388198715393', + 'ismenu': '0', + 'levels': 2, + 'name': '数据权限', + 'num': 0, + 'parentId': '114', + 'resourceType': '0', + 'url': '/role/dataAuthor' + }, + { + 'children': '', + 'code': 'mgr', + 'icon': 'icon-user', + 'id': '106', + 'ismenu': '1', + 'levels': 2, + 'name': '用户管理', + 'num': 1, + 'parentId': '105', + 'resourceType': '03', + 'url': '/mgr' + }, + { + 'children': '', + 'code': 'role', + 'icon': 'permission', + 'id': '114', + 'ismenu': '1', + 'levels': 2, + 'name': '角色管理', + 'num': 2, + 'parentId': '105', + 'resourceType': '03', + 'url': '/role' + }, + { + 'children': '', + 'code': 'role_edit', + 'icon': '', + 'id': '116', + 'ismenu': '0', + 'levels': 2, + 'name': '修改角色', + 'num': 2, + 'parentId': '114', + 'resourceType': '0', + 'url': '/role/update' + }, + { + 'children': '', + 'code': 'role_remove', + 'icon': '', + 'id': '117', + 'ismenu': '0', + 'levels': 2, + 'name': '删除角色', + 'num': 3, + 'parentId': '114', + 'resourceType': '0', + 'url': '/role/delete' + }, + { + 'children': '', + 'code': 'dept', + 'icon': 'dept2', + 'id': '131', + 'ismenu': '1', + 'levels': 2, + 'name': '组织管理', + 'num': 3, + 'parentId': '105', + 'resourceType': '03', + 'url': '/dept' + }, + { + 'children': '', + 'code': 'menu', + 'icon': 'function', + 'id': '119', + 'ismenu': '1', + 'levels': 2, + 'name': '资源管理', + 'num': 4, + 'parentId': '105', + 'resourceType': '03', + 'url': '/resource' + }, + { + 'children': '', + 'code': 'role_setAuthority', + 'icon': '', + 'id': '118', + 'ismenu': '0', + 'levels': 2, + 'name': '配置权限', + 'num': 4, + 'parentId': '114', + 'resourceType': '0', + 'url': '/role/funcAuthor' + }, + { + 'children': '', + 'code': 'system', + 'icon': 'icon-setting', + 'id': '105', + 'ismenu': '1', + 'levels': 2, + 'name': '系统管理', + 'num': 4, + 'parentId': '1189107859077373954', + 'resourceType': '03', + 'url': '/system' + }, + { + 'children': '', + 'code': 'menu_list', + 'icon': '', + 'id': '151', + 'ismenu': '0', + 'levels': 2, + 'name': '菜单列表', + 'num': 5, + 'parentId': '119', + 'resourceType': '0', + 'url': '/resource/list' + }, + { + 'children': '', + 'code': 'loginLog', + 'icon': 'task', + 'id': '133', + 'ismenu': '1', + 'levels': 2, + 'name': '登录日志', + 'num': 6, + 'parentId': '105', + 'resourceType': '03', + 'url': '/loginLog' + }, + { + 'children': '', + 'code': 'log', + 'icon': 'log', + 'id': '128', + 'ismenu': '1', + 'levels': 2, + 'name': '日志管理', + 'num': 6, + 'parentId': '105', + 'resourceType': '03', + 'url': '/log' + }, + { + 'children': '', + 'code': 'AreaAdmin', + 'icon': 'icon-base', + 'id': '1170945119300976642', + 'ismenu': '1', + 'levels': 3, + 'name': '区域管理', + 'num': 0, + 'parentId': '105', + 'resourceType': '03', + 'url': '/area' + }, + { + 'children': '', + 'code': 'visitor_permission', + 'icon': '', + 'id': '1202403877222735874', + 'ismenu': '1', + 'levels': 3, + 'name': '访客授权列表', + 'num': 0, + 'parentId': '1202403125913837569', + 'resourceType': '03', + 'url': '/acsPermission/listVisitorPerm' + }, + { + 'children': '', + 'code': 'dept_delete', + 'icon': '', + 'id': '137', + 'ismenu': '0', + 'levels': 3, + 'name': '删除部门', + 'num': 1, + 'parentId': '131', + 'resourceType': '04', + 'url': '/dept/delete' + }, + { + 'children': '', + 'code': 'role_add', + 'icon': '', + 'id': '115', + 'ismenu': '0', + 'levels': 3, + 'name': '添加角色', + 'num': 1, + 'parentId': '114', + 'resourceType': '04', + 'url': '/role/add' + }, + { + 'children': '', + 'code': 'dict_add', + 'icon': '', + 'id': '138', + 'ismenu': '0', + 'levels': 3, + 'name': '添加字典', + 'num': 1, + 'parentId': '132', + 'resourceType': '04', + 'url': '/user/add' + }, + { + 'children': '', + 'code': 'dict_delete', + 'icon': '', + 'id': '140', + 'ismenu': '0', + 'levels': 3, + 'name': '删除字典', + 'num': 1, + 'parentId': '132', + 'resourceType': '04', + 'url': '/user/delete' + }, + { + 'children': '', + 'code': 'dept_add', + 'icon': '', + 'id': '135', + 'ismenu': '0', + 'levels': 3, + 'name': '添加部门', + 'num': 1, + 'parentId': '131', + 'resourceType': '04', + 'url': '/dept/add' + }, + { + 'children': '', + 'code': 'del_login_log', + 'icon': '', + 'id': '160', + 'ismenu': '0', + 'levels': 3, + 'name': '清空登录日志', + 'num': 1, + 'parentId': '133', + 'resourceType': '04', + 'url': '/loginLog/delLoginLog' + }, + { + 'children': '', + 'code': 'dict_update', + 'icon': '', + 'id': '139', + 'ismenu': '0', + 'levels': 3, + 'name': '修改字典', + 'num': 1, + 'parentId': '132', + 'resourceType': '04', + 'url': '/user/update' + }, + { + 'children': '', + 'code': 'menu_add', + 'icon': '', + 'id': '120', + 'ismenu': '0', + 'levels': 3, + 'name': '添加菜单', + 'num': 1, + 'parentId': '119', + 'resourceType': '04', + 'url': '/resource/add' + }, + { + 'children': '', + 'code': 'mgr_add', + 'icon': '', + 'id': '107', + 'ismenu': '0', + 'levels': 3, + 'name': '添加用户', + 'num': 1, + 'parentId': '106', + 'resourceType': '04', + 'url': '/mgr/add' + }, + { + 'children': '', + 'code': 'dept_update', + 'icon': '', + 'id': '136', + 'ismenu': '0', + 'levels': 3, + 'name': '修改部门', + 'num': 1, + 'parentId': '131', + 'resourceType': '04', + 'url': '/dept/update' + }, + { + 'children': '', + 'code': 'menu_edit', + 'icon': '', + 'id': '121', + 'ismenu': '0', + 'levels': 3, + 'name': '修改菜单', + 'num': 2, + 'parentId': '119', + 'resourceType': '04', + 'url': '/resource/update' + }, + { + 'children': '', + 'code': 'mgr_edit', + 'icon': '', + 'id': '108', + 'ismenu': '0', + 'levels': 3, + 'name': '修改用户', + 'num': 2, + 'parentId': '106', + 'resourceType': '04', + 'url': '/mgr/update' + }, + { + 'children': '', + 'code': 'log_list', + 'icon': '', + 'id': '158', + 'ismenu': '0', + 'levels': 3, + 'name': '日志列表', + 'num': 2, + 'parentId': '128', + 'resourceType': '04', + 'url': '/log/list' + }, + { + 'children': '', + 'code': 'login_log_list', + 'icon': '', + 'id': '161', + 'ismenu': '0', + 'levels': 3, + 'name': '登录日志列表', + 'num': 2, + 'parentId': '133', + 'resourceType': '04', + 'url': '/loginLog/list' + }, + { + 'children': '', + 'code': 'log_clean', + 'icon': '', + 'id': '134', + 'ismenu': '0', + 'levels': 3, + 'name': '清空日志', + 'num': 3, + 'parentId': '128', + 'resourceType': '04', + 'url': '/log/delLog' + }, + { + 'children': '', + 'code': 'log_detail', + 'icon': '', + 'id': '159', + 'ismenu': '0', + 'levels': 3, + 'name': '日志详情', + 'num': 3, + 'parentId': '128', + 'resourceType': '04', + 'url': '/log/detail' + }, + { + 'children': '', + 'code': 'menu_remove', + 'icon': '', + 'id': '122', + 'ismenu': '0', + 'levels': 3, + 'name': '删除菜单', + 'num': 3, + 'parentId': '119', + 'resourceType': '04', + 'url': '/resource/delete' + }, + { + 'children': '', + 'code': 'mgr_delete', + 'icon': '', + 'id': '109', + 'ismenu': '0', + 'levels': 3, + 'name': '删除用户', + 'num': 3, + 'parentId': '106', + 'resourceType': '04', + 'url': '/mgr/delete' + }, + { + 'children': '', + 'code': 'mgr_reset', + 'icon': '', + 'id': '110', + 'ismenu': '0', + 'levels': 3, + 'name': '重置密码', + 'num': 4, + 'parentId': '106', + 'resourceType': '04', + 'url': '/mgr/reset' + }, + { + 'children': '', + 'code': 'dict', + 'icon': 'icon-dict', + 'id': '132', + 'ismenu': '1', + 'levels': 3, + 'name': '字典管理', + 'num': 4, + 'parentId': '105', + 'resourceType': '03', + 'url': '/user' + }, + { + 'children': '', + 'code': 'dept_list', + 'icon': '', + 'id': '153', + 'ismenu': '0', + 'levels': 3, + 'name': '部门列表', + 'num': 5, + 'parentId': '131', + 'resourceType': '04', + 'url': '/dept/list' + }, + { + 'children': '', + 'code': 'dict_list', + 'icon': '', + 'id': '156', + 'ismenu': '0', + 'levels': 3, + 'name': '字典列表', + 'num': 5, + 'parentId': '132', + 'resourceType': '04', + 'url': '/user/list' + }, + { + 'children': '', + 'code': 'mgr_freeze', + 'icon': '', + 'id': '111', + 'ismenu': '0', + 'levels': 3, + 'name': '冻结用户', + 'num': 5, + 'parentId': '106', + 'resourceType': '04', + 'url': '/mgr/freeze' + }, + { + 'children': '', + 'code': 'dept_detail', + 'icon': '', + 'id': '154', + 'ismenu': '0', + 'levels': 3, + 'name': '部门详情', + 'num': 6, + 'parentId': '131', + 'resourceType': '04', + 'url': '/dept/detail' + }, + { + 'children': '', + 'code': 'dict_detail', + 'icon': '', + 'id': '157', + 'ismenu': '0', + 'levels': 3, + 'name': '字典详情', + 'num': 6, + 'parentId': '132', + 'resourceType': '04', + 'url': '/user/detail' + }, + { + 'children': '', + 'code': 'mgr_unfreeze', + 'icon': '', + 'id': '112', + 'ismenu': '0', + 'levels': 3, + 'name': '解除冻结用户', + 'num': 6, + 'parentId': '106', + 'resourceType': '04', + 'url': '/mgr/unfreeze' + }, + { + 'children': '', + 'code': 'role_list', + 'icon': '', + 'id': '164', + 'ismenu': '0', + 'levels': 3, + 'name': '角色列表', + 'num': 7, + 'parentId': '114', + 'resourceType': '04', + 'url': '/role/list' + }, + { + 'children': '', + 'code': 'mgr_setRole', + 'icon': '', + 'id': '113', + 'ismenu': '0', + 'levels': 3, + 'name': '分配角色', + 'num': 7, + 'parentId': '106', + 'resourceType': '04', + 'url': '/mgr/roleAssign' + }, + { + 'children': '', + 'code': 'mgr_list', + 'icon': '', + 'id': '167', + 'ismenu': '0', + 'levels': 3, + 'name': '用户列表', + 'num': 10, + 'parentId': '106', + 'resourceType': '04', + 'url': ' /mgr/list' + }, + { + 'children': '', + 'code': 'area_add', + 'icon': '', + 'id': '1191975312815955969', + 'ismenu': '0', + 'levels': 4, + 'name': '新增区域', + 'num': 0, + 'parentId': '1170945119300976642', + 'resourceType': '04', + 'url': '/area/add' + }, + { + 'children': '', + 'code': 'area_delete', + 'icon': '', + 'id': '1191975543687225346', + 'ismenu': '0', + 'levels': 4, + 'name': '区域删除', + 'num': 0, + 'parentId': '1170945119300976642', + 'resourceType': '04', + 'url': '/area/delete' + }, + { + 'children': '', + 'code': 'area_listPage', + 'icon': '', + 'id': '1191975090689810434', + 'ismenu': '0', + 'levels': 4, + 'name': '区域列表', + 'num': 0, + 'parentId': '1170945119300976642', + 'resourceType': '04', + 'url': '/area/listPage' + }, + { + 'children': '', + 'code': 'area_update', + 'icon': '', + 'id': '1191975427559530497', + 'ismenu': '0', + 'levels': 4, + 'name': '修改区域', + 'num': 0, + 'parentId': '1170945119300976642', + 'resourceType': '04', + 'url': '/area/update' + } + ] +} +export default [ + { + url: '/user/login', + type: 'post', + response: _ => { + return { + code: 200, + success: true, + data: { + kaptcha: '', + token: '02deb42b-5298-431a-b690-d04573c18281' + + } + } + } + }, + { + url: '/user/info', + type: 'get', + response: _ => { + return { + code: 200, + success: true, + data: userinfo + } + } + }, + { + url: '/user/permission', + type: 'get', + response: _ => { + return { + code: 200, + success: true, + data: permisson + } + } + }, + { + url: '/user/logout', + type: 'get', + response: _ => { + return { + code: 200, + success: true + } + } + }, + { + url: '/mgr/list', + type: 'post', + response: _ => { + return { + code: 200, + data: { + rows: list, + total: 2 + } + } + } + }, + { + url: '/mgr/add', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/mgr/update', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/mgr/delete', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/mgr/freeze', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/mgr/unfreeze', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/mgr/reset', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/mgr/roleAssign', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + }, + { + url: '/mgr/changePwd', + type: 'post', + response: _ => { + return { + code: 200, + message: 'success', + data: {} + } + } + } +]