1. 对于 项目 我的认知就是 把 所有 的
只有少部分人 会在 数据库操作的 工作
转化为
所有人 都能在前台进行 操作的 过程 -------编程
所以 核心就是 对 数据库 数据的 操作,
2. 根据 权限(操作范围的大小)
所有的 表的 数据 进行操作,--超级管理员
对部分----------------------------管理员
小部分--------------------------用户
3. 所以我们需要 把 所有的 action(权限) 转化为一个确定的 值(url),以便于 想给谁 权限 就给谁
于是 用户表(stu_id ,is_admin),
角色表(role_id )
权限表(pri_id fpri_id name url)
形成的 中间表 就是
user_role_Map(stu_id role_id )
role_pri_Map(pri_id role_id )
5. 然后再 使用 hibernate 中
5-1中间表如果 不需要 生成实体(java中3张) 那么
中间表 不需要 设置独立 主键,勾选多对多
5-2 如果中间表 带有内容有------设独立主键(5张表)
identity:代理主键,适合于Mysql sequence:代理主键,适合于oracle
6.如果是三张表 使用的 联合主键 -----3张表
CREATE TABLE `tbuser_role_map` (
`user_id` int(11) NOT NULL DEFAULT '0',
`role_id` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`user_id`,`role_id`),
KEY `role_id` (`role_id`),
CONSTRAINT `tbuser_role_map_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `tbuser` (`user_id`),
CONSTRAINT `tbuser_role_map_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `tbrole` (`role_id`)
)
<span style="font-size:14px;">public class Tbuser implements java.io.Serializable {
private Set<Tbrole> tbroles = new HashSet<Tbrole>(0);
// Property accessors
@GenericGenerator(name = "generator", strategy = "increment")
@Id
@GeneratedValue(generator = "generator")
@Column(name = "user_id", unique = true, nullable = false)
public Integer getUserId() {
return this.userId;
}
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "tbuser_role_map", catalog = "review", joinColumns = { @JoinColumn(name = "user_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "role_id", nullable = false, updatable = false) })
public Set<Tbrole> getTbroles() {
return this.tbroles;
}</span> 中间的 角色表
<span style="font-size:14px;">@Entity
@Table(name = "tbrole", catalog = "review")
public class Tbrole implements java.io.Serializable {
// Fields
private Integer roleId;
private String roleName;
private String roleMemo;
private Set<Tbpremission> tbpremissions = new HashSet<Tbpremission>(0);
private Set<Tbuser> tbusers = new HashSet<Tbuser>(0);
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "tbrole_premission_map", catalog = "review", joinColumns = { @JoinColumn(name = "role_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "pre_id", nullable = false, updatable = false) })
public Set<Tbpremission> getTbpremissions() {
return this.tbpremissions;
}
public void setTbpremissions(Set<Tbpremission> tbpremissions) {
this.tbpremissions = tbpremissions;
}
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "tbroles")
public Set<Tbuser> getTbusers() {
return this.tbusers;
}</span>@Entity
@Table(name = "tbpremission", catalog = "review")
public class Tbpremission implements java.io.Serializable {
// Fields
private Integer preId;
private String preName;
private String preUrl;
private Integer preParentId;
private Set<Tbrole> tbroles = new HashSet<Tbrole>(0);
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "tbpremissions")
public Set<Tbrole> getTbroles() {
return this.tbroles;
}7. 写好了 po ,我们就要 关注的是
怎么样实现 权限的显示了
在 login 进如的 主页面 上就是
<base href="<%=basePath%>">
<script type="text/javascript" src="lib/json2.js"></script>
<script type="text/javascript">
$(function(){
$.ajax({
type: "GET",
url: "useract_loadPremission.action",
dataType: "json",
success: function(data){
alert(JSON.stringify(data));
var dt = data.tps;//所有的权限
//显示
for(var i=0;i<dt.length;i++){
//alert(dt[i].preId+">>");
if(dt[i].preParentId==0)
{
var html_li_parent = '<li><a href="javascript:void(0);" data-target=".dashboard-menu'+dt[i].preId+'" class="nav-header" data-toggle="collapse"><i class="fa fa-fw fa-dashboard"></i>'+dt[i].preName+'<i class="fa fa-collapse"></i></a></li>';
$("#onlineMenu").append(html_li_parent);
var html_li_child = '<li>';
for(var j=0;j<dt.length;j++){
if(dt[i].preId == dt[j].preParentId){
html_li_child += '<ul class="dashboard-menu'+dt[i].preId+' nav nav-list collapse in"><li><a href="'+dt[j].url+'" target="MainFrm"><span class="fa fa-caret-right"></span>'+dt[j].preName+'</a></li></ul>';
//$("#onlineMenu").append(html_ul);
}
}
html_li_child += '</li>';
$("#onlineMenu").append(html_li_child);
}
}
},
error:function(data){
alert(JSON.stringify(data));
}
});
});
</script>
<div class="sidebar-nav">
<ul id="onlineMenu">
</ul>
</div>
<div class="content">
<div class="header">
<div class="stats">
<p class="stat">
<span class="label label-info">5</span> Tickets
</p>
<p class="stat">
<span class="label label-success">27</span> Tasks
</p>
<p class="stat">
<span class="label label-danger">15</span> Overdue
</p>
</div>
<h1 class="page-title">Dashboard</h1>
<ul class="breadcrumb">
<li><a href="index.html">Home</a></li>
<li class="active">Dashboard</li>
</ul>
</div>
<div class="main-content">
<iframe name="MainFrm"
frameborder="no" border="0" marginwidth="0" marginheight="0" width="100%" height="800"></iframe>
</div>
</div>
</body>
</html>
8. 为了 方便写 登录拦截器,struts里面就是 登录的 放一个 pakege
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 使用spring的对象工厂 -->
<constant name="struts.objectFactory" value="spring"></constant>
<package name="onlinedef" namespace="/"
extends="struts-default,json-default">
<action name="useract_*" method="{1}" class="userAction">
<result name="toindex">/index.jsp</result>
<result name="tomain">/WEB-INF/view/main.jsp</result>
<result name="ajax" type="json">
<param name="includeProperties">
tps\[\d+\]\.preId,
tps\[\d+\]\.preName,
tps\[\d+\]\.preUrl,
tps\[\d+\]\.preParentId,
</param>
</result>
</action>
</package>
</struts>
9. 然在 appli里面的配置 很有 学问 ,这里面的 service层的 自动提交事务, 就必须要 以 以下的 关键字开头才能实现 提交
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 只对业务逻辑层实施事务 -->
<aop:pointcut id="txPointCut"
expression="execution(* com.baidu.online.service.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
</aop:config>
<bean id="baseDao" class="com.baidu.online.dao.impl.BaseDao">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
1.0. 就是 web.xml
配置了
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Str ustSpringHibernate</display-name>
<listener> 这是 app* 所有的 bean文件
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app*.xml</param-value>
</context-param>
<!-- 让Session持续到页面加载完毕 -->
<filter>
<filter-name>hibernateFilter</filter-name> 提交事务
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name> struts的文件
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,
struts-plugin.xml,
../struts.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
本文介绍了一个权限管理系统的设计方案,包括数据库设计、多对多关系处理、权限显示实现等关键环节,并详细解释了如何通过Struts、Spring及Hibernate实现权限管理。
3516

被折叠的 条评论
为什么被折叠?



