e 4 年之前
父节点
当前提交
9806435988

文件差异内容过多而无法显示
+ 16023 - 3668
package-lock.json


+ 61 - 0
src/api/systemAdmin.js

@@ -0,0 +1,61 @@
+import { ajax } from "../sdk/ajax";
+import dataColor from "echarts/src/visual/dataColor";
+
+/* 用户管理 */
+
+// 用户列表
+export const userList = (data) => ajax("post", '/user/list', data);
+
+// 用户删除
+export const userRemove = (data) => ajax("post", '/user/remove', data);
+
+// 用户添加
+export const userAdd = (data) => ajax("post", '/user/add', data);
+
+// 用户编辑
+export const userEdit = (data) => ajax("post", '/user/edit', data);
+
+// 账号激活
+export const userActivate = (data) => ajax('post', '/account/setAccountStatus', data);
+
+
+
+/* 菜单管理 */
+
+// 菜单添加
+export const menuAdd = (data) => ajax('post', '/menu/add', data);
+
+// 菜单删除
+export const menuRemove = (data) => ajax('post', '/menu/remove', data);
+
+// 菜单列表
+export const menuList = (data) => ajax('post', '/menu/list', data);
+
+//菜单编辑
+export const menuEdit = (data) => ajax('post', '/menu/edit', data);
+
+
+/* 权限管理 */
+
+// 权限组添加
+export const authAdd = (data) => ajax('post', '/group/add', data);
+
+// 权限组编辑
+export const authEdit = (data) => ajax('post', '/group/edit', data);
+
+// 权限组删除
+export const authRemove = (data) => ajax('post', '/group/remove', data);
+
+// 用户权限获取
+export const authUserGroup = (data) => ajax('post', '/auth/getAcountByGroup', data);
+
+// 用户权限保存
+export const authUserSave = (data) => ajax('post', '/auth/saveAccountGroup', data);
+
+// 权限菜单分配获取
+export const authMenuGroup = (data) => ajax('post', '/auth/getMenuByGroup', data);
+
+// 权限菜单分配保存
+export const authMenuSave = (data) => ajax('post', '/auth/saveGroupMenu', data);
+
+

+ 55 - 0
src/components/TableFooter.vue

@@ -0,0 +1,55 @@
+<template>
+  <div style="margin-top: 20px; height: 50px">
+    <el-pagination background
+                   style="float: right; display: inline-block"
+                   :total="totals"
+                   layout="total, sizes, prev, pager, next, jumper"
+                   @size-change="sizeChange"
+                   @current-change="pageChange"
+                   :page-sizes="sizesArray"
+                   :page-size="size"></el-pagination>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "TableFooter",
+    data() {
+      return {
+
+      }
+    },
+    props: {
+      totals: {
+        type: Number,
+        default() {
+          return 0;
+        },
+      },
+      sizesArray: {
+        type: Array,
+        default() {
+          return [10, 20, 40, 60, 80, 100];
+        },
+      },
+      size: {
+        type: Number,
+        default() {
+          return 20;
+        },
+      },
+    },
+    methods: {
+      sizeChange(value) {
+        this.$emit('sizeChange', value);
+      },
+      pageChange(value) {
+        this.$emit('pageChange', value);
+      },
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 5 - 3
src/main.js

@@ -10,10 +10,12 @@ import localModule from './module'
 import './assets/css/reset.scss'
 import './assets/css/reset.scss'
 import 'default-passive-events' // ( https://www.jianshu.com/p/23850d4cade8 )
 import 'default-passive-events' // ( https://www.jianshu.com/p/23850d4cade8 )
 import echarts from "echarts";
 import echarts from "echarts";
-import moment from 'moment'
+import moment from 'moment';
+import axios from 'axios';
 moment.locale('zh-cn');  // 汉化
 moment.locale('zh-cn');  // 汉化
-Vue.prototype.$moment = moment; 
-Vue.prototype.$echarts = echarts
+Vue.prototype.$moment = moment;
+Vue.prototype.$echarts = echarts;
+Vue.prototype.$axios = axios;
 
 
 Vue.use(vueModuleLoader, { store }).use(ElementUI);
 Vue.use(vueModuleLoader, { store }).use(ElementUI);
 
 

+ 29 - 0
src/router/routes.js

@@ -58,12 +58,25 @@ import productData from '@/views/statisticAnalysis/productData.vue'
 /* 销售管理 */
 /* 销售管理 */
 import sellLog from '@/views/sell/sellLog.vue'
 import sellLog from '@/views/sell/sellLog.vue'
 
 
+/* 系统管理 */
+import authAdmin from "../views/systemAdmin/authAdmin";
+import menuAdmin from "../views/systemAdmin/menuAdmin";
+import userAdmin from "../views/systemAdmin/userAdmin";
+
+/* 首页 */
+import dashboard from  '../views/dashboard';
+
 
 
 export default [
 export default [
 	{
 	{
 		path: '/home',
 		path: '/home',
 		component: Home,
 		component: Home,
 		children: [
 		children: [
+			{
+				path: 'dashboard',
+				name: 'dashboard',
+				component: dashboard,
+			},
 			/* 档案信息 */
 			/* 档案信息 */
 			{
 			{
 				path: 'firmInfo',
 				path: 'firmInfo',
@@ -268,6 +281,22 @@ export default [
 				path: 'productData',
 				path: 'productData',
 				name: 'productData',
 				name: 'productData',
 				component: productData
 				component: productData
+			},
+			/* 系统管理 */
+			{
+				path: 'authAdmin',
+				name: 'authAdmin',
+				component: authAdmin
+			},
+			{
+				path: 'menuAdmin',
+				name: 'menuAdmin',
+				component: menuAdmin
+			},
+			{
+				path: 'userAdmin',
+				name: 'userAdmin',
+				component: userAdmin
 			}
 			}
 		]
 		]
 	},
 	},

+ 1 - 1
src/sdk/ajax.js

@@ -14,7 +14,7 @@ Vue.use(VueAxios, axios)
 
 
 /* 常用ajax封装 */
 /* 常用ajax封装 */
 export const ajax = function (type = "post", url, params) {
 export const ajax = function (type = "post", url, params) {
-    let token = localStorage.getItem("token")
+    let token = localStorage.getItem("token");
     if (type.toLowerCase() == 'get') {
     if (type.toLowerCase() == 'get') {
         return new Promise((resole, reject) => {
         return new Promise((resole, reject) => {
             axios({
             axios({

+ 2 - 2
src/sdk/config.js

@@ -1,5 +1,5 @@
 export default {
 export default {
-  serverAddress: 'http://115.238.57.190:8010',
-  // serverAddress: 'http://121.37.169.186:8010',
+  // serverAddress: 'http://115.238.57.190:8010',
+  serverAddress: 'http://121.37.169.186:8010',
   IMG_BASE: 'http://115.238.57.190:8888/uploads/'
   IMG_BASE: 'http://115.238.57.190:8888/uploads/'
 }
 }

+ 3 - 2
src/store/index.js

@@ -1,6 +1,6 @@
 import Vue from 'vue'
 import Vue from 'vue'
 import Vuex from 'vuex'
 import Vuex from 'vuex'
-import publicType from './publicType.js' // 公共的类型 
+import publicType from './publicType.js' // 公共的类型
 import { reqWorkerList, reqBuildList } from "@/api/fileInfo.js";
 import { reqWorkerList, reqBuildList } from "@/api/fileInfo.js";
 import { reqBasicsInfoList } from "@/api/material.js";
 import { reqBasicsInfoList } from "@/api/material.js";
 import { reqBatchList } from "@/api/production.js";
 import { reqBatchList } from "@/api/production.js";
@@ -11,6 +11,7 @@ Vue.use(Vuex)
 export default new Vuex.Store({
 export default new Vuex.Store({
 	strict: true,
 	strict: true,
 	state: {
 	state: {
+		typeCode: '养殖管理菜单',
 		token: localStorage.getItem("token"),
 		token: localStorage.getItem("token"),
 		workerList: [{ id: 1 }], // 员工列表 (加{id:1} 是为了防止刷新时报错,因为设置默认值时用到过)
 		workerList: [{ id: 1 }], // 员工列表 (加{id:1} 是为了防止刷新时报错,因为设置默认值时用到过)
 		areaList: [{ id: 1 }],  // 栋舍列表
 		areaList: [{ id: 1 }],  // 栋舍列表
@@ -75,6 +76,6 @@ export default new Vuex.Store({
 			}).then(res => {
 			}).then(res => {
 				commit('setState', ['storeList', res.content])
 				commit('setState', ['storeList', res.content])
 			})
 			})
-		}
+		},
 	}
 	}
 })
 })

+ 45 - 23
src/views/Home/Home.vue

@@ -2,7 +2,7 @@
     <div class="home">
     <div class="home">
         <header class="header">
         <header class="header">
             <div class="left">
             <div class="left">
-                湖羊养殖管理 
+                湖羊养殖管理
                 <el-button
                 <el-button
                     @click="onMenuCollapse"
                     @click="onMenuCollapse"
                     circle
                     circle
@@ -48,37 +48,37 @@
                         :collapse="menuCollapse"
                         :collapse="menuCollapse"
                         :unique-opened="true"
                         :unique-opened="true"
                         :default-openeds="defaultUnfoldedMenu"
                         :default-openeds="defaultUnfoldedMenu"
-                        select="1-1"
+                        select="0-1"
                         background-color="#545c64"
                         background-color="#545c64"
                         text-color="#fff"
                         text-color="#fff"
                         active-text-color="#ffd04b"
                         active-text-color="#ffd04b"
                     >
                     >
-                        <div v-for="(item, index1) in menuData " :key="index1">
+                        <div v-for="(item, index1) in menu " :key="index1">
                             <el-submenu
                             <el-submenu
-                                v-if="item.childList && item.childList.length > 0"
+                                v-if="item.children && item.children.length > 0"
                                 :index="`${index1}`"
                                 :index="`${index1}`"
                             >
                             >
                                 <template slot="title">
                                 <template slot="title">
-                                    <i :class="item.iconClassName"></i>
-                                    <span slot="title">{{ !menuCollapse? item.optionName : '' }}</span>
+<!--                                    <i :class="item.iconClassName"></i>-->
+                                    <span slot="title">{{ !menuCollapse? item.menuName : '' }}</span>
                                 </template>
                                 </template>
                                 <el-menu-item
                                 <el-menu-item
-                                    v-for="(item1, index2) in item.childList"
+                                    v-for="(item1, index2) in item.children"
                                     :key="`${index1}-${index2}`"
                                     :key="`${index1}-${index2}`"
                                     :index="`${index1}-${index2}`"
                                     :index="`${index1}-${index2}`"
-                                    :routerName="item1.routerName"
+                                    :routerName="item1.url"
                                     @click="onClickMenu(item1)"
                                     @click="onClickMenu(item1)"
-                                >{{ item1.optionName }}</el-menu-item>
+                                >{{ item1.menuName }}</el-menu-item>
                             </el-submenu>
                             </el-submenu>
                             <el-menu-item
                             <el-menu-item
                                 v-else
                                 v-else
                                 :index="`${index1}`"
                                 :index="`${index1}`"
-                                :disabled="item.disabled"
-                                :routerName="item.routerName"
+                                :routerName="item.url"
                                 @click="onClickMenu(item)"
                                 @click="onClickMenu(item)"
                             >
                             >
-                                <i :class="item.iconClassName"></i>
-                                <span slot="title">{{ !menuCollapse? item.optionName : '' }}</span>
+                                <!--   :disabled="item.disabled"-->
+<!--                                <i :class="item.iconClassName"></i>-->
+                                <span slot="title">{{ !menuCollapse? item.menuName : '' }}</span>
                             </el-menu-item>
                             </el-menu-item>
                         </div>
                         </div>
                     </el-menu>
                     </el-menu>
@@ -96,25 +96,33 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import { menuData } from "./mencCofig.js";
+// import { menuData } from "./mencCofig.js";
+import { mapState } from 'vuex';
 
 
 export default {
 export default {
     data() {
     data() {
         return {
         return {
             // 菜单配置
             // 菜单配置
-            menuData,
+            menuData: [],
             menuCollapse: false, //是否水平折叠收起菜单
             menuCollapse: false, //是否水平折叠收起菜单
-            defaultUnfoldedMenu: [menuData[0].index], // 默认展开第一项
+            defaultUnfoldedMenu: '', // 默认展开第一项
         };
         };
     },
     },
     created() {
     created() {
+      // this.menuData = [];
         this.defaultUnfoldedMenu = [
         this.defaultUnfoldedMenu = [
             localStorage.getItem("defaultUnfoldedMenu")
             localStorage.getItem("defaultUnfoldedMenu")
         ];
         ];
         this.menuCollapse = JSON.parse(localStorage.getItem("menuCollapse"));
         this.menuCollapse = JSON.parse(localStorage.getItem("menuCollapse"));
-        
+    },
+    computed: {
+      ...mapState(['typeCode']),
+      menu() {
+        return this.menuData
+      }
     },
     },
     mounted() {
     mounted() {
+        this.init();
         // 获取员工列表 给后面下拉选择器使用
         // 获取员工列表 给后面下拉选择器使用
         this.$store.dispatch('getWorkerList')
         this.$store.dispatch('getWorkerList')
         // 获取栋舍列表 给后面下拉选择器使用
         // 获取栋舍列表 给后面下拉选择器使用
@@ -124,7 +132,7 @@ export default {
         // 获取批次列表 给后面下拉选择器使用
         // 获取批次列表 给后面下拉选择器使用
         this.$store.dispatch('getBatchList')
         this.$store.dispatch('getBatchList')
         // 获取库存列表 给后面下拉选择器使用
         // 获取库存列表 给后面下拉选择器使用
-        this.$store.dispatch('getStoreList')
+        this.$store.dispatch('getStoreList');
     },
     },
     methods: {
     methods: {
         // 收取菜单按钮
         // 收取菜单按钮
@@ -145,15 +153,29 @@ export default {
         onClickMenu(item) {
         onClickMenu(item) {
             let _this = this;
             let _this = this;
             // 如果要跳转的路由和当前路由一致就 return
             // 如果要跳转的路由和当前路由一致就 return
-            if (this.$router.history.current.name == item.routerName) return;
+            if (this.$router.history.current.name == item.menuName) return;
             this.$router.push({
             this.$router.push({
-                name: item.routerName
+                name: item.url
             });
             });
         },
         },
         onLogOut() {
         onLogOut() {
             this.$router.replace('login')
             this.$router.replace('login')
+        },
+        init() {
+          let accountName = localStorage.getItem('accountName');
+          let that = this;
+          this.$axios.post(`http://121.37.169.186:8081/auth/getMyMenu?accountName=${accountName}`)
+            .then(res => {
+              if(res.data.code === 10000) {
+                res.data.data.forEach(item => {
+                  if(item.menuName === that.typeCode) {
+                    that.menuData  = item.children;
+                  }
+                });
+              }
+            });
         }
         }
-    }
+    },
 };
 };
 </script>
 </script>
 
 
@@ -209,7 +231,7 @@ export default {
                 margin-right: 5px;
                 margin-right: 5px;
                 height: 100%;
                 height: 100%;
                 overflow: auto;
                 overflow: auto;
-                
+
                 .warp {
                 .warp {
                     margin: 15px;
                     margin: 15px;
                 }
                 }
@@ -231,4 +253,4 @@ export default {
 .el-icon-arrow-down {
 .el-icon-arrow-down {
     font-size: 12px;
     font-size: 12px;
 }
 }
-</style>
+</style>

+ 16 - 3
src/views/Login/Login.vue

@@ -72,6 +72,18 @@ export default {
                     console.log("登录失败", err);
                     console.log("登录失败", err);
                     this.$message.error("登录失败:" + err);
                     this.$message.error("登录失败:" + err);
                 });
                 });
+            this.$axios.post(`http://121.37.169.186:8081/my/login?accountName=${this.form.userName}&password=${this.form.userPwd}`)
+            .then(res => {
+                loading.close();
+                if(res.data.code === 10000) {
+                    localStorage.setItem("token", res.data.token);
+                    // localStorage.setItem("token", res.token);
+                    localStorage.setItem('accountName', res.data.accountName);
+                    this.$router.replace ("/home/dashboard");
+                } else {
+                    this.$message.error(res.data.message);
+                }
+            })
         },
         },
         handleSet: function() {
         handleSet: function() {
             if (!this.orgSelected) {
             if (!this.orgSelected) {
@@ -97,7 +109,7 @@ export default {
                     this.$message.error("登录失败:" + err);
                     this.$message.error("登录失败:" + err);
                 });
                 });
         },
         },
-        setOrganizationId(id) {
+        setOrganizationId(id, accountName) {
             if (!id) {
             if (!id) {
                 this.$message.error("发生了一点不愉快的错误!");
                 this.$message.error("发生了一点不愉快的错误!");
                 return;
                 return;
@@ -107,7 +119,8 @@ export default {
                 .then(res => {
                 .then(res => {
                     this.isShowDialog = false;
                     this.isShowDialog = false;
                     //导航到 正式页面
                     //导航到 正式页面
-                    this.$router.replace("/home/firmInfo");
+                    // this.$router.replace({path: "/home", query: {name: accountName}});
+                    this.$router.replace ("/home/dashboard");
                 })
                 })
                 .catch(err => {
                 .catch(err => {
                     if (err.errMsg) this.$message.error(err.errMsg);
                     if (err.errMsg) this.$message.error(err.errMsg);
@@ -164,4 +177,4 @@ export default {
         }
         }
     }
     }
 }
 }
-</style>
+</style>

+ 29 - 0
src/views/dashboard.vue

@@ -0,0 +1,29 @@
+<template>
+  <div class="box">
+    <h2
+            style="margin-bottom: 20px;padding-bottom:7px;border-bottom:2px solid #ddd"
+    >
+      首页
+    </h2>
+    <div>
+      <el-card>
+        <el-calendar v-model="date"></el-calendar>
+      </el-card>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "dashboard",
+    data() {
+      return {
+        date: new Date(),
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 382 - 0
src/views/systemAdmin/authAdmin.vue

@@ -0,0 +1,382 @@
+<template>
+  <div class="box">
+    <h2
+            style="margin-bottom: 20px;padding-bottom:7px;border-bottom:2px solid #ddd"
+    >
+      权限管理
+    </h2>
+    <div class="box-content">
+      <div style="margin-bottom: 10px">
+        <el-form :inline="true" label-width="80px">
+          <el-form-item>
+            <el-input v-model="keyword"  placeholder="请输入用户姓名或手机号"></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button @click="search" type="success">搜索</el-button>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="dialogVisible = true">新增权限组</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div>
+        <el-table
+                :data="tableData"
+                border
+                :height="590 + 'px'">
+          <el-table-column
+                  prop="id"
+                  label="权限组id">
+          </el-table-column>
+          <el-table-column
+                  prop="groupName"
+                  label="权限组名称">
+          </el-table-column>
+          <el-table-column
+                  prop="remark"
+                  label="备注">
+          </el-table-column>
+          <el-table-column label="操作">
+            <template slot-scope="scope">
+              <el-button
+                      size="mini"
+                      type="primary"
+                      @click="handleEdit(scope.row)">编辑</el-button>
+              <el-button
+                      size="mini"
+                      type="warning"
+                      @click="handleLimits(scope.row)">权限分配</el-button>
+              <el-button
+                      size="mini"
+                      type="danger"
+                      @click="handleUser(scope.row)">用户分配</el-button>
+              <el-button
+                      size="mini"
+                      type="danger"
+                      @click="del(scope.row)">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <table-footer
+                :totals="total"
+                :size="size"
+                @sizeChange="sizeChange"
+                @pageChange="pageChange"></table-footer>
+      </div>
+    </div>
+    <!--    // 新增-->
+    <el-dialog
+            :title="showType ? '编辑权限组' : '新增权限组'"
+            :visible.sync="dialogVisible"
+            width="30%">
+      <div>
+        <el-form ref="form" :model="form" label-width="100px">
+          <el-form-item label="权限组名称">
+            <el-input v-model="form.groupName"></el-input>
+          </el-form-item>
+          <el-form-item label="备注">
+            <el-input v-model="form.remark" disabled></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <span slot="footer" class="dialog-footer">
+                <el-button @click="dialogVisible = false">取 消</el-button>
+                <el-button v-if="showType" type="primary" @click="setUpdate">更 新</el-button>
+                <el-button v-else type="primary" @click="onSubmit">新 增</el-button>
+              </span>
+    </el-dialog>
+    <!-- 权限分配   -->
+    <el-dialog
+            title="权限分配"
+            :visible.sync="dialogLimits"
+            width="50%">
+      <div>
+        <el-tree
+                v-if="dialogLimits"
+                :data="limitList"
+                show-checkbox
+                node-key="id"
+                default-expand-all
+                :default-checked-keys="selectList"
+                :props="defaultProps"
+                @check="selectTable"
+                ref="tree">
+        </el-tree>
+      </div>
+      <span slot="footer" class="dialog-footer">
+                <el-button @click="dialogLimits = false">取 消</el-button>
+                <el-button type="primary" @click="limitSave">保存</el-button>
+              </span>
+    </el-dialog>
+    <el-dialog
+            title="用户分配"
+            :visible.sync="dialogUsers"
+            width="50%">
+      <div>
+        <el-table
+                :data="userList"
+                ref="multipleTable"
+                tooltip-effect="dark"
+                @selection-change="handleSelectionChange">
+          <el-table-column
+                  type="selection"
+                  width="55">
+          </el-table-column>
+          <el-table-column
+                  prop="id"
+                  label="用户ID">
+          </el-table-column>
+          <el-table-column
+                  prop="userName"
+                  label="用户姓名">
+          </el-table-column>
+        </el-table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+                <el-button @click="dialogUsers = false">取 消</el-button>
+                <el-button type="primary" @click="userSave">保存</el-button>
+              </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import TableFooter from "../../components/TableFooter";
+  import { mapState } from 'vuex';
+  export default {
+    name: "authAdmin",
+    components: {
+      TableFooter
+    },
+    data() {
+      return {
+        tableData: [
+        ],
+        showType: false,
+        dialogVisible: false,
+        form: {
+          id: '',
+          groupName: '',
+          remark: '养殖管理菜单',
+        },
+        dialogLimits: false,
+        // 权限分配list
+        limitList: [
+        ],
+        defaultProps: {
+          children: 'children',
+          label: 'menuName'
+        },
+        // 选择得参数
+        selectList: [],
+        keyword: '',
+        total: 0,
+        size: 20,
+        pageNum: 1,
+        selectId: '',
+        // 用户列表
+        userList: [],
+        dialogUsers: false,
+        userSelect: [],
+      }
+    },
+    computed: {
+      ...mapState(['typeCode'])
+    },
+    methods: {
+      // 搜索
+      search() {
+        this.init();
+      },
+      // 修改size
+      sizeChange(val) {
+        this.size = val;
+        this.init();
+      },
+      // 修改页数
+      pageChange(val) {
+        this.pageNum= val;
+        this.init();
+      },
+      handleEdit(data) {
+        this.showType = true;
+        this.dialogVisible = true;
+        this.form.remark = data.remark;
+        this.form.groupName = data.groupName;
+        this.form.id = data.id;
+      },
+      handleLimits(data) {
+        this.dialogLimits = true;
+        this.selectId = data.id;
+        this.selectList = [];
+        this.$axios.post(`http://121.37.169.186:8081/auth/getMenuByGroup?groupId=${data.id}`)
+        .then(res => {
+          if(res.data.code === 10005) {
+            this.selectList = [];
+          } else {
+            this.selectList = res.data.data.split(',');
+            this.$forceUpdate();
+          }
+        })
+      },
+      // 用户分配
+      handleUser(data) {
+        this.dialogUsers = true;
+        this.selectId = data.id;
+        this.$axios.post(`http://121.37.169.186:8081/auth/getAcountByGroup?groupId=${data.id}`)
+        .then(res => {
+          if(res.data.code === 10006) {
+            this.userSelect = [];
+          } else {
+            let arr = res.data.data.split(',');
+            this.$nextTick(() => {
+              for (let key in this.userList) {
+                for(let i in arr) {
+                  if(this.userList[key]['id'] == arr[i]) {
+                    this.$refs.multipleTable.toggleRowSelection(this.userList[key], true);
+                  }
+                }
+              }
+            })
+          }
+        });
+      },
+      // 用户分配选择
+      handleSelectionChange(val) {
+        this.userSelect = val;
+      },
+      // 用户分配保存
+      userSave() {
+        let users = [];
+        this.userSelect.forEach(item => {
+          users.push(item.id);
+        });
+        let str = users.join(',');
+        this.$axios.post(`http://121.37.169.186:8081/auth/saveAccountGroup?accountId=${str}&groupIds=${this.selectId}`)
+        .then(res => {
+          if(res.data.code === 10001) {
+          }
+          this.userSelect = [];
+          this.selectId = '';
+          this.$message(res.data.message);
+        });
+        this.dialogUsers = false;
+      },
+      selectTable(data, checked, ) {
+        this.selectList = checked.checkedKeys.concat(checked.halfCheckedKeys);
+      },
+      // 新增角色
+      onSubmit() {
+        this.$axios.post(`http://121.37.169.186:8081/group/add?groupName=${this.form.groupName}&remark=${this.form.remark}`)
+        .then(res => {
+          if(res.data.code === 10000) {
+            this.init();
+          }
+          this.$message(res.data.message);
+          this.dialogVisible = false;
+          this.reset();
+        })
+      },
+      // 权限分配
+      limitSave() {
+        let menuIds = this.selectList.join(',');
+        menuIds += ',82';
+        this.$axios.post(`http://121.37.169.186:8081/auth/saveGroupMenu?groupId=${this.selectId}&menuIds=${menuIds}`)
+        .then(res => {
+          if(res.data.code === 10001) {
+          }
+          this.$message(res.data.message);
+          this.selectId = '';
+        });
+        this.dialogLimits = false;
+        this.selectList = [];
+      },
+      init() {
+        this.$axios.post(`http://121.37.169.186:8081/group/list?pageNum=${this.pageNum}&pageSize=${this.size}&searchStr=${this.keyword}`)
+        .then(res => {
+          this.tableData = res.data.content;
+          this.total = res.data.totalElements;
+        })
+      },
+      // 重置
+      reset(){
+        this.form.id = '';
+        this.form.groupName = '';
+        this.form.remark = '养殖管理菜单';
+        this.pageNum = 1;
+        this.keyword = '';
+        this.showType = false;
+      },
+      // 更新
+      setUpdate() {
+        this.$axios.post(`http://121.37.169.186:8081/group/edit?groupName=${this.form.groupName}&remark=${this.form.remark}&groupId=${this.form.id}`)
+          .then(res => {
+            if(res.data.code === 10000) {
+              this.init();
+            }
+            this.$message(res.data.message);
+            this.dialogVisible = false;
+            this.reset();
+          })
+      },
+      // 删除
+      del(data) {
+        this.$confirm('此操作将永久删除批量删除, 是否继续?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.$axios.post(`http://121.37.169.186:8081/group/remove?groupId=${data.id}`)
+            .then(res => {
+              if(res.data.code === 10000) {
+                this.init();
+              }
+              this.$message(res.data.message);
+            })
+        }).catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          });
+        });
+      },
+      // 菜单列表
+      authInit() {
+        this.$axios.post('http://121.37.169.186:8081/menu/list')
+          .then(res => {
+            res.data.forEach(item => {
+              if(item.menuName === this.typeCode) {
+                this.limitList = item.children;
+              }
+            });
+            // this.limitList = res.data;
+          })
+      },
+      // 用户列表
+      userInit() {
+        this.$axios.post(`http://121.37.169.186:8081/user/list?pageNum=1&pageSize=100&searchStr=`)
+          .then(res => {
+            if(res.data.code === 10001) {
+              this.userList = res.data.data;
+            }
+          })
+      }
+    },
+    mounted() {
+      this.init();
+      this.authInit();
+      this.userInit();
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .box {
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    padding: 20px;
+    border: 1px solid #Ddd;
+  }
+</style>

+ 194 - 0
src/views/systemAdmin/menuAdmin.vue

@@ -0,0 +1,194 @@
+<template>
+  <div class="box">
+    <h2
+            style="margin-bottom: 20px;padding-bottom:7px;border-bottom:2px solid #ddd"
+    >
+      菜单管理
+    </h2>
+    <div>
+      <div style="margin-bottom: 10px">
+        <el-button type="primary" @click="addMenu">添加菜单</el-button>
+      </div>
+      <div>
+        <el-table
+                :data="tableData"
+                border
+                row-key="id"
+                :height="670 + 'px'"
+                :tree-props="{children: 'children'}"
+                default-expand-all>
+          <el-table-column prop="menuName" label="菜单名称"></el-table-column>
+          <el-table-column prop="url" label="菜单路由"></el-table-column>
+          <el-table-column prop="remark" label="备注"></el-table-column>
+          <el-table-column
+                  label="操作"
+                  fixed="right">
+            <template slot-scope="scope">
+              <el-button size="mini" type="info" @click="setEdit(scope.row)">编辑</el-button>
+              <el-button size="mini" type="primary" style="margin-right: 10px" @click="addChildren(scope.row, scope.$index)">添加子菜单</el-button>
+              <el-popconfirm
+                      :title="scope.row.parentId === 0 ? '这是父菜单,删除后,子菜单将不复存在!确定要删除这个菜单吗' : '确定要删除这个菜单吗?'"
+                      @confirm="del(scope.row)"
+              >
+                <el-button size="mini" slot="reference" type="danger">删除</el-button>
+              </el-popconfirm>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
+    <el-dialog :title="showType ? '编辑菜单' : '新增菜单'" :visible.sync="dialogFormVisible">
+      <el-form :model="form"  ref="ruleForm">
+        <el-form-item label="父级菜单" :label-width="formLabelWidth">
+          <el-input v-model="form.parentId" disabled autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="菜单排序" :label-width="formLabelWidth">
+          <el-input v-model="form.sort"  autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="菜单名字" :label-width="formLabelWidth" prop="name">
+          <el-input v-model="form.name" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="备注" :label-width="formLabelWidth" prop="name">
+          <el-input v-model="form.remark" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="菜单路由" :label-width="formLabelWidth">
+          <el-input v-model="form.url" autocomplete="off"></el-input>
+        </el-form-item>
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">取 消</el-button>
+        <el-button v-if="!showType" type="primary" @click="add('ruleForm')">新 增</el-button>
+        <el-button v-else type="primary" @click="setUpdate('ruleForm')">更 新</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import { mapState } from 'vuex';
+  export default {
+    name: "menuAdmin",
+    data() {
+      return {
+        tableData: [],
+        showType: false,
+        dialogFormVisible: false,
+        form: {
+          name: '',
+          parentId: 82,
+          url: '',
+          id: '',
+          remark: '',
+          sort: ''
+        },
+        formLabelWidth: '120px',
+        rules: []
+      }
+    },
+    computed: {
+      ...mapState(['typeCode'])
+    },
+    methods: {
+      add() {
+        this.dialogFormVisible = false;
+        let params = {
+          parentId: this.form.parentId,
+          menuName: this.form.name,
+          url: this.form.url,
+          remark: this.form.remark,
+          sort: this.form.sort
+        };
+        // this.$axios.post('http://121.37.169.186:8081/menu/add', params)
+        //   .then(res => {
+        //       if(res.data.code === 10000) {
+        //         this.init();
+        //         this.reset();
+        //       }
+        //     this.$message(res.data.message);
+        //     this.dialogFormVisible = false;
+        this.$axios.post(`http://121.37.169.186:8081/menu/add?parentId=${this.form.parentId}&menuName=${this.form.name}&url=${this.form.url}&remark=${this.form.remark}`)
+              .then(res => {
+                if(res.data.code === 10000) {
+                  this.init();
+                  this.reset();
+                }
+          this.$message(res.data.message);
+          this.dialogFormVisible = false;
+        })
+      },
+      setEdit(data) {
+        this.showType = true;
+        this.dialogFormVisible = true;
+        this.form.id = data.id;
+        this.form.name = data.menuName;
+        this.form.url = data.url;
+        this.form.parentId = data.parentId;
+        this.form.remark = data.remark;
+        this.form.sort = data.sort;
+      },
+      addMenu() {
+        this.dialogFormVisible = true;
+      },
+      addChildren(data) {
+        this.dialogFormVisible = true;
+        this.form.parentId = data.id;
+      },
+      del(data) {
+        let arr = [];
+        arr.push(data.id);
+        this.$axios.post(`http://121.37.169.186:8081/menu/remove?menuId=${arr}`)
+        .then(res => {
+          if(res.data.code == 10000) {
+            this.init();
+          }
+          this.$message(res.data.message);
+        })
+      },
+      setUpdate() {
+        this.$axios.post(`http://121.37.169.186:8081/menu/edit?id=${this.form.id}&remark=${this.form.remark}&url=${this.form.url}&menuName=${this.form.name}&parentId=${this.form.parentId}&sort=${this.form.sort}`)
+        .then(res => {
+          if(res.data.code === 10000) {
+            this.init();
+            this.reset();
+          }
+          this.$message(res.data.message);
+          this.dialogFormVisible = false;
+        })
+      },
+      // 重置
+      reset() {
+        this.form.name = '';
+        this.form.parentId = 82;
+        this.form.url = '';
+        this.form.id = '';
+        this.form.remark = '';
+        this.form.sort = '';
+        this.showType = false;
+      },
+      init() {
+        this.$axios.post('http://121.37.169.186:8081/menu/list')
+        .then(res => {
+          res.data.forEach(item => {
+            if(item.menuName === this.typeCode) {
+              this.tableData = item.children;
+            }
+          })
+        })
+      }
+    },
+    mounted() {
+      this.init();
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .box {
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    padding: 20px;
+    border: 1px solid #Ddd;
+  }
+</style>

+ 314 - 0
src/views/systemAdmin/userAdmin.vue

@@ -0,0 +1,314 @@
+<template>
+  <div class="box">
+    <h2
+            style="margin-bottom: 20px;padding-bottom:7px;border-bottom:2px solid #ddd"
+    >
+      用户管理
+    </h2>
+    <div>
+      <div style="margin-bottom: 10px">
+        <el-form :inline="true" label-width="80px">
+          <el-form-item>
+            <el-input v-model="keyword"  placeholder="请输入用户姓名或手机号"></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button @click="search" type="success">搜索</el-button>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="addUser">添加用户</el-button>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="danger" @click="delAll">删除用户</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div>
+        <el-table
+                border
+                :data="tableData"
+                style="width: 100%"
+                :height="590+'px'"
+                ref="multipleTable"
+                tooltip-effect="dark"
+                @selection-change="handleSelectionChange">
+          <el-table-column
+                  type="selection"
+                  width="55">
+          </el-table-column>
+          <el-table-column
+                  prop="id"
+                  label="用户ID"
+                  width="80"></el-table-column>
+          <el-table-column
+                  prop="userName"
+                  label="用户姓名"></el-table-column>
+          <el-table-column prop="accountName" label="登录名"></el-table-column>
+          <el-table-column label="性别">
+            <template slot-scope="scope">
+              <span v-if="scope.row.male === 0">男</span>
+              <span v-else>女</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+                  prop="birthday"
+                  label="出生日期"></el-table-column>
+          <el-table-column
+                  prop="mobile"
+                  label="手机号"></el-table-column>
+          <el-table-column
+                  prop="job"
+                  label="职务"></el-table-column>
+          <el-table-column
+                  prop="address"
+                  label="住址"></el-table-column>
+          <el-table-column
+                  prop="remark"
+                  label="备注"></el-table-column>
+          <el-table-column
+                  label="是否启用">
+            <template slot-scope="scope">
+              <el-switch v-model="scope.row.accountStatus"  :active-value="1"  :inactive-value="0" @change="handleSwitch($event, scope.row)">
+              </el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作">
+            <template slot-scope="scope">
+              <el-button type="primary" style="margin-right: 10px;" @click="edit(scope.row)">编辑</el-button>
+              <el-popconfirm
+                      title=" 确定要删除这个用户吗?"
+                      @confirm="del(scope.row)"
+              >
+                <el-button type="danger" slot="reference">删除</el-button>
+              </el-popconfirm>
+            </template>
+          </el-table-column>
+        </el-table>
+        <table-footer
+                :totals="total"
+                :size="size"
+                @sizeChange="sizeChange"
+                @pageChange="pageChange"></table-footer>
+
+      </div>
+    </div>
+    <el-dialog
+            :title="showType ? '编辑用户' : '新增用户'"
+            :visible.sync="dialogVisible"
+            width="50%">
+      <div>
+        <el-form ref="form" :model="form" label-width="80px">
+          <el-form-item label="用户姓名">
+            <el-input v-model="form.userName"></el-input>
+          </el-form-item>
+          <el-form-item label="性别">
+            <el-radio-group v-model="form.males">
+              <el-radio :label="0">女</el-radio>
+              <el-radio :label="1">男</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="出生日期">
+            <el-date-picker type="date" placeholder="选择日期" v-model="form.birthday" value-format="yyyy-MM-dd" style="width: 100%;"></el-date-picker>
+          </el-form-item>
+          <el-form-item label="手机号">
+            <el-input v-model="form.mobile"></el-input>
+          </el-form-item>
+          <el-form-item label="住址">
+            <el-input v-model="form.address"></el-input>
+          </el-form-item>
+          <el-form-item label="职务">
+            <el-input v-model="form.job"></el-input>
+          </el-form-item>
+          <el-form-item label="描述">
+            <el-input v-model="form.remark"></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <span slot="footer" class="dialog-footer">
+                <el-button @click="dialogVisible = false">取 消</el-button>
+                <el-button type="primary" @click="onSubmit">{{showType ? '更 新' : '新 增'}}</el-button>
+              </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import TableFooter from '../../components/TableFooter';
+  export default {
+    name: "userAdmin",
+    components: {
+      TableFooter
+    },
+    data() {
+      return {
+        dialogVisible: false,
+        showType: false,
+        keyword: '',
+        tableData: [],
+        total: 0,
+        size: 20,
+        pageNum: 1,
+        form: {
+          userName: '',
+          remark: '',
+          mobile: '',
+          males: '',
+          male: '',
+          job: '',
+          birthday: '',
+          address: '',
+          id: ''
+        },
+        selectList: '',
+      };
+    },
+    created() {
+    },
+    methods: {
+      // 搜索
+      search() {
+        this.init();
+      },
+      // 修改size
+      sizeChange(val) {
+        this.size = val;
+        this.init();
+      },
+      // 修改页数
+      pageChange(val) {
+        this.pageNum= val;
+        this.init();
+      },
+      // 初始化
+      init() {
+        this.$axios.post(`http://121.37.169.186:8081/user/list?pageNum=${this.pageNum}&pageSize=${this.size}&searchStr=${this.keyword}`)
+          .then(res => {
+            if(res.data.code === 10001) {
+              this.tableData = res.data.data;
+              this.total = res.data.totalElements;
+            } else {
+              this.$message(res.data.message);
+            }
+          })
+      },
+      // 添加用户
+      addUser() {
+        this.dialogVisible = true;
+        this.showType = false;
+      },
+      // 用户编辑
+      edit(data) {
+        this.form = data;
+        this.showType = true;
+        this.dialogVisible = true;
+        console.log(this.form);
+      },
+      // 用户删除
+      del(data) {
+        this.$axios.post(`http://121.37.169.186:8081/user/remove?userIds=${data.id}`)
+          .then(res => {
+            if(res.data.code === 10000) {
+              this.init();
+            }
+            this.$message(res.data.message);
+          })
+      },
+      // 保存
+      onSubmit() {
+        if(this.showType) {
+          this.$axios.post(`http://121.37.169.186:8081/user/edit?id=${this.form.id}&userName=${this.form.userName}&male=${this.form.males}&birthday=${this.form.birthday}&mobile=${this.form.mobile}&address=${this.form.address}&job=${this.form.job}&remark=${this.form.remark}`)
+            .then(res => {
+              if(res.data.code === 10000) {
+                this.init();
+              }
+              this.$message(res.data.message);
+              this.reset();
+            })
+        } else {
+          this.$axios.post(`http://121.37.169.186:8081/user/add?userName=${this.form.userName}&male=${this.form.males}&birthday=${this.form.birthday}&mobile=${this.form.mobile}&address=${this.form.address}&job=${this.form.job}&remark=${this.form.remark}`)
+            .then(res => {
+              if(res.data.code === 10000) {
+                this.init();
+              }
+              this.$message(res.data.message);
+              this.reset();
+            })
+        }
+        this.dialogVisible = false;
+      },
+      // 重置
+      reset() {
+        this.form = {};
+        this.pageNum = 1;
+        this.keyword = '';
+      },
+      // 选择
+      handleSelectionChange(val) {
+        let arr = [];
+        val.forEach(item => {
+          arr.push(item.id);
+        });
+        this.selectList = arr.join(',');
+      },
+      // 批量删除
+      delAll() {
+        if(this.selectList) {
+          this.$confirm('此操作将永久删除批量删除, 是否继续?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            this.$axios.post(`http://121.37.169.186:8081/user/remove?userIds=${this.selectList}`)
+              .then(res => {
+                if(res.data.code === 10000) {
+                  this.init();
+                  this.selectList = '';
+                }
+                this.$message(res.data.message);
+              })
+          }).catch(() => {
+            this.$message({
+              type: 'info',
+              message: '已取消删除'
+            });
+          });
+        } else {
+          this.$alert('请先选择批量删除的用户!');
+        }
+      },
+      // 是否启用
+      handleSwitch(val, data) {
+        let accountStatus = '';
+        if(val) {
+          accountStatus = 1;
+        } else {
+          accountStatus = 0;
+        }
+        this.$axios.post(`http://121.37.169.186:8081/account/setAccountStatus?ids=${data.id}&status=${accountStatus}`)
+          .then(res => {
+            if(res.data.code === 10001) {
+              this.$message({
+                type: 'success',
+                message: res.data.message
+              })
+            } else {
+              this.$message.error(res.data.message);
+            }
+          })
+      }
+    },
+    mounted() {
+      this.init();
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .box {
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    padding: 20px;
+    border: 1px solid #Ddd;
+  }
+</style>