menu-list.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <template>
  2. <div>
  3. <el-breadcrumb separator=">">
  4. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  5. <el-breadcrumb-item>
  6. <a href="#">系统管理</a>
  7. </el-breadcrumb-item>
  8. <el-breadcrumb-item>
  9. <a href="/sys/menu">菜单管理</a>
  10. </el-breadcrumb-item>
  11. </el-breadcrumb>
  12. <el-divider></el-divider>
  13. <!--
  14. 要resetFields起作用,必须配置:model和prop
  15. -->
  16. <el-form ref="queryForm" :model="queryModel" inline class="demo-form-inline">
  17. <el-form-item label="菜单名称" prop="menuName">
  18. <el-input type="text" size="mini" v-model="queryModel.menuName"></el-input>
  19. </el-form-item>
  20. <el-form-item label="菜单类型" prop="menuType">
  21. <el-select v-model="queryModel.menuType">
  22. <el-option label="后端接口" value="1"></el-option>
  23. <el-option label="前端页面" value="2"></el-option>
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item label="上级菜单" prop="parentId">
  27. <el-select
  28. v-model="queryModel.parentId"
  29. filterable
  30. remote
  31. placeholder="请输入关键词"
  32. :remote-method="queryMenu"
  33. >
  34. <el-option
  35. v-for="menu in queryMenuResult"
  36. :key="menu.id"
  37. :label="menu.menuName"
  38. :value="menu.id"
  39. ></el-option>
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item>
  43. <el-button
  44. type="primary"
  45. size="mini"
  46. icon="ios-search"
  47. @click="changePage(1)"
  48. :loading="loading"
  49. >查询</el-button>&nbsp;
  50. <el-button
  51. type="info"
  52. size="mini"
  53. style="margin-left: 8px"
  54. @click="handleReset('queryForm')"
  55. >重置</el-button>&nbsp;
  56. </el-form-item>
  57. </el-form>
  58. <el-divider></el-divider>
  59. <el-row class="button-group">
  60. <el-button type="primary" size="small" plain icon="el-icon-circle-plus" @click="handleAdd">新增</el-button>
  61. <el-button
  62. type="primary"
  63. size="small"
  64. plain
  65. icon="el-icon-circle-plus"
  66. :disabled="multipleSelection.length==0"
  67. @click="handleBatchDelete"
  68. >删除选中项</el-button>
  69. </el-row>
  70. <div style="min-height:400px;">
  71. <el-table
  72. :data="tableData"
  73. v-loading="loading"
  74. stripe
  75. border
  76. @selection-change="handleSelectionChange"
  77. >
  78. <el-table-column type="selection" width="55"></el-table-column>
  79. <el-table-column
  80. prop="menuName"
  81. sort-by="menu_name"
  82. label="菜单名称"
  83. width="180"
  84. >
  85. <template slot-scope="{row}">
  86. <i :class="row.icon"></i><span v-html="row.menuName"></span>
  87. </template>
  88. </el-table-column>
  89. <el-table-column
  90. prop="parentName"
  91. sort-by="parent_id"
  92. label="上级菜单"
  93. width="180"
  94. ></el-table-column>
  95. <el-table-column prop="sortNo" label="排序号" :sortable="true" width="180"></el-table-column>
  96. <el-table-column prop="menuType" label="菜单类型" :sortable="true" width="180">
  97. <template slot-scope="{row}">{{row.menuType == 1 ? "后端接口" : "前端页面"}}</template>
  98. </el-table-column>
  99. <el-table-column prop="menuUrl" label="菜单地址" :sortable="true" width="180"></el-table-column>
  100. <el-table-column prop="createTime" label="创建时间" :sortable="true" width="180"></el-table-column>
  101. <el-table-column prop="updateTime" label="更新时间" :sortable="true" width="180"></el-table-column>
  102. <el-table-column label="操作" width="200" fixed="right">
  103. <template slot-scope="{row}">
  104. <el-button size="mini" type="warning" @click="handleEdit(row)">编辑</el-button>
  105. <el-button size="mini" type="danger" @click="handleDelete(row)">删除</el-button>
  106. </template>
  107. </el-table-column>
  108. </el-table>
  109. </div>
  110. <el-pagination
  111. :current-page.sync="pageIndex"
  112. :total="totalElements"
  113. :page-sizes="pageSizeList"
  114. @current-change="changePage"
  115. @size-change="pageSizeChange"
  116. layout="total, sizes, prev, pager, next, jumper"
  117. ></el-pagination>
  118. <menu-detail
  119. v-if="showDetailModal"
  120. @close="onDetailModalClose"
  121. :menuId="menuId"
  122. :modalTitle="modalTitle"
  123. ></menu-detail>
  124. </div>
  125. </template>
  126. <script>
  127. import Constant from "@/constant";
  128. import MenuDetail from "./menu-detail";
  129. import menuApi from "@/api/sys/menu";
  130. import NProgress from "nprogress"; // progress bar
  131. import "nprogress/nprogress.css"; // progress bar style
  132. export default {
  133. data() {
  134. var self = this;
  135. return {
  136. queryModel: {
  137. menuName: "",
  138. menuType: "",
  139. parentId: ""
  140. },
  141. mLoading: false,
  142. modalTitle: "",
  143. loading: false,
  144. tableData: [],
  145. pageIndex: 1,
  146. pageSize: 10,
  147. totalPages: 0,
  148. totalElements: 0,
  149. field: "",
  150. direction: "",
  151. pageSizeList: [10, 20, 30],
  152. multipleSelection: [],
  153. showDetailModal: false,
  154. menuId: "",
  155. queryMenuResult: []
  156. };
  157. },
  158. methods: {
  159. changePage(pageIndex) {
  160. var self = this;
  161. self.loading = true;
  162. self.pageIndex = pageIndex;
  163. var formData = new FormData();
  164. formData.append("pageIndex", self.pageIndex);
  165. formData.append("pageSize", self.pageSize);
  166. formData.append("parentId", self.queryModel.parentId);
  167. formData.append("menuName", self.queryModel.menuName);
  168. formData.append("menuType", self.queryModel.menuType);
  169. if (this.field != null) {
  170. formData.append("field", this.field);
  171. }
  172. if (this.direction != null) {
  173. formData.append("direction", this.direction);
  174. }
  175. menuApi
  176. .pageList(formData)
  177. .then(function(response) {
  178. self.loading = false;
  179. var jsonData = response.data;
  180. if(jsonData.result){
  181. var pageInfo = jsonData.data;
  182. self.tableData = pageInfo.data;
  183. self.totalPages = pageInfo.totalPages;
  184. self.totalElements = pageInfo.recordsTotal;
  185. }
  186. else {
  187. self.$message({
  188. message: jsonData.message + "",
  189. type: "warning"
  190. });
  191. }
  192. })
  193. .catch(error => {
  194. self.loading = false;
  195. // self.$message.error(error + "");
  196. });
  197. },
  198. pageSizeChange(pageSize) {
  199. this.pageSize = pageSize;
  200. },
  201. sortChange(data) {
  202. this.field = data.column.field;
  203. this.direction = data.order;
  204. this.changePage(this.pageIndex);
  205. },
  206. handleSelectionChange(val) {
  207. this.multipleSelection = val;
  208. },
  209. handleReset(name) {
  210. this.$refs[name].resetFields();
  211. },
  212. handleAdd() {
  213. var self = this;
  214. self.modalTitle = "新增";
  215. self.menuId = "";
  216. self.showDetailModal = true;
  217. },
  218. handleEdit(record) {
  219. var self = this;
  220. self.modalTitle = "编辑";
  221. self.menuId = record.id;
  222. self.showDetailModal = true;
  223. },
  224. handleDelete(record) {
  225. var self = this;
  226. self
  227. .$confirm("是否确认删除?", "提示", {
  228. confirmButtonText: "确定",
  229. cancelButtonText: "取消",
  230. type: "warning"
  231. })
  232. .then(() => {
  233. menuApi.remove(record.id).then(function(response) {
  234. var jsonData = response.data;
  235. if (jsonData.result) {
  236. // var index = self.tableData.indexOf(record);
  237. // self.tableData.splice(index, 1);
  238. self.changePage(self.pageIndex);
  239. self.$message({
  240. type: "success",
  241. message: "删除成功!"
  242. });
  243. }
  244. });
  245. });
  246. },
  247. handleBatchDelete() {
  248. var self = this;
  249. var idList = this.multipleSelection.map(record => {
  250. return record.id;
  251. });
  252. this.$confirm("是否确认删除选中项?", "提示", {
  253. confirmButtonText: "确定",
  254. cancelButtonText: "取消",
  255. type: "warning"
  256. }).then(() => {
  257. menuApi.batchRemove(idList).then(function(response) {
  258. var jsonData = response.data;
  259. if (jsonData.result) {
  260. self.changePage(self.pageIndex);
  261. self.$message({
  262. type: "success",
  263. message: "删除成功!"
  264. });
  265. }
  266. });
  267. });
  268. },
  269. onDetailModalClose(refreshed){
  270. this.showDetailModal = false;
  271. if(refreshed){
  272. this.changePage(this.pageIndex);
  273. }
  274. },
  275. queryMenu(keywords) {
  276. var formData = new FormData();
  277. formData.append("keywords",keywords);
  278. formData.append("limit",10);
  279. return menuApi.query(formData).then(response=>{
  280. var jsonData = response.data;
  281. if(jsonData.result){
  282. this.queryMenuResult = jsonData.data;
  283. }
  284. else{
  285. this.$message.error(jsonData.message + "");
  286. }
  287. });
  288. }
  289. },
  290. mounted: function() {
  291. this.changePage(1);
  292. },
  293. components: {
  294. "menu-detail": MenuDetail
  295. }
  296. };
  297. </script>
  298. <style lang="scss" scoped>
  299. .el-breadcrumb {
  300. margin: 10px;
  301. line-height: 20px;
  302. }
  303. .el-divider {
  304. margin: 5px 0;
  305. }
  306. .demo-form-inline {
  307. margin-left: 10px;
  308. text-align: left;
  309. }
  310. .button-group {
  311. padding: 10px;
  312. text-align: left;
  313. }
  314. </style>