android用户特权管理思路

来源:互联网 发布:手机淘宝如何看买家秀 编辑:程序博客网 时间:2024/06/11 20:31

前言

项目背景

用户固有属性:

  • 用户id
  • username
  • 联系方式
  • 等等

app需要获取的用户的:

  1. 用户组,用户具有组权利;
  2. 用户在所在组的岗位,岗位类型很多,用户具有岗位权利,不同组不同岗位权利不同;
  3. 用户特权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

某用户个性化特权可能为:a,c,g,x,y
则唯一识别码为: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;}}
2 0
原创粉丝点击