python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-菜单管理实现

news2024/12/27 12:30:14

锋哥原创的Springboot+Layui python222网站实战:

python222网站实战课程视频教程(SpringBoot+Python爬虫实战) ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程(SpringBoot+Python爬虫实战) ( 火爆连载更新中... )共计23条视频,包括:python222网站实战课程视频教程(SpringBoot+Python爬虫实战) ( 火爆连载更新中... )、第2讲 架构搭建实现、第3讲 页面系统属性动态化设计实现等,UP主更多精彩视频,请关注UP账号。icon-default.png?t=N7T8https://www.bilibili.com/video/BV1yX4y1a7qM/

后端:

package com.python222.controller.admin;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.python222.entity.Menu;
import com.python222.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 管理员-菜单控制器
 * @author python222小锋老师
 * @site www.python222.com
 */
@RestController
@RequestMapping(value = "/admin/menu")
public class MenuAdminController {

    @Autowired
    private MenuService menuService;

    /**
     * 根据条件查询菜单
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/list")
    public Map<String,Object> list()throws Exception{
        Map<String, Object> resultMap = new HashMap<>();
        List<Menu> menuList=menuService.list(new QueryWrapper<Menu>().orderByAsc("sort"));
        resultMap.put("code", 0);
        resultMap.put("data", menuList);
        return resultMap;
    }

    /**
     * 添加或者修改菜单
     * @param menu
     * @return
     */
    @RequestMapping("/save")
    public Map<String,Object> save(Menu menu){
        if(menu.getId()==null){
            menuService.save(menu);
        }else{
            menuService.updateById(menu);
        }
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("success", true);
        return resultMap;
    }

    /**
     * 删除菜单
     * @param id
     * @return
     * @throws Exception
     */
    @RequestMapping("/delete")
    public Map<String,Object> delete(Integer id)throws Exception{
        Map<String, Object> resultMap = new HashMap<>();
        menuService.removeById(id);
        resultMap.put("success", true);
        return resultMap;
    }

    /**
     * 根据id查询菜单实体
     * @param id
     * @return
     * @throws Exception
     */
    @RequestMapping("/findById")
    public Map<String,Object> findById(Integer id)throws Exception{
        Map<String, Object> resultMap = new HashMap<>();
        Menu menu=menuService.getById(id);
        resultMap.put("menu", menu);
        resultMap.put("success", true);
        return resultMap;
    }

}

menuManage.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>菜单管理</title>
<link rel="stylesheet" href="/static/layui/css/layui.css"/>
<link rel="stylesheet" href="/static/css/css.css"/>
</head>
<body>


   <div style="padding: 20px">
           <span class="layui-breadcrumb">
           <a>首页</a>
           <a><cite>菜单管理</cite></a>
         </span>
          <div style="padding-top: 20px;">
             <div>
                <div>
                   <button class="layui-btn layuiadmin-btn-list" data-type="batchdel" onclick="addMenu()">添加</button>
                </div>
             </div>
             <div>
                <table width="100%" id="menuListTable" ></table>
             </div>
         </div>
     </div>

<script src="/static/layui/layui.js"></script>
   <script src="/static/js/jquery.js"></script>
   <script src="/static/js/common.js"></script>
<script type="text/javascript">

   layui.use(['element','form','table'], function(){
       var form=layui.form;
        var element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
        $ = layui.jquery; // 使用jquery
        table = layui.table;

        table.render({
          elem: '#menuListTable'
          ,url:'/admin/menu/list'
          ,cols: [[
           {type:'checkbox'}
              ,{field:'id', width:100,title: '编号'}
            ,{field:'name', width:200,title: '菜单名称'}
            ,{field:'url',title: '菜单地址'}
            ,{field:'sort', width:100, title: '排列序号',align:'center'}
            ,{field:'action', width:150, title: '操作',align:'center',templet:formatAction}
          ]]
        });


   });


   function deleteOne(id){
      layer.confirm('您确定要删除这条记录吗?', {
       title:"系统提示"
        ,btn: ['确定','取消'] //按钮
      }, function(){
         layer.closeAll('dialog');
         $.post("/admin/menu/delete",{"id":id},function(result){
            if(result.success){
               layer.msg("删除成功!");
               table.reload("menuListTable",{});
            }else{
               layer.msg("删除失败,请联系管理员!");
            }
         },"json");
      }, function(){

      });
   }

   function addMenu(){
      layer.open({
           type: 2,
           title: '添加菜单',
           area: ['500px', '500px'],
           content: '/admin/saveMenu.html' //iframe的url
         });
   }

   function modifyMenu(id){
      layer.open({
           type: 2,
           title: '修改菜单',
           area: ['500px', '500px'],
           content: '/admin/saveMenu.html?id='+id //iframe的url
         });
   }


   function formatAction(d){
      return "<button class='layui-btn layui-btn-normal layui-btn-xs' onclick='modifyMenu("+d.id+")'><i class='layui-icon layui-icon-edit'></i>编辑</button><button class='layui-btn layui-btn-warm layui-btn-xs' onclick='deleteOne("+d.id+")'><i class='layui-icon layui-icon-delete' ></i>删除</button>";
   }



</script>
</body>
</html>

saveMenu.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>添加或者修改菜单</title>
<link rel="stylesheet" href="/static/layui/css/layui.css"></link>
<style type="text/css">

   table tr td{
      padding: 10px;
   }

</style>
</head>
<body>
<div style="padding: 20px">
   <form method="post" >
      <table>
         <tr>
            <td>菜单名称:</td>
            <td><input type="text" id="name" name="name" class="layui-input" style="width: 300px"/></td>
         </tr>
         <tr>
            <td>菜单地址:</td>
            <td><input type="text" id="url" name="url" class="layui-input" style="width: 300px"/></td>
         </tr>
         <tr>
            <td>菜单颜色:</td>
            <td>
               <div class="layui-form-item" style="margin-bottom: 0px;">
                  <div class="layui-input-inline" style="width: 120px;">
                     <input type="text" id="color" name="color" placeholder="请选择颜色" class="layui-input" >
                  </div>
                  <div class="layui-inline" style="left: -11px;">
                     <div id="color-form"></div>
                  </div>
               </div>
            </td>
         </tr>
         <tr>
            <td>字体加粗:</td>
            <td>
               <input type="checkbox" id="strong" name="strong"  style="zoom:120%;"/>
            </td>
         </tr>
         <tr>
            <td>排列序号:</td>
            <td><input type="text" id="sort" name="sort" class="layui-input" style="width: 100px;display: inline;"/>&nbsp;&nbsp;<span>(根据数值从小到大排序)</span></td>
         </tr>
         <tr>
            <td><button class="layui-btn" onclick="submitData();return false;">提交</button></td>
            <td><font id="errorInfo" color="red"></font></td>
         </tr>
      </table>
   </form>
</div>
<script src="/static/layui/layui.js"></script>
<script src="/static/js/jquery.js"></script>
<script src="/static/js/common.js"></script>
<script type="text/javascript">

    layui.use(['colorpicker','form'], function(){
      var colorpicker = layui.colorpicker;
        var form = layui.form;

        colorpicker.render({
            elem: '#color-form'
            ,color: '#000000'
            ,done: function(color){
                $('#color').val(color);
            }
        });
    });

   function submitData(){
      var name=$("#name").val().trim();
      var url=$("#url").val().trim();
        var color=$("#color").val().trim();
      var sort=$("#sort").val().trim();
      if(name=="") {
               $("#errorInfo").text("请输入菜单名称!");
           $("#name").focus();
               return false;
      }
      if(url=="") {
               $("#errorInfo").text("请输入菜单地址!");
           $("#url").focus();
               return false;
      }
      if(sort=="") {
               $("#errorInfo").text("请输入排列序号!");
           $("#sort").focus();
               return false;
      }
      if (!(/(^[1-9]\d*$)/.test(sort))) {
         $("#errorInfo").text("排列序号必须是正整数!");
           $("#sort").focus();
         return false;
       }
      var id=getQueryVariable("id");
      if(id){
         $.post("/admin/menu/save",{id:id,name:name,url:url,sort:sort,color:color,strong:$("#strong").is(':checked')},function(result){
           if(result.success){
                  layer.alert('修改成功!',function () {
                      parent.reloadPage();
                  });
           }else{
              $("#errorInfo").text(result.errorInfo);
           }
        },"json");
      }else{
         $.post("/admin/menu/save",{name:name,url:url,sort:sort,color:color,strong:$("#strong").is(':checked')},function(result){
              if(result.success){
                      layer.alert('添加成功!',function () {
                          parent.reloadPage();
                      });
              }else{
                 $("#errorInfo").text(result.errorInfo);
              }
           },"json");
      }
   }



   function getQueryVariable(variable){
          var query = window.location.search.substring(1);
          var vars = query.split("&");
          for (var i=0;i<vars.length;i++) {
                  var pair = vars[i].split("=");
                  if(pair[0] == variable){return pair[1];}
          }
          return(false);
   }

   $(function(){
     
      var id=getQueryVariable("id");

      if(id){
         $.post("/admin/menu/findById",{id:id},function(result){
              if(result.success){
                 var menu=result.menu;
                 $("#name").val(menu.name);
                 $("#url").val(menu.url);
                      $("#color").val(menu.color);
                      $("#strong").attr("checked",menu.strong);
                 $("#sort").val(menu.sort);
              }else{
                      layer.alert('服务器加载有问题,请联系管理员!');
              }
           },"json");
      }else{
          $("#color").val("#000000");
      }
   });


</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1422048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp状态管理Vuex介绍及vuex核心概念

状态管理Vuex Vuex 是什么&#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 uni-app 内置了 Vuex 什么是“状态管理模式”&#xff1f; <!…

集成学习之Boosting方法系列_XGboost

文章目录 【文章系列】【前言】【算法简介】【正文】&#xff08;一&#xff09;XGBoost前身&#xff1a;梯度提升树&#xff08;二&#xff09;XGBoost的特点&#xff08;三&#xff09;XGBoost实际操作1. 前期准备&#xff08;1&#xff09;数据格式&#xff08;2&#xff09…

使用Banana Pi BPI-R4开发板实现5G上网、Wi-Fi AP、文件共享和Docker服务

转载&#xff1a;本文出处https://think8848.cnblogs.com和作者: think8848 本文目的&#xff1a;记录近一个月以来折腾BPI-R4的过程&#xff0c;为后面可能的学习提供参考资料&#xff0c;此外也把折腾中踩过的坑发出来&#xff0c;让更多研究BPI-R4的筒子们少踩坑。 一、需求…

wifi配网(esp8266和esp32)-http get和post方式

wifi配网(esp8266和esp32)-http get和post方式 通过http get和post方式来给esp芯片配网 步骤&#xff1a; 开机&#xff0c;指示灯亮起后(需要灯闪烁3下后)&#xff0c;需在3s内&#xff08;超过3s则会正常启动&#xff09;&#xff0c;按一下按键&#xff08;注&#xff1a;切…

大数据学习之Redis,十大数据类型的具体应用(一)

目录 3. 数据类型命令及落地应用 3.1 备注 3.2 Redis字符串&#xff08;String&#xff09; 单值单value 多值操作 获取指定区间范围内的值 数值增减 获取字符串长度和内容追加 分布式锁 getset(先get后set) 3.3 Redis列表&#xff08;List&#xff09; 简单说明 …

网络协议与攻击模拟_11DHCP欺骗防护

开启DHCP 监听 ip dhcp snooping 指定监听vlan ip dhcp snooping vlan 1 由于开启监听后&#xff0c;交换机上的接口就全部变成非信任端口&#xff0c; 非信任端口会拒绝DHCP报文&#xff0c;会造成正常的DHCP请求和响应都无法完成。 现在是请求不到IP地址的&#xff0c;…

2023美赛A题之Lotka-Volterra【完整思路+代码】

这是2023年的成功&#xff0c;考虑到曾经付费用户的负责&#xff0c;2024年可以发出来了。去年我辅导队伍数量&#xff1a;15&#xff0c;获奖M为主&#xff0c;个别F&#xff0c;H&#xff0c;零S。言归正传&#xff0c;这里我开始分享去年的方案。由于时间久远&#xff0c;我…

IDEA2023打开新项目默认SDK变成了17

问题描述 项目安装了2个sdk版本&#xff0c;jdk8和jdk17 自从升级IDEA版本到2023以后&#xff0c;每次打开新项目&#xff0c;sdk都被默认选择成了jdk17, 每次都得手动修改 &#xff08;File--Project Structure&#xff09;&#xff0c;超级麻烦。 没有用的解决方法 以下这…

机器学习系列-2 线性回归训练损失

机器学习系列-2 线性回归&训练损失 学习内容来自&#xff1a;谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1 线性回归&#xff1a; 举例&#xff1a;蝉&#xff08;昆虫物种&…

设计模式篇---备忘录模式

文章目录 概念结构实例总结 概念 备忘录模式&#xff1a;在不破坏封装的前提下捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;像这样可以在以后将对象恢复到原先保存的状态。 就好比我们下象棋&#xff0c;下完之后发现走错了&#xff0c;想要回退…

STM32——感应开关盖垃圾桶

STM32——感应开关盖垃圾桶 1.定时器介绍 软件定时 缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); }定时器工作原理 使用精准的时基&#xff…

ONLYOFFICE:兼顾协作与安全的开源办公套件

文章目录 前言ONLYOFFICE是什么&#xff1f;ONLYOFFICE的特点多人在线协同灵活集成安全可靠跨平台和设备扩展丰富 实操注册登录编写文档插件安装智谱CopilotDraw.io 新版强势功能显示协作者头像插件 UI 界面更新 总结 前言 随着数字化时代的到来&#xff0c;越来越多的文档处理…

第38期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

Redis核心技术与实战【学习笔记】 - 7.Redis GEO类型 - 面向 LBS 应用的数据类型

前言 前面&#xff0c;介绍了 Redis 的 5 大基本数据类型&#xff1a;String、List、Hash、Set、Sorted Set&#xff0c;它们可以满足绝大多数的数据存储需求&#xff0c;但是在面对海里数据统计时&#xff0c;它们的内存开销很大。所以对于一些特殊的场景&#xff0c;它们是无…

Java笔记 --- 四、异常

四、异常 Java.lang.Throwable Error Exception&#xff08;异常&#xff09; 异常的作用 异常的处理方式 JVM默认的处理方式 捕获异常&#xff08;自己处理&#xff09; try里面没有出现异常&#xff0c;就不会运行catch里面的代码 如果出现多个异常&#xff0c;需要多个c…

山石防火墙安装使用

山石虚拟防火墙&#xff0c;可以安装在vmware workstation上 安装步骤&#xff1a; 1、新建虚拟机&#xff0c;选择典型。 2、稍后安装 3、操作系统版本选择“Other Linux 3.x kernel 64-bit”。 4、配置虚拟机名称和位置 5、自定义硬盘容量 6、点击自定义硬件 7、此处可以选…

Python编辑开发 --- pycharm pro 中文

PyCharm Pro是一款专业的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。它为Python开发者提供了丰富的功能和工具&#xff0c;使得Python编程变得更加高效和便捷。PyCharm Pro具有智能代码编辑功能&#xff0c;能够自动完成代码、快速导航至…

爆了!sealos 三天时间支持 1000 个帕鲁私服

Sealos 的帕鲁私服模板从第一天发布之后就起了 100 多个私服&#xff0c;第二天直接上到 500 多个&#xff0c;第三天直接上千&#xff0c;还在加速增长中。来讲讲我们只用一个晚上怎么做到上线一个专属可用区的&#xff0c;还有一些帕鲁实践让我对云有的一些新的思考。 Sealos…

2024年AI全景:趋势、预测和可能性

欢迎来到 2024 年人工智能和技术的可能性之旅。 在这里&#xff0c;每一个预测都是一个潜在的窗口&#xff0c;通向充满创新、变革、更重要的是类似于 1950 年代工业革命的未来。 20 世纪 50 年代见证了数字计算的兴起&#xff0c;重塑了行业和社会规范。 如今&#xff0c;人工…

第二十回 虔婆醉打唐牛儿 宋江怒杀阎婆惜-FreeBSD改变分区大小

阎婆找到宋江&#xff0c;劝宋江和阎婆惜和解。 宋江无奈跟阎婆惜喝酒&#xff0c;想趁阎婆下楼之机离开&#xff0c;但被阎婆用门锁拦住。宋江无奈留宿&#xff0c;但是两人还是不愉快&#xff0c;宋江五更天就起来了。 宋江走的匆忙&#xff0c;没有带招文袋。阎婆惜拿到招文…