如何给项目里面每个功能点设权限?

本文详细介绍了权限管理的概念、如何为系统中的不同功能点设置权限,以及权限管理模块的工作原理。此外,还提供了开发人员如何将新模块的功能点注册到权限管理系统的具体步骤。

导读:

      一个用户登录系统之后,可以访问哪些站点,那些菜单,那些模块,那些页面,那些按钮,都是可以通过权限进行控制的。 一个权限做的比较完整的项目,

一般人员管理,消息管理,菜单管理,站点管理,日志管理,部件管理,权限管理等等都是受权限控制的,这么多模块每个功能点是如何在权限管理下跑的井井

有条呢?最近老是看到很多人在发愁权限,所以把自己的一些见解写出来,供大家参考,也只是自己的一点点思路,不足的地方,谢谢指出。

 

问题:刚开始做模块的时候,模块写好了,被测试提过来“你的日志模块功能点不受权限控制”,当时就很模糊,什么是权限呀,去问测试人员,她打开一个页面,

上面有棵功能树(很大,显示各个模块,以及模块下面的操作),你的所有的功能点都没在功能点树上显示,只有显示在树上的才可以把功能点分配给人,自己

查去吧。回来看了下别人的代码,呵呵原来一个模块开发完之后需要给当前模块所有功能点注册权限。带着测试出的这个BUG,跟大家一起分享下一些知识点,以

及权限的核心思想吧。


1.什么是权限?


“权限就是有票你就进”

    去游乐园,去乘大巴,去坐地铁,必须的买票吧?权限就像你手里的那张票。 

 

“权限就是认证不认人”

    权是"权力,制度",限是“限制,管理”,连起来就是:XXXX通过权力,制度去管理XXX,在现在中国有12多人口,政府也给每个人发了证“身份证”,抗日

时期小日本通过“良民证”去管理“中国人民”,看来受管理的都有一个特点就是“他有证”。

 


2.你要给谁设权限----谁就是我们所说的功能点

      我们要清楚的明白,我们要给系统里的用户角色站点日志等等模块设权限,让有权限的人去管理自己权限下面的操作。

 

  “你要用谁要去控制谁,你的功能点的粒度有多大”

      第一个谁一般是用户;第二个谁很可能是一个模块(日志模块),一个表对象,一个表里面的一条记录,甚至是一个页面的一个方法,甚至是一个安牛,你

所谓的 功能点可以是上面的所有东西,但是你一定要明白谁要控制是谁?一般可以细化到一个模块,一个页面,页面的一个“删除”,“添加”按钮。

 

 

3.怎样去控制?怎样去唯一标识这个“控件”,“方法”,“类”(也就是我说的功能点)

"给每个'按钮'一个身份证"

     既然权限是“权限就是认证不认人”,那么当然的给没个功能点加一个唯一标识了。

     唯一标识一般的方法是“模块名称+控件的ID”。

     天呀,这不是要杀了我吗?这么多,没办法,嘻嘻,你必须这么干

 

 

4.权限管理模块一直在干什么样的工作【核心】

1.)当一个用户进系统之后,可以拿到这个用户所有有可以控制功能点的信息

     比如可以拿到有权限的站点,有权限的菜单,有权限的模块,有权限的页面等等。

2.)拿到系统里面所有的功能点,然后把它分配给希望分配的角色或者用户

     权限管理模块必须可以拿到系统里面你配置的所有的功能点(最好以一棵功能树的形式展现出来),并且可以把权限分配给一些人员,角色,有权限的用户

可以把自己的权限分配给别人,权限大的用户可以控制所有信息

3.)当开发人员开发一个新的模块的时候,只要做简单的操作就可以把新的功能点注册到权限里面

     权限模块必须提供一个可扩展的功能,当系统里面多一个模块的时候,可以让开发人员迅速的注册功能点(一般是XML格式)。

4.)当用户发送一个请求的时候,能返回当前用户是否能操作该按钮(控件,对象)

    开发人员只要把当前用户的Id与功能点的ID给权限服务就可以返回当前用户是否有操作当前对象的权限

5.)权限管理模块有自己内置的潜规则,也就是优先级

   当两个权限发生冲突的时候,靠我们自己定义的优先级进行匹配

 

 

5.程序开发人员开发一个新的模块如何注册权限的?

1.)写你的模块代码

2.)把你模块的功能点都注册到权限树上(把你功能点写到XML上),各个功能点进行验证【如果没有这个验证,功能点虽然挂到权限上了,但实际上是没受权限

    限制的】

3.)超级管理员进来,可以操作权限树,把你的功能点权限分配给别人

5.)分配你权限的账户可以访问你页面上的操作

 

解决问题:“你消息模块的删除按钮不受权限控制”如何修这个BUG?一个按钮不受权限限制?怎么受权限限制呀?

1.)首先的把当前按钮的ID注册到权限(模块名+功能点名)一般这个就可以唯一标识你当前的ID

2.)然后在你当前控件代码里面写,根据这个身份证去权限请求一个服务,if(有权限)按钮可用ELSE按钮不可用【如果没有这个验证,功能点虽然挂到权限上了,

    但实际上是没受权限限制的】

3.)最后权限好用不好用只有测试人员去测了

 

备注:对于以些小的网站,其实我认为权限设置到页面级就可以了,没必要注册到所有的操作

<think>我们正在处理一个面向对象编程任务,需要创建项目Bike,并计三个类:SharedBike(共享单车)、SharedBikeCompany(共享单车公司)和SharedBikeMgr(共享单车管理类)。在SharedBikeMgr类中,我们需要实现一个initial()方法,用于初始化3个公司及每个公司的单车基本信息。步骤:1.定义SharedBike类:表示一辆共享单车,包含单车的属性,如单车id、单车名称、状态(可借、已借出等)等。2.定义SharedBikeCompany类:表示一个共享单车公司,包含公司名称、单车数组(该公司拥有的所有单车)以及公司单车数量等属性。3.定义SharedBikeMgr类:管理类,包含一个公司数组(用于存储多个公司),并实现initial()方法,该方法将初始化3个公司及每个公司的单车基本信息。计细节: -SharedBike类:我们可以计属性如下:bikeId:单车编号bikeName:单车名称(如ofo单车、摩拜单车等,但注意这里应该是单车的名字,不过实际上同一公司的单车名字可能相同,所以更合理的可能是记录单车类型?但题目要求基本信息,我们可以简单处理)status:状态(0表示可借,1表示已借出)还可以有其他属性,如借出时间等,但题目要求初始化基本信息,我们先实现基本属性。- SharedBikeCompany类:companyName:公司名称bikeList:该公司拥有的单车列表(SharedBike对象的数组)totalCount:公司拥有的单车总数(可以用bikeList.length代替,但有时为了效率可以单独记录)-SharedBikeMgr类:companyArray:存储多个SharedBikeCompany对象的数组initial():初始化方法,创建3个公司,并为每个公司初始化若干辆单车。初始化要求:初始化3个公司,每个公司初始化若干辆单车(比如每个公司初始有5辆单车)。单车的基本信息包括单车id、单车名称、状态(初始状态为可借)。注意:单车名称可以按照公司来定,比如公司1的单车都叫“公司1单车”,也可以有不同的单车名称,但题目没有具体要求,我们可以为每个公司置相同的单车名称,并给每辆单车一个唯一的id(可以全局唯一,也可以公司内唯一,这里我们采用公司内唯一,即每个公司内单车id从1开始递增)。实现思路:在SharedBikeMgr的initial方法中:1.创建3个SharedBikeCompany对象,分别命名为公司1、公司2、公司3(如ofo、摩拜、哈罗)。2.为每个公司创建若干辆单车(比如5辆),单车的id从1开始递增,单车名称可以为公司名+单车(如“ofo单车”),状态初始为0(可借)。3.将单车添加到对应公司的bikeList中。4.将三个公司对象存储到companyArray中。代码结构(使用Java语言,因为引用中给出的是Java接口):我们将创建以下类://共享单车类class SharedBike{private intbikeId;privateString bikeName;privateint status; //0可借,1已借出//构造方法public SharedBike(int bikeId,String bikeName){this.bikeId= bikeId;this.bikeName =bikeName;this.status=0;//初始状态为可借}//省略getter和setter方法(实际需要提供,以便外部访问属性)}//共享单车公司类class SharedBikeCompany {privateString companyName;privateList<SharedBike>bikeList; //使用列表存储单车public SharedBikeCompany(StringcompanyName) {this.companyName= companyName;this.bikeList =new ArrayList<>();}//添加一辆单车publicvoid addBike(SharedBikebike){bikeList.add(bike);}//省略其他方法}//共享单车管理类class SharedBikeMgr{private List<SharedBikeCompany>companyList; //公司列表publicSharedBikeMgr(){companyList= newArrayList<>();}publicvoid initial() {//初始化3个公司String[] companyNames ={"ofo", "摩拜", "哈罗"};for (String name: companyNames){SharedBikeCompanycompany =new SharedBikeCompany(name);//为每个公司初始化5辆单车for(inti =1; i<=5;i++){//单车名称可以为公司名+单车,例如:ofo单车1,但这里我们只置公司名+单车,然后编号由id体现//实际上,单车名称可以相同,所以我们用公司名+单车作为单车名称,然后每辆车的id不同(这里id在公司内唯一)SharedBike bike= newSharedBike(i, name+ "单车");company.addBike(bike);}companyList.add(company);}}}注意:以上代码是基础实现,实际中可能需要更多的功能(如查询、借还车等),但题目只要求初始化,所以先实现initial方法。但是,引用中有一个BikeDao接口,里面定义了一些方法(如findAllBikeInfo,putBike,deleteBikeById,borrowBikeById, returnBikeById)。这个接口可能是用于数据操作的,但题目要求的是创建类和初始化,所以我们可以暂时不考虑这个接口,除非题目要求实现这些方法。根据题目要求,我们只做初始化部分。因此,我们按照上述计实现。如果用户后续需要实现BikeDao接口中的方法,那么我们需要在相应的类中实现这些功能。但当前问题只要求初始化,所以我们先完成初始化。现在,我们按照上述计编写代码。</think>### 面向对象计:共享单车管理系统 #### 1. **项目结构** ``` BikeProject ├── src │ ├── SharedBike.java // 单车类 │ ├── SharedBikeCompany.java // 公司类 │ └── SharedBikeMgr.java // 管理类 ``` #### 2. **类实现** ##### (1) `SharedBike.java` - 单车实体类 ```java public class SharedBike { private int bikeId; // 单车ID private String bikeName; // 单车名称 private int status; // 状态(0可借/1已借出) // 构造方法 public SharedBike(int bikeId, String bikeName) { this.bikeId = bikeId; this.bikeName = bikeName; this.status = 0; // 初始状态为可借 } // Getter/Setter public int getBikeId() { return bikeId; } public String getBikeName() { return bikeName; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } } ``` ##### (2) `SharedBikeCompany.java` - 公司管理类 ```java import java.util.ArrayList; import java.util.List; public class SharedBikeCompany { private String companyName; // 公司名称 private List<SharedBike> bikes; // 单车列表 private int bikeCount; // 单车数量 // 构造方法 public SharedBikeCompany(String companyName) { this.companyName = companyName; this.bikes = new ArrayList<>(); this.bikeCount = 0; } // 添加单车 public void addBike(SharedBike bike) { bikes.add(bike); bikeCount++; } // Getter public String getCompanyName() { return companyName; } public List<SharedBike> getBikes() { return bikes; } public int getBikeCount() { return bikeCount; } } ``` ##### (3) `SharedBikeMgr.java` - 系统管理类 ```java public class SharedBikeMgr { private SharedBikeCompany[] companies; // 公司数组 // 初始化方法 public void initial() { companies = new SharedBikeCompany[3]; // 创建3个公司 String[] companyNames = {"ofo单车", "摩拜单车", "哈啰单车"}; for (int i = 0; i < 3; i++) { companies[i] = new SharedBikeCompany(companyNames[i]); // 为每个公司初始化5辆单车 for (int j = 1; j <= 5; j++) { SharedBike bike = new SharedBike(j, companyNames[i] + "No." + j); companies[i].addBike(bike); } } } // 获取公司列表 public SharedBikeCompany[] getCompanies() { return companies; } } ``` #### 3. **初始化测试** ```java public class Main { public static void main(String[] args) { SharedBikeMgr mgr = new SharedBikeMgr(); mgr.initial(); // 验证初始化结果 for (SharedBikeCompany company : mgr.getCompanies()) { System.out.println("公司: " + company.getCompanyName()); System.out.println("单车数量: " + company.getBikeCount()); for (SharedBike bike : company.getBikes()) { System.out.println(" |-- 单车ID: " + bike.getBikeId() + ", 名称: " + bike.getBikeName() + ", 状态: " + (bike.getStatus()==0 ? "可借" : "已借出")); } } } } ``` #### 4. **输出示例** ``` 公司: ofo单车 单车数量: 5 |-- 单车ID: 1, 名称: ofo单车No.1, 状态: 可借 |-- 单车ID: 2, 名称: ofo单车No.2, 状态: 可借 ... 公司: 摩拜单车 单车数量: 5 ... ``` ### 计说明 1. **封装性** - 每个类封装自身属性和行为(如`SharedBike`管理单车状态) - 通过Getter/Setter控制访问权限 2. **组合关系** - 公司包含单车列表:`SharedBikeCompany`聚合`List<SharedBike>` - 管理器包含公司数组:`SharedBikeMgr`聚合`SharedBikeCompany[]` 3. **初始化逻辑** - `initial()`方法实现一键初始化 - 单车ID按公司独立编号(各公司从1开始) - 状态默认置为可借($ \text{status}=0 $) 此计符合面向对象原则,后续可扩展实现`BikeDao`接口中的借还车等功能[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值