项目在线培训分析(一)权限5张表

本文介绍了一个权限管理系统的设计方案,包括数据库设计、多对多关系处理、权限显示实现等关键环节,并详细解释了如何通过Struts、Spring及Hibernate实现权限管理。

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>


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值