离校前端框架,包括数据字典、工作队伍、新闻公告模块
diff --git a/leave-school-vue/src/mock/auditscope.js b/leave-school-vue/src/mock/auditscope.js
new file mode 100644
index 0000000..b1f233c
--- /dev/null
+++ b/leave-school-vue/src/mock/auditscope.js
@@ -0,0 +1,69 @@
+import Mock from 'mockjs'
+import { param2Obj } from '@/utils'
+
+const auditscopeList = Mock.mock({
+  'list|50': [{
+    'id': '@increment',
+    'fwkzmc': '@cword(6, 15)',
+    'fwkzsxl': '@word(15)'
+  }]
+}).list
+
+export default{
+  getList: config => {
+    const { fwkzmc, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = auditscopeList.filter(item => {
+      if (fwkzmc && item.fwkzmc !== fwkzmc) return false
+      return true
+    })
+
+    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
+    return {
+      items: pageList,
+      recordCount: mockList.length,
+      code: 200
+    }
+  },
+  getItem: config => {
+    const { id } = param2Obj(config.url)
+    const mockList = auditscopeList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const auditscope = JSON.parse(config.body)
+    if (!auditscope.id) {
+      auditscope.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      auditscopeList.unshift(auditscope)
+    } else {
+      for (let i = 0; i < auditscopeList.length; i++) {
+        if (auditscopeList[i].id + '' === auditscope.id + '') {
+          auditscopeList.splice(i, 1, auditscope)
+          break
+        }
+      }
+    }
+    return {
+      item: auditscope,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const auditscope = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < auditscopeList.length; i++) {
+      if (auditscopeList[i].id + '' === auditscope.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      auditscopeList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/autoaudittype.js b/leave-school-vue/src/mock/autoaudittype.js
new file mode 100644
index 0000000..ab77486
--- /dev/null
+++ b/leave-school-vue/src/mock/autoaudittype.js
@@ -0,0 +1,69 @@
+import Mock from 'mockjs'
+import { param2Obj } from '@/utils'
+
+const autoaudittypeList = Mock.mock({
+  'list|50': [{
+    'id': '@increment',
+    'zdshlxmc': '@cword(6, 15)',
+    'zdshlxsxl': '@word(15)'
+  }]
+}).list
+
+export default{
+  getList: config => {
+    const { zdshlxmc, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = autoaudittypeList.filter(item => {
+      if (zdshlxmc && item.zdshlxmc !== zdshlxmc) return false
+      return true
+    })
+
+    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
+    return {
+      items: pageList,
+      recordCount: mockList.length,
+      code: 200
+    }
+  },
+  getItem: config => {
+    const { id } = param2Obj(config.url)
+    const mockList = autoaudittypeList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const autoaudittype = JSON.parse(config.body)
+    if (!autoaudittype.id) {
+      autoaudittype.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      autoaudittypeList.unshift(autoaudittype)
+    } else {
+      for (let i = 0; i < autoaudittypeList.length; i++) {
+        if (autoaudittypeList[i].id + '' === autoaudittype.id + '') {
+          autoaudittypeList.splice(i, 1, autoaudittype)
+          break
+        }
+      }
+    }
+    return {
+      item: autoaudittype,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const autoaudittype = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < autoaudittypeList.length; i++) {
+      if (autoaudittypeList[i].id + '' === autoaudittype.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      autoaudittypeList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/class.js b/leave-school-vue/src/mock/class.js
new file mode 100644
index 0000000..01fc0ae
--- /dev/null
+++ b/leave-school-vue/src/mock/class.js
@@ -0,0 +1,88 @@
+import Mock from 'mockjs'
+import { param2Obj } from '@/utils'
+
+const clsList = Mock.mock({
+  'list|26': [{
+    'id': '@increment',
+    'nj|1': ['6', '7', '8'],
+    'njmc|1': ['2017', '2018', '2019'],
+    'yx|1-26': 26,
+    'yxmc': '@cword(6, 15)',
+    'zy|27-375': 375,
+    'zymc': '@cword(3, 5)',
+    'bjdm': '@word(5)',
+    'bjmc': '@cword(6, 10)',
+    'sfky|1': ['1', '0'],
+    'sfkymc|1': ['可用', '不可用']
+  }]
+}).list
+
+export default{
+  getList: config => {
+    const { yx, zy, bjmc, nj, bjdm, sfky, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = clsList.filter(item => {
+      if (yx && item.yx + '' !== yx + '') return false
+      if (zy && item.zy !== zy) return false
+      if (bjmc && item.bjmc !== bjmc) return false
+      if (nj && item.nj !== nj) return false
+      if (bjdm && item.bjdm !== bjdm) return false
+      if (sfky && item.sfky !== sfky) return false
+      return true
+    })
+
+    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
+    return {
+      items: pageList,
+      recordCount: mockList.length,
+      code: 200
+    }
+  },
+  getAllList: config => {
+    return {
+      items: clsList,
+      code: 200
+    }
+  },
+  getItem: config => {
+    const { id } = param2Obj(config.url)
+    const mockList = clsList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const cls = JSON.parse(config.body)
+    if (!cls.id) {
+      cls.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      clsList.unshift(cls)
+    } else {
+      for (let i = 0; i < clsList.length; i++) {
+        if (clsList[i].id + '' === cls.id + '') {
+          clsList.splice(i, 1, cls)
+          break
+        }
+      }
+    }
+    return {
+      item: cls,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const cls = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < clsList.length; i++) {
+      if (clsList[i].id + '' === cls.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      clsList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/department.js b/leave-school-vue/src/mock/department.js
new file mode 100644
index 0000000..ce07f0b
--- /dev/null
+++ b/leave-school-vue/src/mock/department.js
@@ -0,0 +1,86 @@
+import Mock from 'mockjs'
+import { param2Obj, parseTime } from '@/utils'
+
+const deptList = Mock.mock({
+  'list|26': [{
+    'id': '@increment',
+    'dwdm': '000@id',
+    'dwmc': '@cword(6, 15)',
+    'dwjc': '@cword(3, 5)',
+    'dwywmc': '@word(6, 10)',
+    'sfqy|1': ['启用', '未启用'],
+    'sfqycode|1': ['1', '0'],
+    'lbm|1': ['院系', '部门'],
+    'lbmid|1': ['1', '2'],
+    'cjsj': '@Date'
+  }]
+}).list
+
+export default{
+  getList: config => {
+    const { dwdm, dwmc, sfqy, lbm, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = deptList.filter(item => {
+      if (dwdm && item.dwdm !== dwdm) return false
+      if (dwmc && item.dwmc !== dwmc) return false
+      if (sfqy && item.sfqycode !== sfqy) return false
+      if (lbm && item.lbmid !== lbm) return false
+      return true
+    })
+
+    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
+    return {
+      items: pageList,
+      recordCount: mockList.length,
+      code: 200
+    }
+  },
+  getAllList: config => {
+    return {
+      items: deptList,
+      code: 200
+    }
+  },
+  getItem: config => {
+    const { id } = param2Obj(config.url)
+    const mockList = deptList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const dept = JSON.parse(config.body)
+    dept.cjsj = parseTime(new Date(), '{y}-{m}-{d}')
+    if (!dept.id) {
+      dept.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      deptList.unshift(dept)
+    } else {
+      for (let i = 0; i < deptList.length; i++) {
+        if (deptList[i].id + '' === dept.id + '') {
+          deptList.splice(i, 1, dept)
+          break
+        }
+      }
+    }
+    return {
+      item: dept,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const dept = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < deptList.length; i++) {
+      if (deptList[i].id + '' === dept.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      deptList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/departmentleader.js b/leave-school-vue/src/mock/departmentleader.js
new file mode 100644
index 0000000..e9fe93e
--- /dev/null
+++ b/leave-school-vue/src/mock/departmentleader.js
@@ -0,0 +1,77 @@
+import Mock from 'mockjs'
+import { param2Obj } from '@/utils'
+
+const departmentleaderList = Mock.mock({
+  'list|50': [{
+    'gh': '@increment',
+    'xm': '@cword(2, 3)',
+    'yx': '@cword(6, 15)',
+    'xb|1': ['男', '女'],
+    'zzmm|1': ['党员', '共青团员', '群众'],
+    'lxdh': '@word',
+    'sfzr|1': ['是', '否']
+  }]
+}).list
+
+export default{
+  getList: config => {
+    const { gh, xm, yx, zzmm, xb, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = departmentleaderList.filter(item => {
+      if (gh && item.gh + '' !== gh + '') return false
+      if (xm && item.xm !== xm) return false
+      if (yx && item.yx !== yx) return false
+      if (zzmm && item.zzmm !== zzmm) return false
+      if (xb && item.xb !== xb) return false
+      return true
+    })
+
+    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
+    return {
+      items: pageList,
+      recordCount: mockList.length,
+      code: 200
+    }
+  },
+  getItem: config => {
+    const { id } = param2Obj(config.url)
+    const mockList = departmentleaderList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const departmentleader = JSON.parse(config.body)
+    if (!departmentleader.id) {
+      departmentleader.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      departmentleaderList.unshift(departmentleader)
+    } else {
+      for (let i = 0; i < departmentleaderList.length; i++) {
+        if (departmentleaderList[i].id + '' === departmentleader.id + '') {
+          departmentleaderList.splice(i, 1, departmentleader)
+          break
+        }
+      }
+    }
+    return {
+      item: departmentleader,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const departmentleader = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < departmentleaderList.length; i++) {
+      if (departmentleaderList[i].id + '' === departmentleader.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      departmentleaderList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/dictionary.js b/leave-school-vue/src/mock/dictionary.js
new file mode 100644
index 0000000..fbfb169
--- /dev/null
+++ b/leave-school-vue/src/mock/dictionary.js
@@ -0,0 +1,108 @@
+// import Mock from 'mockjs'
+import { param2Obj } from '@/utils'
+
+const deptList = [{
+  'id': '1',
+  'type': 'lbm',
+  'name': '院系'
+},
+{
+  'id': '2',
+  'type': 'lbm',
+  'name': '部门'
+},
+{
+  'id': '3',
+  'type': 'gjzybz',
+  'name': '文学'
+},
+{
+  'id': '4',
+  'type': 'gjzybz',
+  'name': '物理'
+},
+{
+  'id': '5',
+  'type': 'gjzybz',
+  'name': '数学'
+},
+{
+  'id': '6',
+  'type': 'nj',
+  'name': '2017'
+},
+{
+  'id': '7',
+  'type': 'nj',
+  'name': '2018'
+},
+{
+  'id': '8',
+  'type': 'nj',
+  'name': '2019'
+},
+{
+  'id': '9',
+  'type': 'zzmm',
+  'name': '党员'
+},
+{
+  'id': '10',
+  'type': 'zzmm',
+  'name': '群众'
+},
+{
+  'id': '11',
+  'type': 'xb',
+  'name': '男'
+},
+{
+  'id': '12',
+  'type': 'xb',
+  'name': '女'
+},
+{
+  'id': '13',
+  'type': 'xswz',
+  'name': '置顶'
+},
+{
+  'id': '14',
+  'type': 'xswz',
+  'name': '其他'
+},
+{
+  'id': '15',
+  'type': 'gglx',
+  'name': '离校公告'
+},
+{
+  'id': '16',
+  'type': 'jszlx',
+  'name': '所有人'
+},
+{
+  'id': '17',
+  'type': 'jszlx',
+  'name': '所有学生'
+},
+{
+  'id': '18',
+  'type': 'jszlx',
+  'name': '所有教职工'
+}]
+
+export default{
+  getDicList: config => {
+    const { type } = param2Obj(config.url)
+    const mockList = deptList.filter(item => {
+      if (type && item.type !== type) return false
+      return true
+    })
+
+    return {
+      items: mockList,
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/index.js b/leave-school-vue/src/mock/index.js
new file mode 100644
index 0000000..1e9f075
--- /dev/null
+++ b/leave-school-vue/src/mock/index.js
@@ -0,0 +1,90 @@
+import Mock from 'mockjs'
+import loginApi from './login'
+import departmentApi from './department'
+import menulistApi from './menulist'
+import majorApi from './major'
+import classApi from './class'
+import dicApi from './dictionary'
+import schoolyearApi from './schoolyear'
+import auditscopeApi from './auditscope'
+import autoaudittypeApi from './autoaudittype'
+import rostersyncinterfaceApi from './rostersyncinterface'
+import departmentleaderApi from './departmentleader'
+import instructorApi from './instructor'
+import newspublishApi from './newspublish'
+
+// 登录
+Mock.mock(/\/api\/login\/login/, 'post', loginApi.loginByUsername)
+Mock.mock(/\/api\/system\/user\/info/, 'get', loginApi.getUserInfo)
+Mock.mock(/\/api\/login\/logout-api/, 'post', loginApi.logout)
+
+// 数据字典
+Mock.mock(/\/api\/system\/dictionary\/getdiclist/, 'get', dicApi.getDicList)
+
+// 菜单列表
+Mock.mock(/\/api\/system\/menu\/list/, 'get', menulistApi.getMenuList)
+
+// 院系部门管理
+Mock.mock(/\/api\/system\/department\/list-api/, 'get', departmentApi.getList)
+Mock.mock(/\/api\/system\/department\/all-list/, 'get', departmentApi.getAllList)
+Mock.mock(/\/api\/system\/department\/create-department/, 'post', departmentApi.createData)
+Mock.mock(/\/api\/system\/department\/delete-department/, 'delete', departmentApi.deleteData)
+Mock.mock(/\/api\/system\/department\/get-item/, 'get', departmentApi.getItem)
+
+// 专业管理
+Mock.mock(/\/api\/system\/major\/list-api/, 'get', majorApi.getList)
+Mock.mock(/\/api\/system\/major\/create-major/, 'post', majorApi.createData)
+Mock.mock(/\/api\/system\/major\/delete-major/, 'delete', majorApi.deleteData)
+Mock.mock(/\/api\/system\/major\/get-item/, 'get', majorApi.getItem)
+Mock.mock(/\/api\/system\/major\/list-byyx-api/, 'get', majorApi.getZyListByYx)
+
+// 班级管理
+Mock.mock(/\/api\/system\/class\/list-api/, 'get', classApi.getList)
+Mock.mock(/\/api\/system\/class\/all-list/, 'get', classApi.getAllList)
+Mock.mock(/\/api\/system\/class\/create-class/, 'post', classApi.createData)
+Mock.mock(/\/api\/system\/class\/delete-class/, 'delete', classApi.deleteData)
+Mock.mock(/\/api\/system\/class\/get-item/, 'get', classApi.getItem)
+
+// 学年管理
+Mock.mock(/\/api\/system\/schoolyear\/list-api/, 'get', schoolyearApi.getList)
+Mock.mock(/\/api\/system\/schoolyear\/create-schoolyear/, 'post', schoolyearApi.createData)
+Mock.mock(/\/api\/system\/schoolyear\/delete-schoolyear/, 'delete', schoolyearApi.deleteData)
+Mock.mock(/\/api\/system\/schoolyear\/get-item/, 'get', schoolyearApi.getItem)
+
+// 名单同步接口设置
+Mock.mock(/\/api\/system\/rostersyncinterface\/list-api/, 'get', rostersyncinterfaceApi.getList)
+Mock.mock(/\/api\/system\/rostersyncinterface\/create-rostersyncinterface/, 'post', rostersyncinterfaceApi.createData)
+Mock.mock(/\/api\/system\/rostersyncinterface\/delete-rostersyncinterface/, 'delete', rostersyncinterfaceApi.deleteData)
+Mock.mock(/\/api\/system\/rostersyncinterface\/get-item/, 'get', rostersyncinterfaceApi.getItem)
+
+// 审核学生范围控制
+Mock.mock(/\/api\/system\/auditscope\/list-api/, 'get', auditscopeApi.getList)
+Mock.mock(/\/api\/system\/auditscope\/create-auditscope/, 'post', auditscopeApi.createData)
+Mock.mock(/\/api\/system\/auditscope\/delete-auditscope/, 'delete', auditscopeApi.deleteData)
+Mock.mock(/\/api\/system\/auditscope\/get-item/, 'get', auditscopeApi.getItem)
+
+// 离校自动审核类型设置
+Mock.mock(/\/api\/system\/autoaudittype\/list-api/, 'get', autoaudittypeApi.getList)
+Mock.mock(/\/api\/system\/autoaudittype\/create-autoaudittype/, 'post', autoaudittypeApi.createData)
+Mock.mock(/\/api\/system\/autoaudittype\/delete-autoaudittype/, 'delete', autoaudittypeApi.deleteData)
+Mock.mock(/\/api\/system\/autoaudittype\/get-item/, 'get', autoaudittypeApi.getItem)
+
+// 学院负责人信息管理
+Mock.mock(/\/api\/workteam\/departmentleader\/list-api/, 'get', departmentleaderApi.getList)
+Mock.mock(/\/api\/workteam\/departmentleader\/create-departmentleader/, 'post', departmentleaderApi.createData)
+Mock.mock(/\/api\/workteam\/departmentleader\/delete-departmentleader/, 'delete', departmentleaderApi.deleteData)
+Mock.mock(/\/api\/workteam\/departmentleader\/get-item/, 'get', departmentleaderApi.getItem)
+
+// 辅导员信息管理
+Mock.mock(/\/api\/workteam\/instructor\/list-api/, 'get', instructorApi.getList)
+Mock.mock(/\/api\/workteam\/instructor\/create-instructor/, 'post', instructorApi.createData)
+Mock.mock(/\/api\/workteam\/instructor\/delete-instructor/, 'delete', instructorApi.deleteData)
+Mock.mock(/\/api\/workteam\/instructor\/get-item/, 'get', instructorApi.getItem)
+
+// 院系部门管理
+Mock.mock(/\/api\/news\/newspublish\/list-api/, 'get', newspublishApi.getList)
+Mock.mock(/\/api\/news\/newspublish\/create-newspublish/, 'post', newspublishApi.createData)
+Mock.mock(/\/api\/news\/newspublish\/delete-newspublish/, 'delete', newspublishApi.deleteData)
+Mock.mock(/\/api\/news\/newspublish\/get-item/, 'get', newspublishApi.getItem)
+
+export default Mock
diff --git a/leave-school-vue/src/mock/instructor.js b/leave-school-vue/src/mock/instructor.js
new file mode 100644
index 0000000..0f48407
--- /dev/null
+++ b/leave-school-vue/src/mock/instructor.js
@@ -0,0 +1,76 @@
+import Mock from 'mockjs'
+import { param2Obj } from '@/utils'
+
+const instructorList = Mock.mock({
+  'list|50': [{
+    'gh': '@increment',
+    'xm': '@cword(2, 3)',
+    'sdbj': '@cword(6, 15)',
+    'bjzrs': '@integer(60, 100)',
+    'szyx': '@cword(5,7)',
+    'sfzr|1': ['是', '否']
+  }]
+}).list
+
+export default{
+  getList: config => {
+    const { gh, xm, yx, bjzrs, sfzr, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = instructorList.filter(item => {
+      if (gh && item.gh + '' !== gh + '') return false
+      if (xm && item.xm !== xm) return false
+      if (yx && item.yx !== yx) return false
+      if (bjzrs && item.bjzrs !== bjzrs) return false
+      if (sfzr && item.sfzr !== sfzr) return false
+      return true
+    })
+
+    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
+    return {
+      items: pageList,
+      recordCount: mockList.length,
+      code: 200
+    }
+  },
+  getItem: config => {
+    const { id } = param2Obj(config.url)
+    const mockList = instructorList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const instructor = JSON.parse(config.body)
+    if (!instructor.id) {
+      instructor.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      instructorList.unshift(instructor)
+    } else {
+      for (let i = 0; i < instructorList.length; i++) {
+        if (instructorList[i].id + '' === instructor.id + '') {
+          instructorList.splice(i, 1, instructor)
+          break
+        }
+      }
+    }
+    return {
+      item: instructor,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const instructor = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < instructorList.length; i++) {
+      if (instructorList[i].id + '' === instructor.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      instructorList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/login.js b/leave-school-vue/src/mock/login.js
new file mode 100644
index 0000000..baa100d
--- /dev/null
+++ b/leave-school-vue/src/mock/login.js
@@ -0,0 +1,33 @@
+import { param2Obj } from '@/utils'
+
+const userMap = {
+  admin: {
+    data: {
+      roles: ['admin'],
+      token: 'admin',
+      introduction: '我是超级管理员',
+      avatar: 'https://cn.vuejs.org/images/logo.png',
+      name: 'Super Admin'
+    },
+    code: 200
+  }
+}
+export default {
+  loginByUsername: config => {
+    const { username } = JSON.parse(config.body)
+    return userMap[username]
+  },
+  getUserInfo: config => {
+    const { token } = param2Obj(config.url)
+    if (userMap[token]) {
+      return userMap[token]
+    } else {
+      return false
+    }
+  },
+  logout: () => {
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/major.js b/leave-school-vue/src/mock/major.js
new file mode 100644
index 0000000..fe9b977
--- /dev/null
+++ b/leave-school-vue/src/mock/major.js
@@ -0,0 +1,86 @@
+import Mock from 'mockjs'
+import { param2Obj } from '@/utils'
+
+const majorList = Mock.mock({
+  'list|350': [{
+    'id': '@increment',
+    'zydm': '000@id',
+    'zymc': '@cword(6, 15)',
+    'sfky|1': ['可用', '不可用'],
+    'sfkycode|1': ['1', '0'],
+    'ssyx|1': ['教育学院', '经管学院', '人文学院', '数学学院', '计算机学院', '电子学院', '电气学院', '生命科学院'],
+    'ssyxid|1': ['1', '2', '3', '4', '5', '6', '7', '8'],
+    'sszygb|1': ['计算机', '哲学']
+  }]
+}).list
+
+export default{
+  getList: config => {
+    const { zydm, zymc, sfky, ssyx, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = majorList.filter(item => {
+      if (zydm && item.zydm !== zydm) return false
+      if (zymc && item.zymc !== zymc) return false
+      if (sfky && item.sfkycode !== sfky) return false
+      if (ssyx && item.ssyxid !== ssyx) return false
+      return true
+    })
+
+    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
+    return {
+      items: pageList,
+      recordCount: mockList.length,
+      code: 200
+    }
+  },
+  getZyListByYx: config => {
+    const { yx } = param2Obj(config.url)
+    const mockList = majorList.filter(item => item.ssyxid === yx)
+
+    return {
+      list: mockList,
+      code: 200
+    }
+  },
+  getItem: config => {
+    const { id } = param2Obj(config.url)
+    const mockList = majorList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const major = JSON.parse(config.body)
+    if (!major.id) {
+      major.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      majorList.unshift(major)
+    } else {
+      for (let i = 0; i < majorList.length; i++) {
+        if (majorList[i].id + '' === major.id + '') {
+          majorList.splice(i, 1, major)
+          break
+        }
+      }
+    }
+    return {
+      item: major,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const major = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < majorList.length; i++) {
+      if (majorList[i].id + '' === major.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      majorList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/menulist.js b/leave-school-vue/src/mock/menulist.js
new file mode 100644
index 0000000..7453cd9
--- /dev/null
+++ b/leave-school-vue/src/mock/menulist.js
@@ -0,0 +1,101 @@
+/* Layout */
+// import Layout from '../views/layout/Layout'
+
+const menuList = [
+  {
+    path: '/dictionary',
+    code: 'dictionary',
+    meta: { title: '数据字典管理', icon: 'dictionary' },
+    children: [
+      {
+        path: 'department',
+        code: 'Department',
+        resource: '/views/systemmanagement/department/index',
+        meta: { title: '院系部门管理', icon: 'department' }
+      },
+      {
+        path: 'major',
+        code: 'Major',
+        resource: '/views/systemmanagement/major/index',
+        meta: { title: '专业管理', icon: 'major' }
+      },
+      {
+        path: 'class',
+        code: 'Class',
+        resource: '/views/systemmanagement/class/index',
+        meta: { title: '班级管理', icon: 'class' }
+      },
+      {
+        path: 'schoolyear',
+        code: 'SchoolYear',
+        resource: '/views/systemmanagement/schoolyear/index',
+        meta: { title: '学年管理', icon: 'schoolyear' }
+      },
+      {
+        path: 'rostersyncinterface',
+        code: 'RosterSyncInterface',
+        resource: '/views/systemmanagement/rostersyncinterface/index',
+        meta: { title: '名单同步接口设置', icon: 'rostersyncinterface' }
+      },
+      {
+        path: 'auditscope',
+        code: 'AuditScope',
+        resource: '/views/systemmanagement/auditscope/index',
+        meta: { title: '审核学生范围控制', icon: 'auditscope' }
+      },
+      {
+        path: 'autoaudittype',
+        code: 'AutoAuditType',
+        resource: '/views/systemmanagement/autoaudittype/index',
+        meta: { title: '离校自动审核类型设置', icon: 'autoaudittype' }
+      }
+    ]
+  },
+  {
+    path: '/workteam',
+    code: 'workteam',
+    meta: { title: '工作队伍管理', icon: 'workteam' },
+    children: [
+      {
+        path: 'departmentleader',
+        code: 'Departmentleader',
+        resource: '/views/workteam/departmentleader/index',
+        meta: { title: '学院负责人信息管理', icon: 'departmentleader' }
+      },
+      {
+        path: 'instructor',
+        code: 'Instructor',
+        resource: '/views/workteam/instructor/index',
+        meta: { title: '辅导员信息管理', icon: 'instructor' }
+      }
+    ]
+  },
+  {
+    path: '/news',
+    code: 'news',
+    meta: { title: '新闻公告管理', icon: 'news' },
+    children: [
+      {
+        path: 'newspublish',
+        code: 'NewsPublish',
+        resource: '/views/news/newspublish/index',
+        meta: { title: '新闻公告发布', icon: 'newspublish' }
+      },
+      {
+        path: 'newview',
+        code: 'NewsView',
+        resource: '/views/news/newview/index',
+        meta: { title: '新闻公告查看', icon: 'newview' }
+      }
+    ]
+  }
+]
+
+export default{
+  getMenuList: config => {
+    return {
+      items: menuList,
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/newspublish.js b/leave-school-vue/src/mock/newspublish.js
new file mode 100644
index 0000000..2c4d8f3
--- /dev/null
+++ b/leave-school-vue/src/mock/newspublish.js
@@ -0,0 +1,84 @@
+import Mock from 'mockjs'
+import { param2Obj, parseTime } from '@/utils'
+
+const newspublishList = Mock.mock({
+  'list|26': [{
+    'id': '@increment',
+    'ggbt': '@cword(6, 15)',
+    'gglx': '离校公告',
+    'jszlx|1': ['所有学生', '所有人', '所有教职工'],
+    'sfky|1': ['可用', '不可用'],
+    'fbqssj': '2018-06-28',
+    'fbjssj': '2018-06-28',
+    'xswz|1': ['其它', '置顶'],
+    'jlckzt': '需要',
+    'djs': '@integer(60, 100)',
+    'fbr': 'admin',
+    'fbrq': '2018-08-08'
+  }]
+}).list
+
+export default{
+  getList: config => {
+    const { ggbt, fbqssj, fbjssj, sfky, xswz, jlckzt, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = newspublishList.filter(item => {
+      if (ggbt && item.ggbt !== ggbt) return false
+      if (fbqssj && item.fbqssj !== fbqssj) return false
+      if (fbjssj && item.fbjssj !== fbjssj) return false
+      if (sfky && item.sfky !== sfky) return false
+      if (xswz && item.xswz !== xswz) return false
+      if (jlckzt && item.jlckzt !== jlckzt) return false
+      return true
+    })
+
+    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
+    return {
+      items: pageList,
+      recordCount: mockList.length,
+      code: 200
+    }
+  },
+  getItem: config => {
+    const { id } = param2Obj(config.url)
+    const mockList = newspublishList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const newspublish = JSON.parse(config.body)
+    newspublish.cjsj = parseTime(new Date(), '{y}-{m}-{d}')
+    if (!newspublish.id) {
+      newspublish.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      newspublishList.unshift(newspublish)
+    } else {
+      for (let i = 0; i < newspublishList.length; i++) {
+        if (newspublishList[i].id + '' === newspublish.id + '') {
+          newspublishList.splice(i, 1, newspublish)
+          break
+        }
+      }
+    }
+    return {
+      item: newspublish,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const newspublish = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < newspublishList.length; i++) {
+      if (newspublishList[i].id + '' === newspublish.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      newspublishList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/rostersyncinterface.js b/leave-school-vue/src/mock/rostersyncinterface.js
new file mode 100644
index 0000000..3a7259c
--- /dev/null
+++ b/leave-school-vue/src/mock/rostersyncinterface.js
@@ -0,0 +1,76 @@
+import Mock from 'mockjs'
+import { param2Obj } from '@/utils'
+
+const rostersyncinterfaceList = Mock.mock({
+  'list|50': [{
+    'id': '@increment',
+    'dm': '@word(4)',
+    'mc': '@cword(6, 15)',
+    'tj': '@word(15)',
+    'px': '@word(15)',
+    'gglx': '@word(15)'
+  }]
+}).list
+
+export default{
+  getList: config => {
+    const { dm, mc, tj, px, gglx, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = rostersyncinterfaceList.filter(item => {
+      if (dm && item.dm !== dm) return false
+      if (mc && item.mc !== mc) return false
+      if (tj && item.tj !== tj) return false
+      if (px && item.px !== px) return false
+      if (gglx && item.gglx !== gglx) return false
+      return true
+    })
+
+    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
+    return {
+      items: pageList,
+      recordCount: mockList.length,
+      code: 200
+    }
+  },
+  getItem: config => {
+    const { id } = param2Obj(config.url)
+    const mockList = rostersyncinterfaceList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const rostersyncinterface = JSON.parse(config.body)
+    if (!rostersyncinterface.id) {
+      rostersyncinterface.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      rostersyncinterfaceList.unshift(rostersyncinterface)
+    } else {
+      for (let i = 0; i < rostersyncinterfaceList.length; i++) {
+        if (rostersyncinterfaceList[i].id + '' === rostersyncinterface.id + '') {
+          rostersyncinterfaceList.splice(i, 1, rostersyncinterface)
+          break
+        }
+      }
+    }
+    return {
+      item: rostersyncinterface,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const rostersyncinterface = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < rostersyncinterfaceList.length; i++) {
+      if (rostersyncinterfaceList[i].id + '' === rostersyncinterface.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      rostersyncinterfaceList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/schoolyear.js b/leave-school-vue/src/mock/schoolyear.js
new file mode 100644
index 0000000..7e37aa9
--- /dev/null
+++ b/leave-school-vue/src/mock/schoolyear.js
@@ -0,0 +1,70 @@
+import Mock from 'mockjs'
+import { param2Obj } from '@/utils'
+
+const schoolyearList = Mock.mock({
+  'list|26': [{
+    'id': '@increment',
+    'xndm|1': ['2016', '2017', '2018'],
+    'xnmc': '@xndm@cword(6, 15)'
+  }]
+}).list
+
+export default{
+  getList: config => {
+    const { xndm, xnmc, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = schoolyearList.filter(item => {
+      if (xndm && item.xndm !== xndm) return false
+      if (xnmc && item.xnmc !== xnmc) return false
+      return true
+    })
+
+    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
+    return {
+      items: pageList,
+      recordCount: mockList.length,
+      code: 200
+    }
+  },
+  getItem: config => {
+    const { id } = param2Obj(config.url)
+    const mockList = schoolyearList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const schoolyear = JSON.parse(config.body)
+    if (!schoolyear.id) {
+      schoolyear.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      schoolyearList.unshift(schoolyear)
+    } else {
+      for (let i = 0; i < schoolyearList.length; i++) {
+        if (schoolyearList[i].id + '' === schoolyear.id + '') {
+          schoolyearList.splice(i, 1, schoolyear)
+          break
+        }
+      }
+    }
+    return {
+      item: schoolyear,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const schoolyear = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < schoolyearList.length; i++) {
+      if (schoolyearList[i].id + '' === schoolyear.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      schoolyearList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}