用户管理
diff --git a/leave-school-vue/src/api/user-api.js b/leave-school-vue/src/api/user-api.js
index 9b237f3..e91922d 100644
--- a/leave-school-vue/src/api/user-api.js
+++ b/leave-school-vue/src/api/user-api.js
@@ -1,9 +1,40 @@
 import request from '@/utils/request'
 
-export function getList(params) {
+export function getPage(params) {
   return request({
     url: '/api/system/user/list-api',
+    // url: 'http://localhost:8080/leaveschool/api/v1/base/user',
     method: 'get',
     params
   })
 }
+export function getUserList(params) {
+  return request({
+    url: '/api/system/user/user-list',
+    method: 'get',
+    params
+  })
+}
+export function getItem(params) {
+  return request({
+    url: '/api/system/user/get-item',
+    method: 'get',
+    params
+  })
+}
+
+export function createUser(data) {
+  return request({
+    url: '/api/system/user/create-user',
+    method: 'post',
+    data
+  })
+}
+
+export function deleteUser(data) {
+  return request({
+    url: '/api/system/user/delete-user',
+    method: 'delete',
+    data
+  })
+}
diff --git a/leave-school-vue/src/icons/svg/permission.svg b/leave-school-vue/src/icons/svg/permission.svg
new file mode 100644
index 0000000..2af44ab
--- /dev/null
+++ b/leave-school-vue/src/icons/svg/permission.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="1535422291727" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3066" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M618.408704 431.7696a342.528 342.528 0 0 1 134.1952-27.1872c4.608 0 9.1904 0.2048 13.7984 0.2048 21.8112-55.1936 27.392-120.3712 16.4096-183.7568C757.416704 75.6736 620.200704-21.504 476.021504 4.096c-144 25.6-265.6 137.5744-240 282.9312 5.4016 31.3856 20.608 80.384 38.6048 115.7632L13.019904 780.0832c-9.6 13.7984-15.2064 38.8096-12.2112 55.808l11.392 64.5632c-10.8032-62.1824 2.9952 22.4 11.392 22.1952l86.1952 1.2032c16.5888-2.9952 37.4016-16.9984 46.592-31.2064l103.3984-161.7408 0.9984-0.9984 90.3936 7.1936 120.7808-189.3376c0.4096 0 0.8192 0.2048 1.2032 0.2048 10.8032-14.7968 22.6048-28.8 35.7888-42.0096a337.8432 337.8432 0 0 1 109.4656-74.1888zM69.621504 819.8656l-12.8 5.4016 1.408-14.0032 250.5984-363.6992 15.0016 14.0032-254.208 358.2976zM450.421504 150.656c39.6032-56.9856 117.5808-71.1936 173.9776-30.976a127.232 127.232 0 0 1 30.7968 175.9488c-39.6032 56.9856-80 16.7936-136.6016-23.1936-56.3712-40.192-107.776-64.5888-68.1728-121.7792z m0 0" fill="#bfcbd9" p-id="3067"></path><path d="M749.224704 474.5728c-151.808 0-274.7904 122.9568-274.7904 274.7392 0 151.7568 122.9824 274.688 274.7904 274.688S1024.015104 901.0432 1024.015104 749.312c0-151.7824-123.008-274.7392-274.7904-274.7392z m158.7968 387.4816c0 41.0112-78.592 50.4064-152.3968 50.4064s-153.3952-9.3952-153.3952-50.4064v-11.3664c0-30.208 54.4-60.8 100.608-77.3888 3.4048-1.2032 19.4048-10.0096 10.3936-33.3824-22.9888-23.3984-40.192-61.3888-40.192-98.7648 0-57.1904 37.8112-87.168 82.2016-87.168 44.2112 0 82.4064 29.9776 82.4064 87.168 0 37.1968-17.408 74.9824-40.192 98.5856h0.2048c-8.8064 26.5728 5.1968 32.9728 7.3984 33.5872 48.5888 16 103.1936 46.4128 103.1936 77.3888l-0.2304 11.3408z m0 0" fill="#bfcbd9" p-id="3068"></path></svg>
\ No newline at end of file
diff --git a/leave-school-vue/src/icons/svg/user.svg b/leave-school-vue/src/icons/svg/user.svg
index 5971dee..0937f8f 100644
--- a/leave-school-vue/src/icons/svg/user.svg
+++ b/leave-school-vue/src/icons/svg/user.svg
@@ -1 +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="1503993891882" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7986" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M504.951 511.98c93.49 0 169.28-74.002 169.28-165.26 0-91.276-75.79-165.248-169.28-165.248-93.486 0-169.287 73.972-169.279 165.248-0.001 91.258 75.793 165.26 169.28 165.26z m77.6 55.098H441.466c-120.767 0-218.678 95.564-218.678 213.45V794.3c0 48.183 97.911 48.229 218.678 48.229H582.55c120.754 0 218.66-1.78 218.66-48.229v-13.77c0-117.887-97.898-213.45-218.66-213.45z" p-id="7987"></path></svg>
\ No newline at end of file
+<?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="1535422508730" class="icon" style="" viewBox="0 0 1181 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8467" xmlns:xlink="http://www.w3.org/1999/xlink" width="230.6640625" height="200"><defs><style type="text/css"></style></defs><path d="M1116.79948438 868.10426187c15.72693187 29.68181531 22.74129187 63.94142438 22.74129187 100.2684225a18.97568813 18.97568813 0 0 1-18.97568812 18.97568813H246.72357312a18.97568813 18.97568813 0 0 1-18.97568906-19.04952375c0-36.32699813 2.5842375-70.14359438 21.33842063-102.3358125 13.88104781-23.99649281 33.96426656-44.59655906 59.51130187-61.28335125 31.01085188-20.08321875 70.21742999-34.40727938 116.65987313-42.45533344a683.86312781 683.86312781 0 0 0 73.09700812-14.61940125c48.87901031-12.84735281 74.13070406-21.78143156 69.33140531-76.27192969-6.20217001-70.21742999-42.82451063-111.71290313-72.21098437-145.0864875a348.05989875 348.05989875 0 0 1-24.80868188-30.27249843 194.92535719 194.92535719 0 0 1-31.89687656-92.737215c0-19.04952375 9.52476187-27.83593125 17.94199312-35.58864563l0.44301282-0.44301187a7.60504219 7.60504219 0 0 0 0.5168475-0.5168475 41.79081563 41.79081563 0 0 0-1.033695-7.16203032A473.28467344 473.28467344 0 0 1 454.939295 216.72869375c2.43656719-51.68475375 46.95929063-91.1866725 48.87901031-92.81105062l0.22150594-0.22150688a84.17231344 84.17231344 0 0 0 18.08966344-19.78787625L521.02194406 101.32402156a41.2001325 41.2001325 0 0 1-4.13478-25.39936406c1.32903657-6.64518281 6.20217001-18.68034656 24.51334032-23.62731656 7.38353625-1.91971969 15.28392-2.28889594 21.04307812-2.58423749l1.10753063-0.07383564a554.50357219 554.50357219 0 0 1 71.62030218-0.29534156c177.50021156 13.58570625 238.63589156 79.88986219 241.22012907 82.69560656l0.36917718 0.5168475c14.250225 16.98213375 24.73484625 38.24671781 31.30619344 63.05539969 2.06739001 7.75271344 3.32259094 14.250225 4.13478 20.37856031 6.20217001 36.03165657 5.168475 73.09700906 3.83943938 97.83185532a483.62162438 483.62162438 0 0 1-4.87313438 45.92559468c-0.73835344 4.72546313 0 5.61148781 0.36917719 5.90682938 0.73835344 0.95985937 1.69821375 1.99355437 2.65807312 3.02725032a47.25463219 47.25463219 0 0 1 12.18283407 19.0495228 50.94640031 50.94640031 0 0 1 2.06739093 15.50542688v0.95985937a195.14686313 195.14686313 0 0 1-31.8968775 91.85119125c-6.71901844 9.74626781-15.50542594 19.64020688-24.73484625 30.19866282-29.46030938 33.37358343-66.00881438 74.8690575-72.21098437 145.0864875-4.87313438 54.63816844 20.67390187 63.49841156 69.62674687 76.34576437 36.32699813 9.5985975 71.69413687 14.39789531 72.06331407 14.47173187 0.29534156 0 0.66451781 0 0.95985937 0.14767032 46.81161937 8.63873719 86.31353906 23.331975 117.39822656 43.56286406 25.47319969 16.68679219 44.22738187 37.87754063 57.14857032 62.24321062zM174.21724625 952.20273969v0.29534156c0.14767031 10.115445-7.16203031 18.68034656-17.27747438 18.68034656H51.05986156a18.97568813 18.97568813 0 0 1-18.97568812-18.97568812v-22.88896219a151.51016345 151.51016345 0 0 1 21.41225531-79.52068594c13.88104781-23.92265719 33.96426656-44.52272343 59.51130281-61.20951562 49.4696925-32.1183825 92.95872187-50.28188156 149.29510219-65.12278969 62.90772844-16.61295657 68.44538062-31.30619344 68.44538156-31.45386375a19.4187 19.4187 0 0 1 1.62437813-4.13478094c0.5168475-2.73190875 1.77204844-13.06885875-0.66451875-40.68328501-6.20217001-70.29126469-42.82451063-103.73868469-72.13714875-137.11226811-9.30325594-10.48462125-18.08966345-20.452395-24.80868188-30.19866281a194.92535719 194.92535719 0 0 1-31.89687656-92.737215c0-19.12335844 9.45092625-27.90976687 17.8681575-35.66248032l0.44301187-0.36917718a8.19572531 8.19572531 0 0 0 0.59068313-0.59068314 43.48902844 43.48902844 0 0 0-1.033695-7.16202936 472.98933188 472.98933188 0 0 1-1.69821281-142.72375594c2.43656719-51.61091812 46.95929063-91.11283781 48.80517375-92.81105063a84.17231344 84.17231344 0 0 0 18.31117031-19.93554843L285.04412562 85.2279125a41.34780281 41.34780281 0 0 1-4.06094437-25.47319969c1.25520094-6.64518281 6.12833531-18.60651094 24.51334031-23.55348093 7.38353625-1.91971969 15.21008438-2.36273156 20.9692425-2.65807313h1.18136625c22.74129187-1.25520094 47.03312625-2.21506125 71.62030125-0.36917625 27.61442531 2.14122563 52.42310719 5.53765219 74.64755157 9.74626781a28.05743813 28.05743813 0 0 0-10.55845688 16.8344625 41.27396719 41.27396719 0 0 0 4.13478 25.47319969l1.10753062 2.65807313a84.02464219 84.02464219 0 0 1-18.31116937 19.93554843c-1.91971969 1.69821375-46.44244313 41.2001325-48.87901031 92.81105063a472.98933188 472.98933188 0 0 0 2.73190875 149.8857853l-0.5168475 0.59068314-0.44301282 0.36917718c-8.41723125 7.75271344-17.94199312 16.53912094-17.94199312 35.66248032v0.88602375c0.14767031 2.06739001 2.80574345 49.83886969 31.89687656 91.85119125 6.79285312 9.74626781 15.50542594 19.71404156 24.80868188 30.27249843 29.38647469 33.29974875 66.00881438 74.79522187 72.21098437 145.0864875 4.79929875 54.78583875-20.30472469 63.35074125-69.40524 76.27192969-36.25316345 9.5985975-71.98947844 14.39789531-72.35865562 14.47173094l-0.73835344 0.14767031c-46.3686075 8.04805406-85.64902031 22.37211469-116.65987313 42.45533344a182.89019344 182.89019344 0 0 0-59.43746625 61.28335125 151.51016345 151.51016345 0 0 0-21.41225531 79.520685v22.8151275z" p-id="8468" fill="#bfcbd9"></path></svg>
\ No newline at end of file
diff --git a/leave-school-vue/src/mock/index.js b/leave-school-vue/src/mock/index.js
index c2ab223..34a75e5 100644
--- a/leave-school-vue/src/mock/index.js
+++ b/leave-school-vue/src/mock/index.js
@@ -21,6 +21,7 @@
 import sectionreportApi from './sectionreport'
 
 import leaveschoolnodeApi from './leaveschoolnode'
+import userApi from './user'
 
 // 登录
 Mock.mock(/\/api\/login\/login/, 'post', loginApi.loginByUsername)
@@ -125,4 +126,11 @@
 Mock.mock(/\/api\/procedures\/node\/delete-node/, 'delete', leaveschoolnodeApi.deleteData)
 Mock.mock(/\/api\/procedures\/node\/get-item/, 'get', leaveschoolnodeApi.getItem)
 
+// 用户管理
+Mock.mock(/\/api\/system\/user\/list-api/, 'get', userApi.getPage)
+Mock.mock(/\/api\/system\/user\/dept-list/, 'get', userApi.getUserList)
+Mock.mock(/\/api\/system\/user\/create-user/, 'post', userApi.createData)
+Mock.mock(/\/api\/system\/user\/delete-user/, 'delete', userApi.deleteData)
+Mock.mock(/\/api\/system\/user\/get-item/, 'get', userApi.getItem)
+
 export default Mock
diff --git a/leave-school-vue/src/mock/menulist.js b/leave-school-vue/src/mock/menulist.js
index 616ae59..55292e5 100644
--- a/leave-school-vue/src/mock/menulist.js
+++ b/leave-school-vue/src/mock/menulist.js
@@ -3,6 +3,19 @@
 
 const menuList = [
   {
+    path: '/permission',
+    code: 'permission',
+    meta: { title: '用户权限管理', icon: 'permission' },
+    children: [
+      {
+        path: 'user',
+        code: 'user',
+        resource: '/views/systemmanagement/user/index',
+        meta: { title: '用户管理', icon: 'user' }
+      }
+    ]
+  },
+  {
     path: '/dictionary',
     code: 'dictionary',
     meta: { title: '数据字典管理', icon: 'dictionary' },
diff --git a/leave-school-vue/src/mock/user.js b/leave-school-vue/src/mock/user.js
new file mode 100644
index 0000000..431f833
--- /dev/null
+++ b/leave-school-vue/src/mock/user.js
@@ -0,0 +1,119 @@
+import Mock from 'mockjs'
+import { param2Obj, parseTime } from '@/utils'
+
+const userList = Mock.mock({
+  'list|26': [{
+    'id': '@increment',
+    'rownum': '@id',
+    'ghxh': '@id',
+    'xm': '000@id',
+    'zhlb|1': ['教职工', '学生', '其他'],
+    'xb|1': ['男', '女'],
+    'zt|1': ['启用', '停用'],
+    'yx': '@cword(3, 5)',
+    'xybm': '@word(6, 10)',
+    'gzdw': '@word(6, 10)',
+    'sj': '@cword(3, 5)',
+    'wx': '@cword(3, 5)',
+    'qq': '@cword(3, 5)'
+  }]
+}).list
+
+const zhlbList = Mock.mock(
+  [{
+    'value': 'teacher',
+    'label': '教职工'
+  },
+  {
+    'value': 'student',
+    'label': '学生'
+  },
+  {
+    'value': 'other',
+    'label': '其他'
+  }]
+)
+
+const xbList = Mock.mock(
+  [{
+    'value': 'male',
+    'label': '男'
+  },
+  {
+    'value': 'female',
+    'label': '女'
+  }]
+)
+const ztList = Mock.mock(
+  [{
+    'value': 'on',
+    'label': '启用'
+  },
+  {
+    'value': 'off',
+    'label': '停用'
+  }]
+)
+export default{
+  getPage: config => {
+    const { zhlb, ghxhxm, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const mockList = userList.filter(item => {
+      if (zhlb && item.zhlb !== zhlb) return false
+      if (ghxhxm && item.ghxh + '' !== ghxhxm + '' && item.xm + '' !== ghxhxm + '') return false
+      return true
+    })
+
+    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
+    return {
+      xbList: xbList,
+      ztList: ztList,
+      zhlbList: zhlbList,
+      items: pageList,
+      recordCount: mockList.length,
+      code: 200
+    }
+  },
+  getItem: config => {
+    const { id } = param2Obj(config.url)
+    const mockList = userList.filter(item => item.id + '' === id + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  createData: config => {
+    const user = JSON.parse(config.body)
+    user.cjsj = parseTime(new Date(), '{y}-{m}-{d}')
+    if (!user.id) {
+      user.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      userList.unshift(user)
+    } else {
+      for (let i = 0; i < userList.length; i++) {
+        if (userList[i].id + '' === user.id + '') {
+          userList.splice(i, 1, user)
+          break
+        }
+      }
+    }
+    return {
+      item: user,
+      code: 200
+    }
+  },
+  deleteData: config => {
+    const user = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < userList.length; i++) {
+      if (userList[i].id + '' === user.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      userList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  }
+}
diff --git a/leave-school-vue/src/utils/crud.js b/leave-school-vue/src/utils/crud.js
index e7639a1..16b9300 100644
--- a/leave-school-vue/src/utils/crud.js
+++ b/leave-school-vue/src/utils/crud.js
@@ -4,6 +4,7 @@
   data() {
     return {
       items: null,
+      pagedata: {},
       recordCount: null,
       listLoading: true,
       dialogStatus: '',
@@ -31,6 +32,7 @@
     page.recordCount = response.recordCount
     page.pageIndex = response.pageIndex
     page.pageSize = response.pageSize
+    page.pagedata = response
     if (typeof _callback === 'function') {
       _callback()
     }
diff --git a/leave-school-vue/src/views/systemmanagement/user/index.vue b/leave-school-vue/src/views/systemmanagement/user/index.vue
new file mode 100644
index 0000000..c069707
--- /dev/null
+++ b/leave-school-vue/src/views/systemmanagement/user/index.vue
@@ -0,0 +1,228 @@
+<template>
+  <div class="app-container">
+    <div class="filter-container">
+      <el-select clearable class="filter-item" v-model="listQuery.zhlb" placeholder="账户类别">
+        <el-option v-for="item in pagedata.zhlbList" :key="item.value" :label="item.label" :value="item.value">
+        </el-option>
+      </el-select>
+      <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="(工号/学号)或姓名" v-model="listQuery.ghxhxm">
+      </el-input>
+      <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>
+    </div>
+    <el-table :height="height" :data="items" v-loading="listLoading" element-loading-text="Loading" border fit highlight-current-row>
+      <el-table-column fixed align="center" label='序号' width="95">
+        <template slot-scope="scope">
+          {{scope.row.rownum}}
+        </template>
+      </el-table-column>
+      <el-table-column fixed label="工号/学号">
+        <template slot-scope="scope">
+          {{scope.row.ghxh}}
+        </template>
+      </el-table-column>
+      <el-table-column label="姓名" align="center">
+        <template slot-scope="scope">
+          <span>{{scope.row.xm}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="帐户类别" align="center">
+        <template slot-scope="scope">
+          {{scope.row.zhlb}}
+        </template>
+      </el-table-column>
+      <el-table-column label="性别" align="center">
+        <template slot-scope="scope">
+          {{scope.row.xb}}
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center">
+        <template slot-scope="scope">
+          {{scope.row.zt}}
+        </template>
+      </el-table-column>
+      <el-table-column label="邮箱" align="center">
+        <template slot-scope="scope">
+          {{scope.row.yx}}
+        </template>
+      </el-table-column>
+      <el-table-column label="学院/部门" align="center">
+        <template slot-scope="scope">
+          {{scope.row.xybm}}
+        </template>
+      </el-table-column>
+      <el-table-column label="工作单位" align="center">
+        <template slot-scope="scope">
+          {{scope.row.gzdw}}
+        </template>
+      </el-table-column>
+      <el-table-column label="手机" align="center">
+        <template slot-scope="scope">
+          {{scope.row.sj}}
+        </template>
+      </el-table-column>
+      <el-table-column label="微信" align="center">
+        <template slot-scope="scope">
+          {{scope.row.wx}}
+        </template>
+      </el-table-column>
+      <el-table-column label="QQ" align="center">
+        <template slot-scope="scope">
+          {{scope.row.qq}}
+        </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">
+      <el-form :rules="rules" ref="dataForm" :model="temp" label-position="left" label-width="150px" style='width: 400px; margin-left:50px;'>
+        <el-form-item label="账号(工号/学号)" prop="ghxh">
+          <el-input v-model="temp.ghxh"></el-input>
+          <input type="hidden" v-model="temp.id" />
+        </el-form-item>
+        <el-form-item label="密码" prop="mm">
+          <el-input type="password" v-model="temp.mm"></el-input>
+        </el-form-item>
+        <el-form-item label="账户类别" prop="zhlb">
+          <el-select clearable class="filter-item" v-model="temp.zhlb" placeholder="账户类别">
+            <el-option v-for="item in pagedata.zhlbList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="性别">
+          <el-radio-group v-model="temp.xb">
+            <el-radio v-for="item in pagedata.xbList" :label="item.value" :key="item.value" >{{item.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-radio-group v-model="temp.zt">
+            <el-radio v-for="item in pagedata.ztList" :label="item.value" :key="item.value" >{{item.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="邮箱">
+          <el-input v-model="temp.yx"></el-input>
+        </el-form-item>
+        <el-form-item label="姓名" prop="xm">
+          <el-input v-model="temp.xm"></el-input>
+        </el-form-item>
+        <el-form-item label="部门">
+          <el-input v-model="temp.bm"></el-input>
+        </el-form-item>
+        <el-form-item label="职务">
+          <el-input v-model="temp.zw"></el-input>
+        </el-form-item>
+        <el-form-item label="电话">
+          <el-input v-model="temp.dh"></el-input>
+        </el-form-item>
+        <el-form-item label="传真">
+          <el-input v-model="temp.cz"></el-input>
+        </el-form-item>
+        <el-form-item label="手机">
+          <el-input v-model="temp.sj"></el-input>
+        </el-form-item>
+        <el-form-item label="QQ">
+          <el-input v-model="temp.qq"></el-input>
+        </el-form-item>
+        <el-form-item label="微信">
+          <el-input v-model="temp.wx"></el-input>
+        </el-form-item>
+        <el-form-item label="地址">
+          <el-input v-model="temp.dz"></el-input>
+        </el-form-item>
+        <el-form-item label="邮编">
+          <el-input v-model="temp.yb"></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 { getPage, getItem, createUser, deleteUser } from '@/api/user-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 = { xb: 'male', zt: 'on' }
+export default {
+  name: 'user',
+  directives: {
+    waves
+  },
+  mixins: [mixindata],
+  data() {
+    return {
+      rules: {
+        ghxh: [{ required: true, message: '账号(工号/学号)必填', trigger: 'blur' }],
+        mm: [{ required: true, message: '密码必填', trigger: 'blur' }],
+        zhlb: [{ required: true, message: '账户类别必填', trigger: 'change' }],
+        xm: [{ required: true, message: '姓名必填', trigger: 'change' }]
+      }
+    }
+  },
+  filters: {
+    statusFilter(status) {
+      const statusMap = {
+        '1': 'success',
+        '0': 'danger'
+      }
+      return statusMap[status]
+    }
+  },
+  created() {
+    this.handlePageList()
+    this.height = window.innerHeight - 216
+  },
+  methods: {
+    handlePageList() {
+      crudPageList(this, getPage)
+    },
+    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() {
+      crudCreate(this, createUser, this.handlePageList)
+    },
+    handleDelete(rowid) {
+      crudDelete(this, deleteUser, rowid, this.handlePageList)
+    }
+  }
+}
+</script>