基于SSM框架权限系统的开发

有bug请在评论区留言


这是个十分简单的权限实现,后端采用SSM框架,前段展示层使用ztree(ztree官网),实现控制则使用jsp自定义的判断标签;

第一步:新建power数据库。

用户表user,权利表power,用户-权利关系表userPower,

/*
Navicat MySQL Data Transfer

Source Server         : 123
Source Server Version : 50610
Source Host           : 127.0.0.1:3306
Source Database       : power

Target Server Type    : MYSQL
Target Server Version : 50610
File Encoding         : 65001

Date: 2018-01-15 21:07:24
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for power
-- ----------------------------
DROP TABLE IF EXISTS `power`;
CREATE TABLE `power` (
  `pId` int(4) NOT NULL AUTO_INCREMENT,
  `pName` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`pId`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of power
-- ----------------------------
INSERT INTO `power` VALUES ('1', '吃');
INSERT INTO `power` VALUES ('2', '吃饭');
INSERT INTO `power` VALUES ('3', '吃面条');
INSERT INTO `power` VALUES ('4', '吃零食');
INSERT INTO `power` VALUES ('5', '喝');
INSERT INTO `power` VALUES ('6', '喝芬达');
INSERT INTO `power` VALUES ('7', '喝可乐');
INSERT INTO `power` VALUES ('8', '嘴');
INSERT INTO `power` VALUES ('9', '说话');
INSERT INTO `power` VALUES ('10', '喷人');

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `uId` int(4) NOT NULL AUTO_INCREMENT,
  `uName` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`uId`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'admin');
INSERT INTO `user` VALUES ('2', 'tom');
INSERT INTO `user` VALUES ('3', 'jack');

-- ----------------------------
-- Table structure for userpower
-- ----------------------------
DROP TABLE IF EXISTS `userpower`;
CREATE TABLE `userpower` (
  `uPId` int(4) NOT NULL AUTO_INCREMENT,
  `uPUId` int(11) DEFAULT NULL,
  `uPPId` int(11) DEFAULT NULL,
  PRIMARY KEY (`uPId`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of userpower
-- ----------------------------
INSERT INTO `userpower` VALUES ('1', '1', '1');
INSERT INTO `userpower` VALUES ('12', '2', '1');
INSERT INTO `userpower` VALUES ('13', '2', '2');
INSERT INTO `userpower` VALUES ('14', '2', '3');
INSERT INTO `userpower` VALUES ('15', '2', '4');
INSERT INTO `userpower` VALUES ('16', '2', '5');


数据库完成,开始web部分

第二步:新建maven项目

添加项目相关jar包,这是项目的架构,biaoqian包是存放jsp自定义标签的处理类


代码贴出关键部分

controller层代码:

package cn.controller;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONArray;

import cn.pojo.Power;
import cn.pojo.User;
import cn.pojo.UserPower;
import cn.service.UserPowerService;
import cn.service.UserService;

@Controller
@RequestMapping("power")
public class PowerController {

	@Resource
	private UserService userService;

	@Resource
	private UserPowerService userPowerService;

	/**
	 * 登录
	 * 
	 * @param request
	 * @param u
	 * @param model
	 * @return
	 */
	@RequestMapping("login")
	public String login(HttpServletRequest request, User u, Model model) {
		User user = userService.login(u);
		if (user == null) {
			return "redirect:/login.jsp";
		}
		HttpSession session = request.getSession();
		session.setAttribute("USER_LOGIN", user);
		if (user.getuName().equals("admin")) {
			List<User> list_user = userService.getAllUser();
			session.setAttribute("list_user", list_user);
			return "admin";
		}
		return "welcome";
	}

	/**
	 * 异步方法,根据uid获取相应权限list
	 * 
	 * @param uId
	 * @return
	 */
	@RequestMapping("getPowerByUId")
	@ResponseBody
	public String getPowerByUId(@RequestParam("uId") String uId) {
		List<UserPower> i = userPowerService.getPowerByUId(Integer.parseInt(uId));
		return JSONArray.toJSONString(i);
	}

	@RequestMapping("updatePower")
	public String updatePower(@RequestParam("uId") String uId, @RequestParam("pow") String pow) {
		userPowerService.deletePower(Integer.parseInt(uId));// 增加前先删除具有的权限
		String[] p = pow.split(",");
		UserPower up = new UserPower();
		for (String power : p) {
			if (power.length() > 0) {
				up.setuPUId(Integer.parseInt(uId));
				up.setuPPId(Integer.parseInt(power));
				userPowerService.addPower(up);// 增加权限
			}
		}
		return "admin";
	}
}
两个service的方法:

package cn.service;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import cn.pojo.UserPower;

public interface UserPowerService {
	// 根据uid查出具有的权限
	List<UserPower> getPowerByUId(Integer uId);

	// 增加权限
	int addPower(UserPower userPower);

	// 删除权限
	int deletePower(Integer uId);
}






package cn.service;

import java.util.List;

import cn.pojo.User;

public interface UserService {
	// 登录
	User login(User u);

	// 获得所有用户
	List<User> getAllUser();
}

jsp页面有3个,login.jsp   welcome.jsp    admin.jsp,这里的login.jsp就不用说了吧,一个输入框输入姓名后,去数据库查是否存在这个人,很简单;

welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/WEB-INF/powertag.tld"  prefix="yu" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'welcome.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
  我是${USER_LOGIN.uName },<br/>
  我具有:<hr/>
  <p style="color:red;">
  <yu:power power="吃">吃,<br/></yu:power>
  <yu:power power="吃饭">吃饭,<br/></yu:power>
  <yu:power power="吃面条">吃面条,<br/></yu:power>
  <yu:power power="吃零食">吃零食,<br/></yu:power>
  <yu:power power="喝">喝,<br/></yu:power>
  <yu:power power="喝芬达">喝芬达,<br/></yu:power>
  <yu:power power="喝可乐">喝可乐,<br/></yu:power>
  <yu:power power="嘴">嘴,<br/></yu:power>
  <yu:power power="说话">说话,<br/></yu:power>
  <yu:power power="喷人">喷人,<br/></yu:power>
  </p>
  <hr/>
   功能的
  </body>
</html>

admin.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'admin.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

</head>

<body>
	<p>你想修改谁的权限:</p>
	<c:forEach var="list_user" items="${list_user }">
		<c:if test="${list_user.uName!='admin' }">
			<input type="radio" name="uName" value="${list_user.uId }" />${list_user.uName }
  	</c:if>
	</c:forEach>

	<div id="ztree" style="display:none;">
		<ul id="baseTree" class="ztree" style="width:260px; overflow:auto;"></ul>
		<button id="btn">提交</button>
	</div>
</body>
</html>
<link rel="stylesheet" type="text/css"
	href="ztree/css/zTreeStyle/zTreeStyle.css">
<script type="text/javascript" src="js/jquery-1.8.0.js"></script>
<script type="text/javascript" src="ztree/jquery.ztree.all-3.5.js"></script>
<script>
	//$("input[name=uName]:checked")
	//显示已有权限
	$("input[name=uName]").click(function() {
		var uId = $("input[name=uName]:checked").val();
		$("#ztree").css("display", "block")
		var treeObj = $.fn.zTree.getZTreeObj("baseTree");
		treeObj.checkAllNodes(false); //所有节点取消选中
		treeObj.expandAll(false); //所有节点关闭
		$.post("power/getPowerByUId?uId=" + uId, function(data) {
			var v = JSON.parse(data);
			for (var i = 0; i < v.length; i++) {
				var node = treeObj.getNodeByParam("value", v[i].uPPId, null);
				treeObj.expandNode(node, true, false); //指定选中ID节点展开
				treeObj.checkNode(node); //指定节点选中
			}
		}, "text")
	})

	//修改权限
	$("#btn").click(function() {
		var pow = "";
		var uId = $("input[name=uName]:checked").val()
		var treeObj = $.fn.zTree.getZTreeObj("baseTree");
		var nodes = treeObj.getCheckedNodes(true);
		for (var i = 0; i < nodes.length; i++) {
			pow = pow + "," + nodes[i].value;
		}
		location.href = "power/updatePower?uId="+uId+"&pow="+pow;
	})
	//设置ztree
	var setting = {
		check : {
			chkboxType : {
				"Y" : "ps",
				"N" : "s"
			}, //勾选checkbox对于父子节点的关联关系,取消勾选时不关联父  
			chkStyle : "checkbox",
			enable : true //是否复选框  
		},
		data : {
			simpleData : {
				enable : true
			}
		}
	};
	var zNodes = [ {
		id : 1,
		name : "吃",
		value : "1"
	}, {
		id : 11,
		pId : 1,
		name : "吃饭",
		value : "2"
	}, {
		id : 12,
		pId : 1,
		name : "吃面条",
		value : "3"
	}, {
		id : 13,
		pId : 1,
		name : "吃零食",
		value : "4"
	}, {
		id : 2,
		name : "喝",
		value : "5"
	}, {
		id : 21,
		pId : 2,
		name : "喝芬达",
		value : "6"
	}, {
		id : 21,
		pId : 2,
		name : "喝可乐",
		value : "7"
	}, {
		id : 3,
		name : "嘴",
		value : "8"
	}, {
		id : 31,
		pId : 3,
		name : "说话",
		value : "9"
	}, {
		id : 32,
		pId : 3,
		name : "喷人",
		value : "10"
	}
	]
	$.fn.zTree.init($("#baseTree"), setting, zNodes);
</script>
请注意welcome.jsp中 <%@ taglib uri="/WEB-INF/powertag.tld"  prefix="yu" %> 这段代码,这是自定义标签的引用。

下面开始自定义一个jsp判断标签,简单的哦

jsp标签创建分3步,先创建处理类,在编写tid文件,最后引用。

处理类:

package cn.biaoqian;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.TagSupport;

import cn.pojo.Power;
import cn.pojo.User;


/**
 * @author Yu
 *
 */
public class Yu extends TagSupport {


	private PageContext pageContext;

	private String power;

	// 设置PageContext对象
	public void setPageContext(PageContext pageContext) {
		this.pageContext = pageContext;
	}

	public void setPower(String power) {
		this.power = power;
	}

	/**
	 * 标签开始处理..调用的方法
	 * 
	 */
	@Override
	public int doStartTag() throws JspException {
		try {
			HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
			HttpSession session = request.getSession();
			User u = (User) session.getAttribute("USER_LOGIN");
			System.out.println(u);
			List<Power> power = u.getPower();
			for (int i = 0; i < power.size(); i++) {
				if (power.get(i).getpName().equals(this.power)) {
					// 允许访问标签body
					return BodyTagSupport.EVAL_BODY_INCLUDE;// 返回此则执行标签body中内容,SKIP_BODY则不执行
				}
			}
			return BodyTagSupport.SKIP_BODY;
		} catch (Exception e) {
			return BodyTagSupport.SKIP_BODY;
		}
	}

	/**
	 * 
	 * 标签处理结束的调用的方法
	 */
	@Override
	public int doEndTag() throws JspException {
		return super.doEndTag();
	}

	/**
	 * 
	 * 释放资源
	 */
	@Override
	public void release() {
		super.release();
	}

}
powertag.tid文件,注意这个文件位置在WEB-INF目录下,与web.xml同级别:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<!-- 标签描述TLD文件 -->

<taglib>
    <tlib-version>1.1</tlib-version>
    <jsp-version>1.2</jsp-version>
    
    <!-- 默认前缀名 -->
    <short-name>yu</short-name>
    
    <uri>http://www.mytaglib.com/taglib</uri> 
    <display-name>MyDateTaglib</display-name>
    <description>My date taglib!</description>  
      
    <tag>
        <name>power</name>
        <tag-class>cn.biaoqian.Yu</tag-class>
        
        <attribute>
            <name>power</name>
            <!-- 属性是否必须 -->
            <required>true</required>
            <!-- 属性是否支持小脚本 EL表达式 -->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        
    </tag>
    
</taglib>

最后在需要引用的界面引用

<%@ taglib uri="/WEB-INF/powertag.tld"  prefix="yu" %>

普通成员效果图:


admin效果图:


代码完成!

结束语:给与没有权限设计思路小伙伴的一个方法,仅作为案例(样式什么的随便啦)

转载请注明出处!


  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值