android用户特权管理思路
2016-01-08 16:20
603 查看
前言
项目背景
用户固有属性:用户id
username
联系方式
等等
app需要获取的用户的:
用户组,用户具有组权利;
用户在所在组的岗位,岗位类型很多,用户具有岗位权利,不同组不同岗位权利不同;
用户特权Vip,电话服务等等很多,有些特权是固有的,有些是付费购买的;
注意:一个用户可以在不同用户组担任职务。
项目简要流程
用户登录→之后显示用户所拥有的权利。不具有的权利不能显示分析:
1,2两项权利都是根据岗位及所在组所与生俱有的。 第3项是个性化定制的。
用户权利可以分为两大类:
①:打包特权,即特权包(里面有一些权利)类似于:套餐
②:单个的特权,个性化定制的特权,组合较为灵活。类似于:自由组合
而现在的用户权利是由①+②组成的,而且更要命的是:一个用户可以有多个套餐再加上N个自由组合。这样一个权利体系就很复杂了。即:
特权=(套餐x+套餐y+...)+(个性化特权x+个性化特权y+....)
用户的各项权利,后台都有存储。
项目中的问题与解决方案
现在的问题是,后台的这些权利,前台怎样获取?
方案一:在登录的同时,获取用户的所有权利,当然,数据量相当大。具有很大的缺点,而且不利于分离出用户权利。方案二:将用户所在组特权,岗位特权,包特权(xx级别会员),个性特权分别生成一个唯一识别码。当然如果量不太大的话你也可以将这些唯一识别码合并成一个。
解决方案详解
解决方案示例图在线查看地址
唯一识别码怎么定义?
首先规定这个识别码是数值型的。
先说说“用户个性化自由组合特权”的唯一标识码
CP(Custom Privilege):用户个性化自由组合特权;单种特权类型多,并且一个用户可以购买多个特权;个性化特权,姑且假设有31个,如果再多,你再添加位或者再来一个识别码
32位的int值 | 0111 1111 | … | …. | 1111 1111 |
---|---|---|---|---|
特权名称 | a,b,c,d,e,f,g | … | … | s,t,u,v,w,x,y,z |
则唯一识别码为:0101 0001 0000 0000 0000 0000 0000 0110
用十进制表示则为:1358954502
用十六进制表示则为:51000006
二进制转换成十进制,在转换成十六进制很简单,代码如下:
String binary="01010001000000000000000000000110"; Integer.parseInt(binary,2));//转成二进制 Integer.toHexString(Integer.parseInt(binary,2));//转成16进制
我个人觉得后台返回这个唯一识别码时返回十六进制比较好。
再说说,“用户套餐自由组合特权”的唯一标识码”
这里我们定义以下几个特权套餐(特权包):tcGROUP:组权利套餐(特权包);组的种类很多,并且一个用户可以分属不同的组;
tcJOB:岗位权利套餐(特权包);岗位种类很多,并且一个用户可以兼任多个岗位
tcVIP:用户订购的特权包;VIP套餐种类很多,并且一个用户可以购买多个类型的VIP套餐
仿照CP(Custom Privilege)生成唯一识别码的方式:
分别产生唯一识别码:tcGROUP,tcJOB,tcVIP
之所以使用十六进制标识唯一识别码,是因为这样的识别码比较短,也方便理解。
代码用法
下面的这些代码怎么用?我们在做应用的时候,针对不同的用户展示不同的功能(特权)。比如说:用户A具有如下具有x特权,我就把x特权显示出了,不具有x特权,我就不显示该功能(特权)。我们从后台获取了,几个唯一识别码,之后分别用唯一识别码创建MyGroup对象,MyJob对象….,然后在用这些对象创建User对象。如果我们想要确认一下该user是否购买了CustomPrivilege.PLAYTOGETHER这个特权,这时我们可以这样判断:
boolean whichCustomPrivilege = user.whichCustomPrivilege(CustomPrivilege.PLAYTOGETHER);//这个返回值会告诉我们用户是否具购买PLAYTOGETHER;
下面上代码:
代码的具体实现
以下代码,为方便起见,你可以向上抽取一下;用户类:
package com.cis.test; public class User { // 所属的组 private MyGroup groups; // 所具有的工作岗位; private MyJob jobs; // 所购买的VIP套餐 private MyVIP vip; // 所具有的个性化权利自由组合包 private CustomPrivilege customPrivilege; public User(MyGroup groups, MyJob jobs, MyVIP vip, CustomPrivilege customPrivilege) { super(); this.groups = groups; this.jobs = jobs; this.vip = vip; this.customPrivilege = customPrivilege; } /** * * @param groupRigthCode * 具体的组名(数字表示) * @return 在这个组中就返回true */ public boolean whichGroup(int groupRigthCode) { return groups.haveRight(groupRigthCode); } /** * * @param vipRigthCode * VIP套餐名称(用数字表示) * @return 用户购买了该VIP套餐就返回true; */ public boolean whichVIP(int vipRigthCode) { return vip.haveRight(vipRigthCode); } /** * * @param jobRightCode * 具体工作名(用数字表示) * @return 包含这个岗位就返回true */ public boolean whichJob(int jobRightCode) { return jobs.haveRight(jobRightCode); } /** * * @param cpRightCode * 特权名称(用数字表示) * @return 购买了该项特权就返回true */ public boolean whichCustomPrivilege(int cpRightCode) { return customPrivilege.haveRight(cpRightCode); } public MyGroup getGroups() { return groups; } public void setGroups(MyGroup groups) { this.groups = groups; } public MyJob getJobs() { return jobs; } public void setJobs(MyJob jobs) { this.jobs = jobs; } public CustomPrivilege getCustomPrivilege() { return customPrivilege; } public void setCustomPrivilege(CustomPrivilege customPrivilege) { this.customPrivilege = customPrivilege; } }
用户所在的组类
package com.cis.test; public class MyGroup { // 我先写几个假设的组名称,组名称意味着组特权哦! public static final int BAIDU = 1; public static final int ALIBABA = 1 << 1; public static final int TECENT = 1 << 2; // 先写这么多....... // 用户所在组的唯一识别码 private int groupUniqueCode; public MyGroup(int groupUniqueCode) { super(); this.groupUniqueCode = groupUniqueCode; } /** * 判断用户是否在某个组 * * @param groupRigthCode * 传入上面的那几个字段 * @return */ public boolean haveRight(int groupRigthCode) { return (groupRigthCode & groupRigthCode) != 0; } public int getGroupUniqueCode() { return groupUniqueCode; } public void setGroupUniqueCode(int groupUniqueCode) { this.groupUniqueCode = groupUniqueCode; } }
工作岗位类
package com.cis.test; public class MyJob { // 写几个岗位,不同的岗位意味着不同的岗位权利套餐包哦! public final static int CEO = 1; public final static int CFO = 1 << 1; public final static int CGO = 1 << 2; public final static int CHO = 1 << 3; // 先写这么多.... // 岗位唯一识别码 private int jobUniqueCode; public MyJob(int jobUniqueCode) { super(); this.jobUniqueCode = jobUniqueCode; } /*** * * @param jobRightCode * @return */ public boolean haveRight(int jobRightCode) { return (jobRightCode & jobRightCode) != 0; } public int getJobUniqueCode() { return jobUniqueCode; } public void setJobUniqueCode(int jobUniqueCode) { this.jobUniqueCode = jobUniqueCode; } }
用户VIP套餐类
package com.cis.test; public class MyVIP { // 写几个自由选购的VIP特权包 public final int BASIC_VIP = 1; public final int SEMI_VIP = 1 << 1; public final int ADVANCE_VIP = 1 << 2; //先写这么多.... //vip的唯一识别码 private int vipUnique; public MyVIP(int vipUnique) { super(); this.vipUnique = vipUnique; } /** * 判断是否购买某一个vip包 * @param vipRigthCode * @return */ public boolean haveRight(int vipRigthCode) { return (vipUnique&vipRigthCode)!=0; } public int getVipUnique() { return vipUnique; } public void setVipUnique(int vipUnique) { this.vipUnique = vipUnique; } }
用户自由定制特权类
package com.cis.test; public class CustomPrivilege { // 写几个私密特权 public final static int CHAT = 1; public final static int GAME = 1 << 1; public final static int SLEEP = 1 << 2; public final static int PLAYTOGETHER = 1 << 3; // 先写这么多.... // 用户自由组合特权唯一识别码 private int customPrivilegeUnique; public CustomPrivilege(int customPrivilegeUnique) { super(); this.customPrivilegeUnique = customPrivilegeUnique; } /** * 判断是否具有上面的那几个权利 * * @param cpRightCode * 上面那几个字段 * @return */ public boolean haveRight(int cpRightCode) { return (customPrivilegeUnique & cpRightCode) != 0; } public int getCustomPrivilegeUnique() { return customPrivilegeUnique; } public void setCustomPrivilegeUnique(int customPrivilegeUnique) { this.customPrivilegeUnique = customPrivilegeUnique; } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories