SpringBoot打造企业级进销存储系统 第五讲

package com.java1234.repository;import com.java1234.entity.Menu;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;import java.util.List;/*** 菜单=Repository接口*/
public interface MenuRepository extends JpaRepository<Menu,Integer> {/*** 根据父节点以及用户角色id查询子节点* @param parentId* @param roleId* @return*/@Query(value = "SELECT * FROM t_menu WHERE p_id=?1 AND id IN (SELECT menu_id FROM t_role_menu WHERE role_id=?2)",nativeQuery = true)public List<Menu> findByParentIdAndRoleId(int parentId,int roleId);
}
package com.java1234.service;import com.java1234.entity.Menu;import java.util.List;/*** 权限菜单Service接口*/
public interface MenuService {/*** 根据父节点以及用户角色id查询子节点* @param parentId* @param roleId* @return*/public List<Menu> findByParentIdAndRoleId(int parentId, int roleId);
}
package com.java1234.service.impl;import com.java1234.entity.Menu;
import com.java1234.repository.MenuRepository;
import com.java1234.service.MenuService;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;/*** 权限菜单Service实现类*/
@Service("menuService")
public class MenuServiceImpl implements MenuService {@Resourceprivate MenuRepository menuRepository;@Overridepublic List<Menu> findByParentIdAndRoleId(int parentId, int roleId) {return menuRepository.findByParentIdAndRoleId(parentId,roleId);}
}
package com.java1234.controller;import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.java1234.entity.Menu;
import com.java1234.service.MenuService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import com.java1234.entity.Role;
import com.java1234.entity.User;
import com.java1234.service.RoleService;
import com.java1234.service.UserService;
import com.java1234.util.StringUtil;/*** 用户Controller* @author Administrator**/
@Controller
@RequestMapping("/user")
public class UserController {@Resourceprivate UserService userService;@Resourceprivate RoleService roleService;@Resourceprivate MenuService menuService;/*** 用户登录判断* @param imageCode* @param user* @param bindingResult* @param session* @return*/@ResponseBody@RequestMapping("/login")public Map<String,Object> login(String imageCode,@Valid User user,BindingResult bindingResult,HttpSession session){Map<String,Object> map=new HashMap<String,Object>();if(StringUtil.isEmpty(imageCode)){map.put("success", false);map.put("errorInfo", "请输入验证码!");return map;}if(!session.getAttribute("checkcode").equals(imageCode)){map.put("success", false);map.put("errorInfo", "验证码输入错误!");return map;}if(bindingResult.hasErrors()){map.put("success", false);map.put("errorInfo", bindingResult.getFieldError().getDefaultMessage());return map;}Subject subject=SecurityUtils.getSubject();UsernamePasswordToken token=new UsernamePasswordToken(user.getUserName(), user.getPassword());try{subject.login(token);String userName=(String) SecurityUtils.getSubject().getPrincipal();User currentUser=userService.findByUserName(userName);session.setAttribute("currentUser", currentUser);List<Role> roleList=roleService.findByUserId(currentUser.getId());map.put("roleList", roleList);map.put("roleSize", roleList.size());map.put("success", true);return map;}catch(Exception e){e.printStackTrace();map.put("success", false);map.put("errorInfo", "用户名或者密码错误!");return map;}}/*** 保存角色信息* @param roleId* @param session* @return* @throws Exception*/@ResponseBody@RequestMapping("/saveRole")public Map<String,Object> saveRole(Integer roleId,HttpSession session)throws Exception{Map<String,Object> map=new HashMap<String,Object>();Role currentRole=roleService.findById(roleId);session.setAttribute("currentRole", currentRole);map.put("success", true);return map;}/*** 加载当前用户信息* @param session* @return* @throws Exception*/@ResponseBody@GetMapping("/loadUserInfo")public String loadUserInfo(HttpSession session)throws Exception{User currentUser=(User) session.getAttribute("currentUser");Role currentRole=(Role) session.getAttribute("currentRole");return "欢迎您:"+currentUser.getTrueName()+"&nbsp;[&nbsp;"+currentRole.getName()+"&nbsp;]";}/*** 加载权限菜单* @param session* @param parentId* @return* @throws Exception*/@ResponseBody@PostMapping("/loadMenuInfo")public String loadMenuInfo(HttpSession session,Integer parentId)throws Exception{Role currentRole=(Role) session.getAttribute("currentRole");return getAllMenuByParentId(parentId,currentRole.getId()).toString();}/*** 获取所有菜单信息* @param parentId* @param roleId* @return*/public JsonArray getAllMenuByParentId(Integer parentId,Integer roleId){JsonArray jsonArray=this.getMenuByParentId(parentId, roleId);for(int i=0;i<jsonArray.size();i++){JsonObject jsonObject=(JsonObject) jsonArray.get(i);if("open".equals(jsonObject.get("state").getAsString())){continue;}else{jsonObject.add("children", getAllMenuByParentId(jsonObject.get("id").getAsInt(), roleId));}}return jsonArray;}/*** 根据父节点和用户角色Id查询菜单* @param parentId* @param roleId* @return*/public JsonArray getMenuByParentId(Integer parentId,Integer roleId){List<Menu> menuList=menuService.findByParentIdAndRoleId(parentId, roleId);JsonArray jsonArray=new JsonArray();for(Menu menu:menuList){JsonObject jsonObject=new JsonObject();jsonObject.addProperty("id", menu.getId()); // 节点IdjsonObject.addProperty("text", menu.getName()); // 节点名称if(menu.getState()==1){jsonObject.addProperty("state", "closed"); // 根节点}else{jsonObject.addProperty("state", "open"); // 叶子节点}jsonObject.addProperty("iconCls", menu.getIcon()); // 节点图标JsonObject attributeObject=new JsonObject(); // 扩展属性attributeObject.addProperty("url", menu.getUrl()); // 菜单请求地址jsonObject.add("attributes", attributeObject);jsonArray.add(jsonObject);}return jsonArray;}
}

在这里插入图片描述

$("#tree").tree({lines:true,url:'/user/loadMenuInfo?parentId=-1',onLoadSuccess:function(){$("#tree").tree("expandAll");}});
    <ul id="tree" class="easyui-tree" style="padding: 10px"></ul>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>后台管理-进销存管理系统</title><link rel="stylesheet" type="text/css" href="/static/jquery-easyui-1.3.3/themes/default/easyui.css"></link><link rel="stylesheet" type="text/css" href="/static/jquery-easyui-1.3.3/themes/icon.css"></link><style type="text/css">.clock {float:right;width: 300px;height: 30px;padding-left: 20px;color: rgb(0, 76, 126);background: url(/static/images/clock.gif) no-repeat;font-size: 14px;}.userInfo{float:left;padding-left: 20px;padding-top: 30px;}</style><script type="text/javascript" src="/static/jquery-easyui-1.3.3/jquery.min.js"></script><script type="text/javascript" src="/static/jquery-easyui-1.3.3/jquery.easyui.min.js"></script><script type="text/javascript" src="/static/jquery-easyui-1.3.3/locale/easyui-lang-zh_CN.js"></script><script type="text/javascript">function showTime(){var date = new Date();this.year = date.getFullYear();this.month = date.getMonth() + 1;this.date = date.getDate();this.day = new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六")[date.getDay()];this.hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();this.minute = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();this.second = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();$("#clock").text("现在是:" + this.year + "年" + this.month + "月" + this.date + "日 " + this.hour + ":" + this.minute + ":" + this.second + " " + this.day);}$(document).ready(function() {window.setInterval("showTime()",1000);$("#userInfo").load("/user/loadUserInfo"); // 加载用户信息$("#tree").tree({lines:true,url:'/user/loadMenuInfo?parentId=-1',onLoadSuccess:function(){$("#tree").tree("expandAll");}});});</script>
</head>
<body class="easyui-layout">
<div region="north" style="height: 72px;"><table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0"><tr><td width="381px" style="background:url(/static/images/top_left.jpg)"></td><td style="background:url(/static/images/top_center.jpg)"><div id="userInfo" class="userInfo"></div></td><td valign="bottom" width="544px" style="background:url(/static/images/top_right.jpg)"><div id="clock" class="clock"></div></td></tr></table>
</div><div region="center">
</div><div region="west" style="width: 200px" title="导航菜单" split="true" iconCls="icon-navigation"><ul id="tree" class="easyui-tree" style="padding: 10px"></ul></div><div region="south" style="height: 30px;padding: 5px" align="center">Copyright © 2012-2017 南通小锋网络科技有限公司  版权所有
</div></body>
</html>

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

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

相关文章

ISIS接口认证实验简述

默认情况下&#xff0c;ISIS接口认证通过在ISIS协议数据单元&#xff08;PDU&#xff09;中添加认证字段&#xff0c;例如&#xff1a;一个密钥或密码&#xff0c;用于验证发送方的身份。 ISIS接口认证防止未经授权的设备加入到网络中&#xff0c;并确保邻居之间的通信是可信的…

无限自动出兵-入门版【war3地图编辑器】

文章目录 1、创建单位和地区2、新事件开端3、动作3.1、创建单位3.2、选取单位3.2.1、发布指令 4、最终 1、创建单位和地区 2、新事件开端 创建新的触发器→新事件开端→时间→时间周期事件 3、动作 3.1、创建单位 3.2、选取单位 单位组→选取单位组内单位做动作 矩形区域内的…

数据结构:基于数组实现简单的数据缓存区(简单队列)

1 前言 在我们使用CAN或者以太网调试时&#xff0c;经常需要缓存最近n次收到的数据&#xff0c;以便于我们对数据进行分析。 实现这一想法我们很容易就会想到队列&#xff0c;队列就是一种先进先出的数据结构&#xff0c;之前在《数据结构&#xff1a;基于数组的环形队列&…

EtherCAT 开源主站 IGH 在 linux 开发板的移植和伺服通信测试

手边有一套正点原子linux开发板imax6ul&#xff0c;一直在吃灰&#xff0c;周末业余时间无聊&#xff0c;把EtherCAT的开源IGH主站移植到开发板上玩玩儿&#xff0c;搞点事情做。顺便学习研究下EtherCAT总线协议及其对伺服驱动器的运动控制过程。实验很有意思&#xff0c;这里总…

2核4G云服务器并发能支持多少用户在线?

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&#xff0c;经阿腾云测试&a…

学点Java打小工_Day4_数组_冒泡排序

1 数组基本概念 程序算法数据结构 算法&#xff1a;解决程序的流程步骤 数据结构&#xff1a;将数据按照某种特定的结构来存储 设计良好的数据结构会导致良好的算法。 ArrayList、LinkedList 数组是最简单的数据结构。 数组&#xff1a;存放同一种类型数据的集合&#xff0c;在…

桌面待办,电脑桌面怎么设置待办事项

在忙碌的工作生活中&#xff0c;我们经常会有许多事情需要处理&#xff0c;为了提高工作效率和管理时间&#xff0c;很多人都有一套自己的桌面待办事项管理方法。那么&#xff0c;如何利用电脑桌面待办事项来提高工作效率&#xff0c;电脑桌面怎么设置待办事项呢&#xff1f; …

【Poi-tl Documentation】自定义占位符来设置图片大小

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板文件&#xff1a; image_test.docx package run.siyuan.poi.tl.policy;imp…

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…

set与zset数据类型

set类型基础 redis集合(set)类型和list列表类型类似&#xff0c;都可以用来存储多个字符串元素的 集合。但是和list不同的是set集合当中不允许重复的元素。而且set集合当中元素是没有顺序的&#xff0c;不存在元素下标。 redis的set类型是使用哈希表构造的&#xff0c;因此复…

每日OJ题_简单多问题dp⑥_力扣714. 买卖股票的最佳时机含手续费

目录 力扣714. 买卖股票的最佳时机含手续费 状态机分析 解析代码 力扣714. 买卖股票的最佳时机含手续费 714. 买卖股票的最佳时机含手续费 难度 中等 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续…

Linux远程连接本地数据库(docker)

1. 安装docker 参考上一篇文章 CentOS安装Docker 2. Linux中安装Mysql 2.1 docker拉取mysql镜像 拉取镜像 docker pull mysql查看镜像列表 docker images2.2 运行mysql容器 运行一个名字为mysql的mysql容器&#xff0c;其连接端口号为3306&#xff0c;密码为123456 docker r…

口腔管理平台 |基于springboot框架+ Mysql+Java+B/S结构的口腔管理平台 设计与实现(可运行源码+数据库+lw文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 会员功能 系统功能设计 数据库E-R图设计 lunwen参考…

RT-Thread之USB组件的使用记录(SD卡和USB同时挂载)

前言 使用usb-host组件读取u盘记录同时挂载sd和u盘用到的芯片为stm32f407zgt6u盘的格式为fat 组件选择 文件相关的宏定义 /* DFS: device virtual file system */ /* 设备虚拟文件系统 */ #define RT_USING_DFS #define DFS_USING_WORKDIR #define DFS_FILESYSTEMS_MAX 3 //…

Pikachu 靶场搭建

文章目录 环境说明1 Pikachu 简介2 Pikachu 安装 环境说明 操作系统&#xff1a;Windows 10PHPStudy 版本: 8.1.1.3Apache 版本&#xff1a;2.4.39MySQL 版本 5.7.26 1 Pikachu 简介 Pikachu是一个使用“PHP MySQL” 开发、包含常见的Web安全漏洞、适合Web渗透测试学习人员练…

印度交易所股票行情数据API接口

1. 历史日线 # Restful API https://tsanghi.com/api/fin/stock/XNSE/daily?token{token}&ticker{ticker}默认返回全部历史数据&#xff0c;也可以使用参数start_date和end_date选择特定时间段。 更新时间&#xff1a;收盘后3~4小时。 更新周期&#xff1a;每天。 请求方式…

python二级备考(3)-综合应用

1 《命运》是著名科幻作家倪匡的作品。这里给出《命运》的一个网络版本文件&#xff0c;文件名为“命运. txt”。 问题1 (5分) :在PY301-1. py文件中修改代码&#xff0c;对“命运. txt”文件进行字符频次统计&#xff0c;输出频次最高的中文字符(不包含标点符号)及其频次&…

初学者必看的python中类型转换

Python中常见的类型转换 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ]) 创建一个复数 str(x ) 将对象 x 转换为字符串 repr(x ) 将对象 x 转换为表达式字符串 eval(str ) 用来计算在字符串中…

05-延迟任务精准发布文章-黑马头条

延迟任务精准发布文章 1)文章定时发布 2)延迟任务概述 2.1)什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在这个事件触发之后的一段时间内触发…

Docker----Dockerfile构建微服务镜像

目录 一、关键步骤 二、具体步骤 1、准备后端jar包(这里以java后端演示) 2、编写Dockerfile 3、构建镜像 4、运行镜像容器 5、测试是否成功 一、关键步骤 1、准备后端jar包(这里以java后端演示) 2、编写Dockerfile 3、构建镜像 4、运行镜像容器 5、测试是否成功 二…