新工做總結之權限系統設計


    項目概述:  java

      複雜東西簡單化。
      細節上有不少不足之處,如今用的是mysql,以前用的一直是oracle,也都是看一些怎樣提升查詢效率,好比寫存過,函數、遞歸查詢、索引,避免全表掃描的之類的東西。忽略了好比字段類型這些小細節。問題表以下:

首先eddie問我 主鍵int(10) 和int 有什麼區別,由於以前一直用oracle Number(10)覺得 就是10個長度,sb了吧,mysql 數據庫  好比 int(3) zerofill,你插入到數據庫裏的是10,則實際插入爲010,也就是在前面補充加了一個0.若是int(3)int(10)不加zerofill,則它們沒有什麼區別.M不是用來限制int個數的.int(M)的最大值和最小值與undesigned有關,
注意:這裏的M表明的並非存儲在數據庫中的具體的長度,之前老是會誤覺得int(3)只能存儲3個長度的數字,int(11)就會存儲11個長度的數字,這是大錯特錯的。
又被問之 varchar(50) 和 char(50)  有什麼區別?用於什麼樣類型的字段?.....之前學的東西都忘光啦.......
 
varchar
一、使用比固定長度類型(char)佔用更少存儲空間(除了使用ROW_FORMAT=FIXED建立的MyISAM表)
二、使用額外的1-2字節來存儲值長度,列長度<=255使用1字節保存,其它狀況使用2字節保存。例如varchar(10)會佔用11字節存儲空間,varchar(500)會佔用502字節存儲空間
三、節約空間,因此性能會有幫助。在更新的時候會產生額外的工做。
四、5.0以上版本,取值或設置值都會保存字符串末尾的空格,4.1以前的版本都會把字符串末尾的空格刪除掉
五、最大長度遠大於平均長度,不多發生更新的時候適合使用varchar,由於碎片更少了

char
一、使用固定長度
二、保存的時候會去掉字符串末尾的空格
三、適合保存MD5後的哈希值或常常改變的值,由於固定的行不容易產生碎片 

之後在設計數據庫的時候得用點心,不管作啥子事只要用心就會和別人作的不同。
好了以上是設計數據庫暴露的問題。
下面說一下本系統新的思想:
一、權限控制二進制存儲 校驗 方法,之前也據說過,可是沒有在實際項目中運用,此次真刀實槍的用上了。
二、基於單點登陸的部分思想之  token 校驗。這個也是聽的我一頭霧水,得細細研究一番。沒研究明白不貼代碼了。
下面是 
權限控制 二進制 存儲校驗部分測試代碼,本身整理的,有詳細的註釋:

mysql

package com.baojia.test;
import java.util.Random;
/**
 * 測試2進制存儲權限點驗證
 * Long 最大存儲量爲            2的63次方-1     (1L<<63)-1=9223372036854775807   
 * 爲了方便 最大存儲  (1L<<62) =  4611686018427387904  
 * @author qpx
 *
 */
public class TestBinaryPms {
/** 
     * @param args 
     */  
    public static void main(String[] args) {   
    int length = 62;
    int begin = 0;
    int end = 50;
   
    System.out.println((1L<<62));
   
   
    /**定義menuId數組  有62個菜單  menuId表示爲  1-62 ***/
    Long [] a = new Long[length];
    for(int i = 0;i<length;i++){
    a[i] = (1L<<i);
    System.out.println(i+":"+ a[i]);
    }
        Long userA = 1L<<1;  //用戶A權限點
        Long userB = 1L<<50; //用戶B權限點
       
        for(int i = 0;i<length;i++){
         //userA 有1-50(包含50) 之間的menuId權限訪問  用|運算  至關於   (1,2,3,4,5,6,8.....50)
        if(i>begin && i<=end){
            userA = userA|a[i];      
        }
        //userA 有51-62(包含62) 之間的menuId權限訪問用|運算  至關於   (51,52,53,54......62)
        if(i>end && i<=length){
           userB = userB|a[i];
        }
    }
        
        System.out.println("用戶A的權限:"+userA);
        System.out.println("用戶b的權限:"+userB);
       /**模擬用戶請求過來的一個菜單id  這裏用隨機數表示**/
        Random rand = new Random();
        int c = rand.nextInt(length-1)+1;
        System.out.println("隨機數 c:"+ c);
        Long d = 1L<<c;//把請求的菜單id先進行 <<運算
        System.out.println("隨機菜單 d:"+ d);
        
        setUserA(userA, d,false);  
        setUserB(userB, d,false);  
    }
private static void setUserB(Long userB, Long d,boolean r) {
if(r){
//給  userB 添加權限D 至關於 new StringBuffer().append(",").append(d);
userB = userB | d; 
}
/** 
         * 判斷 userB 有無權限 則用 & 運算 至關於   new ArrayList.contains(d)
         */  
        if ((userB & d) == d) {  
         System.out.printf("(userB & d) == d :  userB有隨機菜單 d:%s 的菜單訪問權限\n",d);  
        } else {  
        System.out.printf("(userB & d) == d :  userB 沒有隨機菜單 d:%s 的菜單訪問權限\n",d); 
            System.out.println(" userB 添加隨機菜單 d 訪問權限................"); 
            setUserB(userB, d,true);  
        }
}
private static void setUserA(Long userA, Long d,boolean r) {
if(r){
//給  userA 添加權限d 至關於 new StringBuffer().append(",").append(d);
       userA = userA | d;  
}
/** 
         * 判斷 userA 有無權限 則用 & 運算 至關於   new ArrayList.contains(d)
         */  
        if ((userA & d) == d) {  
            System.out.printf("(userA & d) == d :  userA有隨機菜單 d:%s 的菜單訪問權限\n",d);  
        } else {  
            System.out.printf("(userA & d) == d :  userA沒有隨機菜單 d:%s 的菜單訪問權限\n",d);  
            System.out.println(" 給 userA 添加隨機菜單 d的訪問權限................");  
            setUserA(userA, d,true);  
        }
}  
}


與之共勉!sql

相關文章
相關標籤/搜索