菜单冲突
diff --git a/leave-school-vue/src/api/leaveschoolnode-api.js b/leave-school-vue/src/api/leaveschoolnode-api.js
new file mode 100644
index 0000000..be89f15
--- /dev/null
+++ b/leave-school-vue/src/api/leaveschoolnode-api.js
@@ -0,0 +1,39 @@
+import request from '@/utils/request'
+
+export function getList(params) {
+  return request({
+    url: '/api/procedures/node/list-api',
+    method: 'get',
+    params
+  })
+}
+export function getAllList(params) {
+  return request({
+    url: '/api/procedures/node/all-list',
+    method: 'get',
+    params
+  })
+}
+export function getItem(params) {
+  return request({
+    url: '/api/procedures/node/get-item',
+    method: 'get',
+    params
+  })
+}
+
+export function createNode(data) {
+  return request({
+    url: '/api/procedures/node/create-node',
+    method: 'post',
+    data
+  })
+}
+
+export function deleteNode(data) {
+  return request({
+    url: '/api/procedures/node/delete-node',
+    method: 'delete',
+    data
+  })
+}
diff --git a/leave-school-vue/src/icons/svg/audit.svg b/leave-school-vue/src/icons/svg/audit.svg
new file mode 100644
index 0000000..0b86c3a
--- /dev/null
+++ b/leave-school-vue/src/icons/svg/audit.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1534819354565" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9694" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M185.6 745.6v-92.8c0-51.2 41.6-92.8 92.8-92.8h140.8v-73.6c-54.4-32-92.8-92.8-92.8-160 0-102.4 83.2-185.6 185.6-185.6 102.4 0 185.6 83.2 185.6 185.6 0 70.4-38.4 128-92.8 160v73.6h140.8c51.2 0 92.8 41.6 92.8 92.8v92.8H185.6z m512 140.8H326.4v-92.8h374.4v92.8z" p-id="9695"></path></svg>
\ No newline at end of file
diff --git a/leave-school-vue/src/icons/svg/batch.svg b/leave-school-vue/src/icons/svg/batch.svg
new file mode 100644
index 0000000..368d217
--- /dev/null
+++ b/leave-school-vue/src/icons/svg/batch.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1534818723597" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5413" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M704 320H320a32 32 0 0 1 0-64h384a32 32 0 0 1 0 64z m0 448H320a32 32 0 0 1 0-64h384a32 32 0 0 1 0 64z m64-128H256a32 32 0 0 1-32-32v-192a32 32 0 0 1 32-32h512a32 32 0 0 1 32 32v192a32 32 0 0 1-32 32zM288 576h448v-128H288v128z" p-id="5414"></path></svg>
\ No newline at end of file
diff --git a/leave-school-vue/src/icons/svg/batchAudit.svg b/leave-school-vue/src/icons/svg/batchAudit.svg
new file mode 100644
index 0000000..446e973
--- /dev/null
+++ b/leave-school-vue/src/icons/svg/batchAudit.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1534819231339" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9553" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M753.5 624.9h-90.4c-12.7 0-23-10.3-23-23s10.3-23 23-23h90.4c12.7 0 23 10.3 23 23s-10.3 23-23 23zM793 750.6H635.1c-12.7 0-23-10.3-23-23s10.3-23 23-23H793c12.7 0 23 10.3 23 23s-10.3 23-23 23zM762.3 495.8h-563c-12.7 0-23-10.3-23-23s10.3-23 23-23h563c12.7 0 23 10.3 23 23s-10.3 23-23 23zM473.4 623.2H199.7c-12.7 0-23-10.3-23-23s10.3-23 23-23h273.7c12.7 0 23 10.3 23 23s-10.3 23-23 23zM444.3 750.6H199.7c-12.7 0-23-10.3-23-23s10.3-23 23-23h244.6c12.7 0 23 10.3 23 23s-10.3 23-23 23zM434.1 347.9c-6.5-15.3-15.7-29.1-27.5-40.8-11.8-11.8-25.6-21.1-40.8-27.5-1.3-0.6-2.7-1.1-4-1.6 1.3-1.1 2.5-2.3 3.7-3.5 13.2-13.2 20.6-30.9 20.6-49.6s-7.3-36.3-20.6-49.6c-13.2-13.2-30.9-20.6-49.6-20.6-18.7 0-36.3 7.3-49.6 20.6-13.2 13.2-20.6 30.9-20.6 49.6s7.3 36.3 20.6 49.6c1.2 1.2 2.3 2.3 3.6 3.3-1.4 0.5-2.8 1.1-4.2 1.7-15.3 6.5-29.1 15.7-40.8 27.5-11.8 11.8-21.1 25.6-27.5 40.8-5.9 13.8-9.2 28.4-9.9 43.5-0.2 3.5 1.1 7 3.5 9.5s5.8 4 9.3 4c6.8 0 12.5-5.4 12.8-12.2 2.8-54.7 48-97.7 102.8-97.7 54.9 0 100 42.9 102.8 97.7 0.3 6.8 5.9 12.2 12.8 12.2 3.5 0 6.8-1.4 9.3-4 2.4-2.5 3.7-6 3.5-9.5-1-15-4.4-29.6-10.2-43.4z m-118.4-86.5c-18.5 0-33.6-15.1-33.6-33.6s15.1-33.6 33.6-33.6 33.6 15.1 33.6 33.6-15.1 33.6-33.6 33.6z m0 0M751.2 240.7h-210c-12.7 0-23-10.3-23-23s10.3-23 23-23h210c12.7 0 23 10.3 23 23s-10.2 23-23 23zM751.2 367.9h-210c-12.7 0-23-10.3-23-23s10.3-23 23-23h210c12.7 0 23 10.3 23 23s-10.2 23-23 23z" p-id="9554"></path><path d="M136.2 848.6c-15.8 0-28.7-13.9-28.7-30.9V141.8c0-17.1 12.9-31 28.7-31h689.1c15.8 0 28.7 13.9 28.7 31v348.5c0 12.1 9.8 21.8 21.8 21.8 12.1 0 21.8-9.8 21.8-21.8V141.8c0-43-32.5-78-72.4-78h-689c-39.9 0-72.4 35-72.4 78v675.8c0 43 32.5 78 72.4 78h354.9c12.1 0 21.8-9.8 21.8-21.8v-3.4c0-12.1-9.8-21.8-21.8-21.8H136.2z" p-id="9555"></path><path d="M868.9 832.8c-4.2-4.2-9.9-6.6-15.9-6.6s-11.7 2.3-15.9 6.6l-2.6 2.6c-8.8 8.8-8.8 23 0 31.8l85.6 85.6a22.5 22.5 0 0 0 15.9 6.6c5.8 0 11.5-2.2 15.9-6.6 10.2-10.2 10.2-26.8 0-37l-83-83zM876.2 773.9c9.8-23.3 14.8-48 14.8-73.5s-5-50.2-14.8-73.5c-9.5-22.5-23.1-42.6-40.5-60-17.3-17.4-37.5-31-60-40.5-23.3-9.8-48-14.8-73.5-14.8s-50.2 5-73.5 14.8c-22.5 9.5-42.6 23.1-60 40.5-17.4 17.3-31 37.5-40.5 60-9.8 23.3-14.8 48-14.8 73.5s5 50.2 14.8 73.5c9.5 22.5 23.1 42.6 40.5 60 17.3 17.4 37.5 31 60 40.5 23.3 9.8 48 14.8 73.5 14.8s50.2-5 73.5-14.8c22.5-9.5 42.6-23.1 60-40.5s31-37.5 40.5-60z m-173.9 93.3c-92 0-166.8-74.8-166.8-166.8 0-92 74.8-166.8 166.8-166.8 92 0 166.8 74.8 166.8 166.8 0 92-74.9 166.8-166.8 166.8z" p-id="9556"></path><path d="M594.7 616.2l-1.8-1.3c-4.5-3.4-11-2.4-14.2 2.3-0.1 0.1-0.2 0.3-0.3 0.5-3.1 4.7-1.6 11.1 3.3 13.9l2 1.1c4.5 2.6 10.3 1.2 13.1-3.1 0 0 0-0.1 0.1-0.1 3-4.3 2-10.1-2.2-13.3zM574.4 649c-5.8-2.5-12.6 0.5-14.6 6.5-5.9 17.2-8.9 35.2-8.9 53.7v0.3c0 6.3 5.4 11.4 11.7 10.9 5.8-0.4 10.2-5.2 10.2-11v-0.1c0-16 2.6-31.6 7.6-46.5 2-5.5-0.6-11.5-6-13.8z m0 0" p-id="9557"></path></svg>
\ No newline at end of file
diff --git a/leave-school-vue/src/icons/svg/manifest.svg b/leave-school-vue/src/icons/svg/manifest.svg
new file mode 100644
index 0000000..0efaa87
--- /dev/null
+++ b/leave-school-vue/src/icons/svg/manifest.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1534821920000" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11152" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M896 1023.957333 128 1023.957333C80.853333 1023.957333 42.666667 985.770667 42.666667 938.624L42.666667 85.333333C42.666667 38.186667 80.853333-0.042667 128-0.042667L896-0.042667C943.104-0.042667 981.333333 38.186667 981.333333 85.333333L981.333333 938.624C981.333333 985.770667 943.104 1023.957333 896 1023.957333ZM896 85.290667 128 85.290667 128 938.666667 896 938.666667 896 85.290667ZM277.333333 469.290667 746.666667 469.290667C758.442667 469.290667 768 478.848 768 490.624L768 533.333333C768 545.109333 758.442667 554.666667 746.666667 554.666667L277.333333 554.666667C265.557333 554.666667 256 545.109333 256 533.333333L256 490.624C256 478.848 265.557333 469.290667 277.333333 469.290667ZM277.333333 682.666667 746.666667 682.666667C758.442667 682.666667 768 692.224 768 704L768 746.666667C768 758.442667 758.442667 768 746.666667 768L277.333333 768C265.557333 768 256 758.442667 256 746.666667L256 704C256 692.224 265.557333 682.666667 277.333333 682.666667ZM746.666667 341.333333 277.333333 341.333333C265.557333 341.333333 256 331.776 256 320L256 277.290667C256 265.514667 265.557333 255.957333 277.333333 255.957333L746.666667 255.957333C758.442667 255.957333 768 265.514667 768 277.290667L768 320C768 331.776 758.442667 341.333333 746.666667 341.333333Z" p-id="11153"></path></svg>
\ No newline at end of file
diff --git a/leave-school-vue/src/icons/svg/node.svg b/leave-school-vue/src/icons/svg/node.svg
new file mode 100644
index 0000000..172f992
--- /dev/null
+++ b/leave-school-vue/src/icons/svg/node.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1534818186763" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4238" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M778.4 599.5c-32.3 0-60.7 16-78.3 40.3l-102.4-52.7c8.3-17.9 13.3-37.6 13.3-58.6 0-23.9-6.5-46-17.1-65.6l59.8-24.7c5.3 9 11.8 17.5 20.3 24.6 40.8 34.6 101.8 29.6 136.4-11.2 34.6-40.8 29.6-101.8-11.2-136.4-40.8-34.6-101.8-29.6-136.4 11.2-20.9 24.6-27.1 56.6-19.9 85.8l-65.1 26.9c-22.7-26.9-55.2-44.9-92.2-48.7v-95c46.7-6.9 82.7-46.7 82.7-95.4 0-53.5-43.3-96.8-96.8-96.8s-96.8 43.3-96.8 96.8c0 48.6 36 88.5 82.7 95.4v95C387.1 397.6 332 456.3 332 528.5c0 34.7 13.1 66.1 34.1 90.5L324 640.7c-17.5-25.3-46.6-41.9-79.6-41.9-53.5 0-96.8 43.3-96.8 96.8s43.3 96.8 96.8 96.8S341 749 341 695.6c0-10.3-2-20.1-5-29.4l51.7-26.6c23.4 17.7 52.2 28.5 83.7 28.5 45.9 0 86.3-22.5 111.7-56.7L687.3 665c-3.4 9.9-5.7 20.3-5.7 31.4 0 53.5 43.3 96.8 96.8 96.8s96.8-43.3 96.8-96.8-43.3-96.9-96.8-96.9z" fill="#bfcbd9" p-id="4239"></path></svg>
\ No newline at end of file
diff --git a/leave-school-vue/src/icons/svg/procedures.svg b/leave-school-vue/src/icons/svg/procedures.svg
new file mode 100644
index 0000000..8e7c60d
--- /dev/null
+++ b/leave-school-vue/src/icons/svg/procedures.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1534818378854" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5250" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M796.1 370.11h72.56a15.5 15.5 0 0 0 15.5-15.5V214.42a5.25 5.25 0 0 0-1.54-3.75c-13-12.72-28.46-3.75-28.46 8.84v115.43a5.17 5.17 0 0 1-5.17 5.17H791a5.25 5.25 0 0 0-3.75 1.54c-12.71 12.95-3.74 28.46 8.85 28.46z" fill="#7B808B" p-id="5251"></path><path d="M736.85 355.6m-15 0a15 15 0 1 0 30 0 15 15 0 1 0-30 0Z" fill="#7B808B" p-id="5252"></path><path d="M391.16 38.11h-345v345a100 100 0 0 0 100 100h345v-345a100 100 0 0 0-100-100z m20 365h-265a20 20 0 0 1-20-20v-265h265a20 20 0 0 1 20 20zM552.16 138.11v345h345a100 100 0 0 0 100-100v-345h-345a100 100 0 0 0-100 100z m345 265h-265v-265a20 20 0 0 1 20-20h265v265a20 20 0 0 1-20 20zM46.16 641.11v345h345a100 100 0 0 0 100-100v-345h-345a100 100 0 0 0-100 100z m345 265h-265v-265a20 20 0 0 1 20-20h265v265a20 20 0 0 1-20 20zM897.16 541.11h-345v345a100 100 0 0 0 100 100h345v-345a100 100 0 0 0-100-100z m20 365h-265a20 20 0 0 1-20-20v-265h265a20 20 0 0 1 20 20z" fill="#7B808B" p-id="5253"></path></svg>
\ No newline at end of file
diff --git a/leave-school-vue/src/icons/svg/view.svg b/leave-school-vue/src/icons/svg/view.svg
new file mode 100644
index 0000000..0ebd413
--- /dev/null
+++ b/leave-school-vue/src/icons/svg/view.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1534819407004" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10476" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M819.2 0H204.8a136.533333 136.533333 0 0 0-136.533333 136.533333v750.933334a136.533333 136.533333 0 0 0 136.533333 136.533333h614.4a136.533333 136.533333 0 0 0 136.533333-136.533333V136.533333a136.533333 136.533333 0 0 0-136.533333-136.533333z m68.266667 887.466667a68.266667 68.266667 0 0 1-68.266667 68.266666H204.8a68.266667 68.266667 0 0 1-68.266667-68.266666V136.533333a68.266667 68.266667 0 0 1 68.266667-68.266666h614.4a68.266667 68.266667 0 0 1 68.266667 68.266666z" fill="" p-id="10477"></path><path d="M735.914667 273.066667h-307.2a34.133333 34.133333 0 0 0 0 68.266666h307.2a34.133333 34.133333 0 0 0 0-68.266666zM735.914667 477.866667h-307.2a34.133333 34.133333 0 0 0 0 68.266666h307.2a34.133333 34.133333 0 0 0 0-68.266666zM735.914667 682.666667h-307.2a34.133333 34.133333 0 0 0 0 68.266666h307.2a34.133333 34.133333 0 0 0 0-68.266666zM313.344 273.066667h-25.258667a34.133333 34.133333 0 0 0 0 68.266666h25.941334a34.133333 34.133333 0 0 0 0-68.266666zM313.344 477.866667h-25.258667a34.133333 34.133333 0 0 0 0 68.266666h25.941334a34.133333 34.133333 0 0 0 0-68.266666zM313.344 682.666667h-25.258667a34.133333 34.133333 0 0 0 0 68.266666h25.941334a34.133333 34.133333 0 0 0 0-68.266666z" fill="" p-id="10478"></path></svg>
\ No newline at end of file
diff --git a/leave-school-vue/src/mock/dictionary.js b/leave-school-vue/src/mock/dictionary.js
index 0f8166b..da85881 100644
--- a/leave-school-vue/src/mock/dictionary.js
+++ b/leave-school-vue/src/mock/dictionary.js
@@ -100,6 +100,46 @@
   'id': '20',
   'type': 'xslb',
   'name': '研究生'
+},
+{
+  'id': '21',
+  'type': 'scope',
+  'name': '辅导员范围'
+},
+{
+  'id': '22',
+  'type': 'defaultAuditStatus',
+  'name': '待审核'
+},
+{
+  'id': '23',
+  'type': 'defaultAuditStatus',
+  'name': '审核通过'
+},
+{
+  'id': '24',
+  'type': 'defaultAuditStatus',
+  'name': '审核不通过'
+},
+{
+  'id': '25',
+  'type': 'auditType',
+  'name': '手动'
+},
+{
+  'id': '26',
+  'type': 'auditType',
+  'name': '自动'
+},
+{
+  'id': '27',
+  'type': 'scope',
+  'name': '全校范围'
+},
+{
+  'id': '28',
+  'type': 'scope',
+  'name': '院系范围'
 }]
 
 export default{
diff --git a/leave-school-vue/src/mock/index.js b/leave-school-vue/src/mock/index.js
index fe83b76..475cf75 100644
--- a/leave-school-vue/src/mock/index.js
+++ b/leave-school-vue/src/mock/index.js
@@ -12,11 +12,14 @@
 import departmentleaderApi from './departmentleader'
 import instructorApi from './instructor'
 import newspublishApi from './newspublish'
+
 import handlingApi from './handling'
 import leavestudentApi from './leavestudent'
 import nodereportApi from './nodereport'
 import deptreportApi from './deptreport'
 
+import leaveschoolnodeApi from './leaveschoolnode'
+
 // 登录
 Mock.mock(/\/api\/login\/login/, 'post', loginApi.loginByUsername)
 Mock.mock(/\/api\/system\/user\/info/, 'get', loginApi.getUserInfo)
@@ -108,4 +111,10 @@
 // 院系统计报表查询
 Mock.mock(/\/api\/statistical\/deptreport\/list-api/, 'get', deptreportApi.getList)
 
+// 离校环节管理
+Mock.mock(/\/api\/procedures\/node\/list-api/, 'get', leaveschoolnodeApi.getList)
+Mock.mock(/\/api\/procedures\/node\/create-node/, 'post', leaveschoolnodeApi.createData)
+Mock.mock(/\/api\/procedures\/node\/delete-node/, 'delete', leaveschoolnodeApi.deleteData)
+Mock.mock(/\/api\/procedures\/node\/get-item/, 'get', leaveschoolnodeApi.getItem)
+
 export default Mock
diff --git a/leave-school-vue/src/mock/leaveschoolnode.js b/leave-school-vue/src/mock/leaveschoolnode.js
new file mode 100644
index 0000000..10c7257
--- /dev/null
+++ b/leave-school-vue/src/mock/leaveschoolnode.js
@@ -0,0 +1,103 @@
+import { param2Obj } from '@/utils'
+
+const nodeList = [
+  {
+    'id': '26',
+    'name': '后勤处',
+    'department': { 'id': '2', 'dwmc': '后勤处' },
+    'contact': '张三',
+    'phoneNumber': '021-65431991',
+    'scope': { 'id': '27', 'name': '全校范围' },
+    'auditType': { 'id': '25', 'name': '手动' },
+    'defaultAuditStatus': { 'id': '22', 'name': '待审核' },
+    'auditNodeDuty': '',
+    'auditNodeAddress': '',
+    'deleted': '0'
+  },
+  {
+    'id': '27',
+    'name': '财务处',
+    'department': { 'id': '3', 'dwmc': '财务处' },
+    'contact': '李四',
+    'phoneNumber': '021-65431921',
+    'scope': { 'id': '27', 'name': '全校范围' },
+    'auditType': { 'id': '26', 'name': '自动' },
+    'defaultAuditStatus': { 'id': '22', 'name': '待审核' },
+    'auditNodeDuty': '',
+    'auditNodeAddress': '',
+    'deleted': '0'
+  },
+  {
+    'id': '28',
+    'name': '图书馆',
+    'department': { 'id': '4', 'dwmc': '图书馆' },
+    'contact': '王五',
+    'phoneNumber': '021-65431931',
+    'scope': { 'id': '27', 'name': '全校范围' },
+    'auditType': { 'id': '25', 'name': '手动' },
+    'defaultAuditStatus': { 'id': '22', 'name': '待审核' },
+    'auditNodeDuty': '',
+    'auditNodeAddress': '',
+    'deleted': '0'
+  }
+]
+
+export default{
+  getList: config => {
+    const { name, auditType, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = nodeList.filter(item => {
+      if (name && item.name !== name) return false
+      if (auditType && item.auditType.id !== auditType) 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 = nodeList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const node = JSON.parse(config.body)
+    if (!node.id) {
+      node.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      nodeList.unshift(node)
+    } else {
+      for (let i = 0; i < nodeList.length; i++) {
+        if (nodeList[i].id + '' === node.id + '') {
+          nodeList.splice(i, 1, node)
+          break
+        }
+      }
+    }
+    return {
+      item: node,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const node = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < nodeList.length; i++) {
+      if (nodeList[i].id + '' === node.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      nodeList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/mock/menulist.js b/leave-school-vue/src/mock/menulist.js
index 659e74f..4e0c3fa 100644
--- a/leave-school-vue/src/mock/menulist.js
+++ b/leave-school-vue/src/mock/menulist.js
@@ -90,6 +90,49 @@
     ]
   },
   {
+    path: '/procedures',
+    code: 'procedures',
+    meta: { title: '离校手续管理', icon: 'procedures' },
+    children: [
+      {
+        path: 'node',
+        code: 'Node',
+        resource: '/views/procedures/node/index',
+        meta: { title: '离校环节设置', icon: 'node' }
+      },
+      {
+        path: 'batch',
+        code: 'Batch',
+        resource: '/views/procedures/batch/index',
+        meta: { title: '离校批次管理', icon: 'batch' }
+      },
+      {
+        path: 'manifest',
+        code: 'manifest',
+        resource: '/views/procedures/manifest/index',
+        meta: { title: '离校名单管理', icon: 'manifest' }
+      },
+      {
+        path: 'batchaudit',
+        code: 'BatchAudit',
+        resource: '/views/procedures/batchAudit/index',
+        meta: { title: '离校批量审核管理', icon: 'batchAudit' }
+      },
+      {
+        path: 'audit',
+        code: 'Audit',
+        resource: '/views/procedures/audit/index',
+        meta: { title: '离校学生审核', icon: 'audit' }
+      },
+      {
+        path: 'view',
+        code: 'View',
+        resource: '/views/procedures/view/index',
+        meta: { title: '办理情况学生查看', icon: 'view' }
+      }
+    ]
+  },
+  {
     path: '/statistical',
     code: 'statistical',
     meta: { title: '离校统计查询', icon: 'news' },
diff --git a/leave-school-vue/src/views/procedures/node/index.vue b/leave-school-vue/src/views/procedures/node/index.vue
new file mode 100644
index 0000000..648e4f2
--- /dev/null
+++ b/leave-school-vue/src/views/procedures/node/index.vue
@@ -0,0 +1,231 @@
+<template>
+  <div class="app-container">
+    <div class="filter-container">
+      <el-row :gutter="20">
+        <el-col :span="5">
+          <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="审核环节名称" v-model="listQuery.name">
+          </el-input>
+        </el-col>
+        <el-col :span="5">
+          <el-select class="filter-item" v-model="listQuery.auditType" placeholder="审核方式">
+            <el-option v-for="item in auditTypeList" :key="item.id" :label="item.name" :value="item.id">
+            </el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="9">
+          <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">查询</el-button>
+          <el-button class="filter-item" style="margin-left: 10px;" @click="handleCreate(null, 'create')" type="primary" icon="el-icon-edit">添加</el-button>
+          <el-button class="filter-item" style="margin-left: 10px;" @click="handleReset" type="primary" icon="el-icon-edit">重置</el-button>
+        </el-col>
+      </el-row>
+    </div>
+    <el-table :height="height" :data="items" v-loading="listLoading" element-loading-text="Loading" border fit highlight-current-row>
+      <el-table-column align="center" type="index" label='序号' width="95">
+      </el-table-column>
+      <el-table-column label="审核环节名称" align="center">
+        <template slot-scope="scope">
+          {{scope.row.name}}
+        </template>
+      </el-table-column>
+      <el-table-column label="所属部门" align="center">
+        <template slot-scope="scope">
+          <span>{{scope.row.department.dwmc}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="联系人" align="center">
+        <template slot-scope="scope">
+          {{scope.row.contact}}
+        </template>
+      </el-table-column>
+      <el-table-column label="联系电话" align="center">
+        <template slot-scope="scope">
+          {{scope.row.phoneNumber}}
+        </template>
+      </el-table-column>
+      <el-table-column label="审核环节地址" align="center">
+        <template slot-scope="scope">
+          {{scope.row.auditNodeAddress}}
+        </template>
+      </el-table-column>
+      <el-table-column label="审核环节职责" align="center">
+        <template slot-scope="scope">
+          {{scope.row.auditNodeDuty}}
+        </template>
+      </el-table-column>
+      <el-table-column label="审核方式" align="center">
+        <template slot-scope="scope">
+          {{scope.row.auditType.name}}
+        </template>
+      </el-table-column>
+      <el-table-column label="范围控制" align="center">
+        <template slot-scope="scope">
+          {{scope.row.scope.name}}
+        </template>
+      </el-table-column>
+      <el-table-column label="默认审核状态" align="center">
+        <template slot-scope="scope">
+          {{scope.row.defaultAuditStatus.name}}
+        </template>
+      </el-table-column>
+      <el-table-column
+        fixed="right"
+        header-align="center"
+        align="center"
+        width="150"
+        label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="handleCreate(scope.row.id, 'update')">修改</el-button>
+          <el-button type="text" size="small" @click="handleDelete(scope.row.id)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="pagination-container">
+      <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listQuery.pageIndex" :page-sizes="[10,20,30, 50]" :page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="recordCount">
+      </el-pagination>
+    </div>
+
+    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" width="80%" top="10vh">
+      <el-form :rules="rules" ref="dataForm" :model="temp" label-position="left" label-width="150px" style='margin-left:50px;'>
+        <el-form-item label="审核环节名称" prop="name">
+          <el-input v-model="temp.name"></el-input>
+          <input type="hidden" v-model="temp.id" />
+        </el-form-item>
+        <el-form-item label="所属部门" prop="department">
+          <el-select class="filter-item" v-model="temp.department" placeholder="所属部门">
+            <el-option v-for="item in departmentList" :key="item.id" :label="item.dwmc" :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="联系人" prop="contact">
+          <el-input v-model="temp.contact"></el-input>
+        </el-form-item>
+        <el-form-item label="联系电话" prop="phoneNumber">
+          <el-input v-model="temp.phoneNumber"></el-input>
+        </el-form-item>
+        <el-form-item label="审核方式" prop="auditType">
+          <el-select class="filter-item" v-model="temp.auditType" placeholder="请选择">
+            <el-option v-for="item in auditTypeList" :key="item.id" :label="item.name" :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="控制范围" prop="scope">
+          <el-select class="filter-item" v-model="temp.scope" placeholder="请选择">
+            <el-option v-for="item in scopeList" :key="item.id" :label="item.name" :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="默认审核状态" prop="defaultAuditStatus">
+          <el-select class="filter-item" v-model="temp.defaultAuditStatus" placeholder="请选择">
+            <el-option v-for="item in statusList" :key="item.id" :label="item.name" :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="审核环节职责" prop="auditNodeDuty">
+          <el-input type="textarea" :rows="4" v-model="temp.auditNodeDuty"></el-input>
+        </el-form-item>
+        <el-form-item label="审核环节地址" prop="auditNodeAddress">
+          <el-input type="textarea" :rows="4" v-model="temp.auditNodeAddress"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">返回</el-button>
+        <el-button type="primary" @click="createData">提交</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getList, getItem, createNode, deleteNode } from '@/api/leaveschoolnode-api'
+import { getDicList } from '@/api/dictionary-api'
+import { getDeptList } from '@/api/department-api'
+import waves from '@/directive/waves' // 水波纹指令
+import { resetForm } from '@/utils'
+import { crudPageList, crudGetItem, crudCreate, crudDelete } from '@/utils/crud'
+import mixindata from '@/utils/crud'
+
+const initData = { auditType: '25', defaultAuditStatus: '22' }
+export default {
+  name: 'node',
+  directives: {
+    waves
+  },
+  mixins: [mixindata],
+  data() {
+    return {
+      config: {
+        initialFrameWidth: null,
+        initialFrameHeight: 350
+      },
+      departmentList: [],
+      auditTypeList: [],
+      scopeList: [],
+      statusList: [],
+      rules: {
+        name: [{ required: true, message: '环节名称', trigger: 'blur' }],
+        scope: [{ required: true, message: '范围控制', trigger: 'change' }],
+        department: [{ required: true, message: '所属部门', trigger: 'change' }]
+      }
+    }
+  },
+  created() {
+    this.getDepartmentList()
+    this.getAuditTypeList()
+    this.getStatusList()
+    this.getScopeList()
+    this.handlePageList()
+    this.height = window.innerHeight - 266
+  },
+  methods: {
+    getDepartmentList() {
+      getDeptList().then(response => {
+        this.departmentList = response.items
+      })
+    },
+    getAuditTypeList() {
+      getDicList({ type: 'auditType' }).then(response => {
+        this.auditTypeList = response.items
+      })
+    },
+    getScopeList() {
+      getDicList({ type: 'scope' }).then(response => {
+        this.scopeList = response.items
+      })
+    },
+    getStatusList() {
+      getDicList({ type: 'defaultAuditStatus' }).then(response => {
+        this.statusList = response.items
+      })
+    },
+    handlePageList() {
+      crudPageList(this, getList)
+    },
+    handleCreate(rowid, dialogStatus) {
+      this.dialogStatus = dialogStatus
+      crudGetItem(this, getItem, rowid, initData)
+    },
+    handleReset() {
+      resetForm(this.listQuery)
+    },
+    handleFilter() {
+      this.listQuery.pageIndex = 1
+      this.handlePageList()
+    },
+    handleSizeChange(val) {
+      this.listQuery.pageSize = val
+      this.handlePageList()
+    },
+    handleCurrentChange(val) {
+      this.listQuery.pageIndex = val
+      this.handlePageList()
+    },
+    createData() {
+      // this.temp.ggnr = this.$refs.ue.getUEContent()
+      crudCreate(this, createNode, this.handlePageList)
+    },
+    handleDelete(rowid) {
+      crudDelete(this, deleteNode, rowid, this.handlePageList)
+    }
+  }
+}
+</script>