基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【七】【菜单维护模块】

    大家在阅读本章的时候大家一定要把上一章的代码从GitHub上拿下来先,因此本章的以及后续章节的所有的Java代码都是基于上一章节的代码因此大家一定要记得把上一章的代码全部给clone下来,否则本章的代码大家将无法运行起来。

       通过上一章节我们已经完成了我们的基本架构的开发工作,那么这一章我们将开发我们的菜单维护模块,实现对菜单的增删改查的功能,该模块的菜单树使用的是ztree的前端js的代码,首先在我们开发该模块的时候我们需要到WebMvcConfig中增加如下配置:

接着我们开始编写我们的菜单模块的代码首先建如下的文件路径,同时我们实现我们的菜单维护的业务逻辑:

首先是treeList.html的页面的代码(该页面使用了bootstrap和ztree)

 

 
  1. <html xmlns:th="http://www.thymeleaf.org"

  2. >

  3. <head th:include="include/includebase"></head>

  4. <body>

  5. <div id="content" class="row-fluid">

  6. <div class="col-md-3 " style="margin-top: 10px;">

  7. <ul id="menu_tree" class="ztree" style="width:560px; overflow:auto;"></ul>

  8. </div>

  9. </div>

  10. <script th:inline="javascript">

  11. var zTree;

  12. var demoIframe;

  13. var selectNode;

  14.  
  15. function addHoverDom(treeId, treeNode) {

  16. var sObj = $("#" + treeNode.tId + "_span");

  17. if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;

  18. var addStr = "<span class='button remove' id='removeBtn_" + treeNode.tId + "' title='add node' onfocus='this.blur();'></span>";

  19. addStr += "<span class='button add' id='addBtn_" + treeNode.tId + "'></span>";

  20. addStr += "<span class='button edit' id='editBtn_" + treeNode.tId + "'></span>";

  21. if(treeNode.isParent){

  22. addStr += "<span class='button add' id='addParentBtn_" + treeNode.tId + "'></span>";

  23. }

  24. sObj.after(addStr);

  25. var btn = $("#addBtn_"+treeNode.tId);

  26. if (btn) btn.bind("click", function(){

  27. zTree = $.fn.zTree.getZTreeObj("menu_tree");

  28. selectNode = treeNode;

  29. window.Ewin.dialog({title:"添加",url:"tree/addTreePage?id="+treeNode.id,width:400,height:650})

  30. return false;

  31. });

  32. var remove_btn = $("#removeBtn_"+treeNode.tId);

  33. if (remove_btn) remove_btn.bind("click", function() {

  34. zTree = $.fn.zTree.getZTreeObj("menu_tree");

  35. if (treeNode.isParent) {

  36. window.Ewin.alert({message:"请先删除当前菜单节点底下的子菜单!"});

  37. }else{

  38. window.Ewin.confirm({title: '提示', message: '是否要删除您当前选中的菜单节点?', width: 500}).on(function (e) {

  39. if (e) {

  40. $.post("tree/remove",{id:treeNode.id},function(e){

  41. if(e.result){

  42. zTree.removeNode(treeNode);

  43. window.Ewin.alert({message:e.msg});

  44. }else{

  45. window.Ewin.alert({message:e.msg});

  46. }

  47. })

  48. }

  49. });

  50. }

  51. return false;

  52. });

  53. var edit_btn = $("#editBtn_"+treeNode.tId);

  54. if (edit_btn) edit_btn.bind("click", function(){

  55. zTree = $.fn.zTree.getZTreeObj("menu_tree");

  56. selectNode = treeNode;

  57. window.Ewin.dialog({title:"修改",url:"tree/updateTreePage?id="+treeNode.id,width:400,height:650})

  58. return false;

  59. });

  60. var add_parent_btn = $("#addParentBtn_"+treeNode.tId);

  61. if (add_parent_btn) add_parent_btn.bind("click", function(){

  62. zTree = $.fn.zTree.getZTreeObj("menu_tree");

  63. selectNode = null;

  64. window.Ewin.dialog({title:"添加",url:"tree/addTreePage",width:400,height:650})

  65. return false;

  66. })

  67. };

  68.  
  69. function removeHoverDom(treeId, treeNode) {

  70. $("#addBtn_"+treeNode.tId).unbind().remove();

  71. $("#removeBtn_"+treeNode.tId).unbind().remove();

  72. $("#editBtn_"+treeNode.tId).unbind().remove();

  73. $("#addParentBtn_"+treeNode.tId).unbind().remove();

  74. };

  75.  
  76. var setting = {

  77. check: {

  78. enable: false

  79. },

  80. view: {

  81. addHoverDom: addHoverDom,

  82. removeHoverDom: removeHoverDom,

  83. dblClickExpand: false,

  84. showLine: true,

  85. selectedMulti: false

  86. },

  87. data: {

  88. simpleData: {

  89. enable:true,

  90. idKey: "id",

  91. pIdKey: "pId",

  92. rootPId: "0"

  93. }

  94. },

  95. callback: {

  96. beforeClick: function(treeId, treeNode) {

  97. var zTree = $.fn.zTree.getZTreeObj('menu_tree');

  98. if (treeNode.isParent) {

  99. zTree.expandNode(treeNode);

  100. return false;

  101. } else {

  102. return true;

  103. }

  104. }

  105. }

  106. };

  107.  
  108. function loadReady() {

  109. var bodyH = demoIframe.contents().find("body").get(0).scrollHeight,

  110. htmlH = demoIframe.contents().find("html").get(0).scrollHeight,

  111. maxH = Math.max(bodyH, htmlH), minH = Math.min(bodyH, htmlH),

  112. h = demoIframe.height() >= maxH ? minH:maxH;

  113. if (h < 530){

  114. h = 530;

  115. }

  116. demoIframe.height(h);

  117. }

  118.  
  119. $(function() {

  120. $.post("/tree/loadUserTree",function(info){

  121. var t = $("#menu_tree");

  122. t = $.fn.zTree.init(t, setting,info.data);

  123. })

  124. });

  125.  
  126. </script>

  127. </body>

  128. </html>

接着是add.html增加菜单的页面的代码:

 

 

 
  1. <html xmlns:th="http://www.thymeleaf.org"

  2. xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">

  3. <body>

  4. <form id="treeForm" role="form" method="post" action="tree/save">

  5. <input type="hidden" name="pId" th:value="${entity.id}" />

  6. <div class="form-group" >

  7. <label >父菜单名称:</label>

  8. <input type="text" class="form-control" th:value="${entity.name}" readonly="readonly" />

  9. </div>

  10. <div class="form-group">

  11. <label for="name">菜单名称:</label>

  12. <input type="text" class="form-control" name="name" id="name" placeholder="请输入菜单名称" />

  13. </div>

  14. <div class="form-group">

  15. <label for="url">菜单地址:</label>

  16. <input type="text" class="form-control" name="url" id="url" placeholder="请输入菜单地址" />

  17. </div>

  18. <div class="form-group">

  19. <label for="icon">菜单样式:</label>

  20. <input type="text" class="form-control" name="icon" id="icon" placeholder="请输入菜单样式" />

  21. </div>

  22. <div class="form-group">

  23. <label for="url">菜单编码:</label>

  24. <input type="text" class="form-control" name="code" id="code" placeholder="请输入菜单编码" />

  25. </div>

  26. <div class="form-group">

  27. <label for="treeOrder">菜单顺序:</label>

  28. <input type="text" class="form-control" name="treeOrder" id="treeOrder" placeholder="请输入菜单顺序" />

  29. </div>

  30. <div class="form-group">

  31. <label >菜单状态:</label>

  32. <label class='radio-inline'><input type='radio' name='state' value='1' checked="checked" />可用</label>

  33. <label class='radio-inline'><input type='radio' name='state' value='0' />禁用</label>

  34. </div>

  35. </form>

  36. <script th:inline="javascript">

  37. <![CDATA[

  38. $(function () {

  39. $('#treeForm').bootstrapValidator({

  40. message: 'This value is not valid',

  41. feedbackIcons: {

  42. valid: 'glyphicon glyphicon-ok',

  43. invalid: 'glyphicon glyphicon-remove',

  44. validating: 'glyphicon glyphicon-refresh'

  45. },

  46. fields: {

  47. name: {

  48. message: '菜单名称验证失败',

  49. validators: {

  50. notEmpty: {

  51. message: '菜单名称不能为空'

  52. }

  53. }

  54. },

  55. url: {

  56. message: '菜单地址验证失败',

  57. validators: {

  58. notEmpty: {

  59. message: '菜单地址不能为空'

  60. }

  61. }

  62. },

  63. code: {

  64. message: '菜单编码验证失败',

  65. validators: {

  66. notEmpty: {

  67. message: '菜单编码不能为空'

  68. }

  69. }

  70. },

  71. treeOrder: {

  72. message: '菜单顺序验证失败',

  73. validators: {

  74. notEmpty: {

  75. message: '菜单顺序不能为空'

  76. },

  77. regexp: {

  78. regexp: /^[0-9_]+$/,

  79. message: '菜单顺序必须为数字'

  80. },

  81. stringLength: {

  82. min: 1,

  83. max: 18,

  84. message: '菜单顺序必须在1到18位之间'

  85. }

  86. }

  87. }

  88. }

  89. })

  90.  
  91. // 绑定dialog的确定按钮的监听事件

  92. $("#btnOk",window.top.document).click(function() {

  93.  
  94. var bootstrapValidator = $("#treeForm", window.top.document).data('bootstrapValidator');

  95. bootstrapValidator.validate();

  96. if(bootstrapValidator.isValid()){

  97. var zTree = $(window.parent.document).contents().find(".tab-pane.fade.active.in iframe")[0].contentWindow.zTree;

  98. var selectNode = $(window.parent.document).contents().find(".tab-pane.fade.active.in iframe")[0].contentWindow.selectNode;

  99. $.post($("#treeForm",window.top.document).attr('action'),$("#treeForm",window.top.document).serialize(),function(e){

  100. if(e.result){

  101. $('.modal-dialog', window.top.document).parent('div').remove()

  102. $('body', window.top.document).find('.modal-backdrop').remove();

  103. var entity = e.entity;

  104. zTree.addNodes(selectNode, {id:entity.id, pId:entity.pId, name:entity.name});

  105. window.Ewin.alert({message:'增加数据成功!'});

  106. }else{

  107. window.Ewin.alert({message:'增加数据失败!'});

  108. }

  109. })

  110. }

  111. });

  112.  
  113. })

  114. ]]>

  115. </script>

  116. </body>

  117. </html>


最后是update.html修改菜单页面的代码:

 

 

 
  1. <html xmlns:th="http://www.thymeleaf.org"

  2. xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">

  3. <body>

  4. <form id="treeForm" role="form" method="post" action="tree/update">

  5. <input type="hidden" name="pId" th:value="${entity.tree.id}" />

  6. <input type="hidden" name="id" th:value="${entity.id}" />

  7. <div class="form-group" >

  8. <label >父菜单名称:</label>

  9. <input type="text" class="form-control" th:value="${entity.tree.name}" readonly="readonly" />

  10. </div>

  11. <div class="form-group">

  12. <label for="name">菜单名称:</label>

  13. <input type="text" class="form-control" name="name" id="name" th:value="${entity.name}" placeholder="请输入菜单名称" />

  14. </div>

  15. <div class="form-group">

  16. <label for="url">菜单地址:</label>

  17. <input type="text" class="form-control" name="url" id="url" th:value="${entity.url}" placeholder="请输入菜单地址" />

  18. </div>

  19. <div class="form-group">

  20. <label for="icon">菜单样式:</label>

  21. <input type="text" class="form-control" name="icon" id="icon" th:value="${entity.icon}" placeholder="请输入菜单样式" />

  22. </div>

  23. <div class="form-group">

  24. <label for="url">菜单编码:</label>

  25. <input type="text" class="form-control" name="code" id="code" th:value="${entity.code}" placeholder="请输入菜单编码" />

  26. </div>

  27. <div class="form-group">

  28. <label for="treeOrder">菜单顺序:</label>

  29. <input type="text" class="form-control" name="treeOrder" id="treeOrder" th:value="${entity.treeOrder}" placeholder="请输入菜单顺序" />

  30. </div>

  31. <div class="form-group">

  32. <label for="treeOrder">菜单状态:</label>

  33. <label class='radio-inline'><input type='radio' name='state' value='1' th:checked="${entity.state} == 1?true:false" />可用</label>

  34. <label class='radio-inline'><input type='radio' name='state' value='0' th:checked="${entity.state} == 0?true:false" />禁用</label>

  35. </div>

  36. </form>

  37. <script th:inline="javascript">

  38. <![CDATA[

  39. $(function () {

  40. $('#treeForm').bootstrapValidator({

  41. message: 'This value is not valid',

  42. feedbackIcons: {

  43. valid: 'glyphicon glyphicon-ok',

  44. invalid: 'glyphicon glyphicon-remove',

  45. validating: 'glyphicon glyphicon-refresh'

  46. },

  47. fields: {

  48. name: {

  49. message: '菜单名称验证失败',

  50. validators: {

  51. notEmpty: {

  52. message: '菜单名称不能为空'

  53. }

  54. }

  55. },

  56. url: {

  57. message: '菜单地址验证失败',

  58. validators: {

  59. notEmpty: {

  60. message: '菜单地址不能为空'

  61. }

  62. }

  63. },

  64. code: {

  65. message: '菜单编码验证失败',

  66. validators: {

  67. notEmpty: {

  68. message: '菜单编码不能为空'

  69. }

  70. }

  71. },

  72. treeOrder: {

  73. message: '菜单顺序验证失败',

  74. validators: {

  75. notEmpty: {

  76. message: '菜单顺序不能为空'

  77. },

  78. regexp: {

  79. regexp: /^[0-9_]+$/,

  80. message: '菜单顺序必须为数字'

  81. },

  82. stringLength: {

  83. min: 1,

  84. max: 18,

  85. message: '菜单顺序必须在1到18位之间'

  86. }

  87. }

  88. }

  89. }

  90. })

  91.  
  92. // 绑定dialog的确定按钮的监听事件

  93. $("#btnOk",window.top.document).click(function() {

  94. var bootstrapValidator = $("#treeForm", window.top.document).data('bootstrapValidator');

  95. bootstrapValidator.validate();

  96. if(bootstrapValidator.isValid()){

  97. var zTree = $(window.parent.document).contents().find(".tab-pane.fade.active.in iframe")[0].contentWindow.zTree;

  98. var selectNode = $(window.parent.document).contents().find(".tab-pane.fade.active.in iframe")[0].contentWindow.selectNode;

  99. $.post($("#treeForm",window.top.document).attr('action'),$("#treeForm",window.top.document).serialize(),function(e){

  100. if(e.result){

  101. $('.modal-dialog', window.top.document).parent('div').remove()

  102. $('body', window.top.document).find('.modal-backdrop').remove();

  103. var entity = e.entity;

  104. selectNode.name = entity.name;

  105. zTree.updateNode(selectNode);

  106. window.Ewin.alert({message:'修改数据成功!'});

  107. }else{

  108. window.Ewin.alert({message:'修改数据失败!'});

  109. }

  110. })

  111. }

  112. });

  113. })

  114. ]]>

  115. </script>

  116. </body>

  117. </html>


到此我们完成了菜单模块的开发工作,由于java代码我们在上一章已经完成了全部的开发因此此处就不再继续陈述了,开发完成以后大家可以直接运行程序查看结果如下:

 

本章代码的GitHub地址:https://github.com/185594-5-27/csdndemo/tree/master-base-tree

 

 

上一篇文章地址:基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【六】【引入bootstrap前端框架】

 

 

下一篇文章地址:基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【八】【完善整个项目】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值