您的位置:首页 > 编程语言 > Java开发

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

2018-01-12 18:55 633 查看
有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效果图:



代码完成!

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

转载请注明出处!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐