3月11日——培訓第77天

ERP項目分析:

Enterprise planning resource

客戶關係、產品設計、生產管理、庫存管理、採購管理、委外管理、資金控制、財務系統、人力資源、
協同辦公、系統安全(日誌、系統備份等)

mysql -u root -p<ondemand1.sql

http://localhost:8080/erp/home/login.jsp

http://localhost:8080/erp/main/index1.jsp

10個模塊對應工程中的10個目錄,主頁面分爲上中下三個幀,10個模塊的主要區別就是中間那個幀
不一樣,

body-unload事件可以把用戶離開這個頁面的行爲捕捉到,保證整個頁面始終是這個系統,中間
這個幀的更換由ajax來做。一旦頁面變了,就會被body-unload捕捉到。

監聽器來監聽application和session。

如果一個用戶已經登錄,但是沒有符合的權限,那麼有一些頁面也是不可以訪問的!爲了防止走後門
(直接從瀏覽器中輸入地址),比如訪問了一個路徑,這個路徑得先判斷用戶是否具備了訪問這個路徑
的權限。用了一個自定義標籤來實現,名字是checkLogon


所有客戶檔案登記部分的頁面都是以“register”開頭的,其他部分的頁面也是類似。這就可以通過
正則表達式來驗證哪些頁面可以被特定權限的用戶所訪問

比如擁有登記權限,那麼以“register”開頭的頁面都可以訪問,其他的模塊也是類似……

Tree表,相當於左邊的菜單欄的樹狀結構,如果菜單屬於CRM模塊,那麼對應的表叫做CRM_tree,
通過一個表來生成樹狀信息!這個表甚至包括了每個葉節點的對應url,CRM_AllRight是用戶
具備哪些權限,根據這個權限去CRM_tree表去找哪些樹狀列表的節點應該被當前用戶顯示出來。

對於樹狀菜單列表生成的問題,數據庫設計需要注意什麼問題呢?
首先得有itemId,還得有parentId,如果parentId是0的話那麼就是一級菜單
對每個一級菜單進行for循環,然後通過select語句得到每一個一級菜單的直接子菜單,
然後再對二級菜單這麼同樣的for循環,裏面還是用select這麼處理。

一般都不這麼做,性能上太差了……如果第一級的話,是001、002、003………………
第二級的話是第一級加上001、002、003………………也就是001001、001002、001003…………
同理,第三級的菜單號也類似來制定

然後select ………… order by id
一次就可以把這些都選出來了。而且是按照順序出來的。然後根據這些id的length
來控制縮進,按照排列順序直接就把這些菜單全顯示出來了

插入id的時候,先找父id號,然後再找父id號對應的子id最大的號加上1就可以了,當然
這裏稍微會麻煩一點。

=======================================================================

上午內容總結一下,還有安裝時候出現的一些小問題:

conf裏面的web.xml裏面的默認servlet配置的listings設置爲false的話,那麼如果文件夾
裏面沒有歡迎頁面的話,就不會將資源全部列出來,而是顯示錯誤信息。

恩信ERP針對於各種不同的用戶級別,看到的功能也不同,而且必須是公司的員工才能夠使用這個系統,
也就是信息必須先錄入這個系統(也就是檔案錄入,一般勞資的幹事將這個信息錄入)。檔案錄入員進入
恩信ERP系統的時候應該只能看到人力資源這一選項。然後在左邊的人力資源檔案管理中的人力資源檔案
登記這裏可以將信息存檔。當然只是將檔案存進來了而已,並不意味着這個被存入的員工就可以使用這個
系統了,還需要另外一個人在人力資源檔案複覈裏面令其通過,這時員工纔是真正進入了這個公司,但是
這時候由於沒有權限,所以還是不能使用系統,還需要系統管理員分配權限。首先系統管理員在用戶許可證
管理這裏點擊“許可證發放”,來授予權限,點擊發放按鈕,然後可以在下拉列表框裏面選擇各個模塊以及
對應的權限,然後會生成許可證號碼,這時這個員工就有了相應的權限了。

然後該員工可以註冊,這時需要使用剛纔生成的那個許可證號,這個號碼每個人只有1個,表明每個人的
權限都是唯一的。然後就可以登錄了。登錄後就可以看到僅僅有給予的菜單而已。

==============================================================================

上面是整體說了一下業務流程,下面從編程的角度說一下吧:

從人力資源檔案登記開始,這主要用到數據庫裏面的hr_file表,其中的LICENSE_TAG字段用於說明
該用戶是否被頒發了許可證。
還有一個表hr_file_dig表,人力資源檔案不可能一成不變的。變更前的信息就保存在這個表裏面。就是
一個備份的作用,兩個表的字段結構完全是一模一樣。

人力資源檔案變更的時候就要用到這個備份表,前一次變更的結果,將會保存在dig表中。

人力資源裏面有個客戶化的設置用來實現個性化的應用。
實際項目開發中需要注意一些問題,比如前端的javascript對合法性的驗證,還要小心重複提交的
問題,比如利用後退回到前一個提交頁面,然後再次提交,這是不能容許的,一般這種防止重複提交
是通過session實現,在表單裏面有個字符串,session裏面也放一個字符串,過濾器會比較這兩個
字符串,提交的時候session迅速改變session裏面的字符串,由於後退的頁面不會進行刷新,所以
頁面中的字符串不會改變,再次提交的時候就和session中的字符串對不上了。

複覈通過就是通過更改登記表中的信息並且將其中的一個標誌位設爲1而實現的。

檔案刪除管理:其中有一個臨時刪除和永久刪除的問題,可以通過在數據表中設置一個字段(標誌位)
   來實現,爲0的時候是沒有刪除,1是臨時刪除,徹底刪除的話就把記錄徹底刪了就成了。

許可證發放:涉及到security_license表:

用戶許可證發放的主界面(列出各個主菜單和子菜單的界面)其實是和左邊的樹形菜單一個意思,也是
把它們都讀出來,但是隻不過樹形菜單是通過javascript隱藏了子菜單而已。

設置好用戶權限後,這些權限的信息是保存在design_allright表裏面的。

許可證也是可以吊銷的。許可證號碼是採用1到9和A到Z的這些字符,每次隨機生成五位就可以了。
通過時間值轉換成mysql裏面的md5就可以轉換成爲一個隨機的串了,然後你再截取就成了,
具體可以參看javaWeb那本書裏面的講述。md5函數的特點就是哪怕輸入的有1個比特的變化,那麼
返回的值都是大相徑庭的。

當然還有別的方法生成隨機數,比如我將1到9這些數字和A到Z這些字符統一拼裝成一個字符串,然後
每次使用隨機數製造一個整數,這個整數是多少那麼就從這個字符串取出第幾位,就這樣來循環生成
一個許可證號了(保證這個號裏面只有1到9或A到Z這些字符)

//這裏注意codes字符數組其實就是base64Code字符串轉化成爲字符數組的形式。
char codes[] = {'0','1',……'z'}
String base64Code="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/+";
byte[] buf = {78,79,23,45,66};//字節數組,裏面有五個字節

base64Code.charAt((buf[0] >>> 2));
codes[(buf[0] >>> 2)]

(buf[0] >>> 2)是1個字節中的前6個比特的數據,由於2的6次方正好是64,這樣(buf[0] >>> 2)必然
是0到63中的其中一個,那麼既然base64Code中的字符個數正好是64的話,那麼正好可以運用這個辦法找
出隨機數。

===================================================================================
在java中java.security裏面MessageDigest類就是java程序裏面的md5實現!
MessageDigest md = MessageDigest.getInstance("MD5");
然後md.digest(byte[] input)就可以返回md5函數返回的值了。

比如

String hex = "0123456789abcdef";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5Codes = md.digest("hello world itcast".getBytes());
StringBuffer sbf = new StringBuffer() ;
for(int i = 0 ; i < md5Codes.length ; i++)
{
 sbf.appand(hex.charAt((md5Codes[i]>>>4)));
 //注意md5Codes[i]>>>4是提取出高四位
 sbf.append(hex.charAt((md5Codes[i]&0x0f))) ;
 //這就是取出低四位了!
}
System.out.println(sbf.toString());
//這就輸出了字節數組經過md5轉換後,得到的新字符串了!

===============================================================================

目錄樹:

<style>
 a {text-decoration=none;} //樣式表定義超鏈接沒有下劃線
</style>

<script>
 function showHide(id)
 {
  if(document.getElementById(id).style.display == "none")
  {
   document.getElementById(id).style.display = "block" ;
  }
  else
  {
   document.getElementById(id).style.display = "none"
  }
 }
</script>

<span><a href="javascript:showHide('parentmenu1')">parentmenu1</a></span>

<ul id="parentmenu1" style="display:none">
 <li>submenu1</li>
 <li>submenu2</li>
 <li>submenu3</li>
</ul>

報警:有兩種情況,一種是作爲錯誤,一種是不作爲錯誤;
前者的例子是比如就允許採購5個商品,你採購第六個的時候就出現錯誤,這就是作爲錯誤。
後者的例子是比如你一個月沒有登錄系統的話,用戶id會有被註銷的危險,每次啓動應用程序
 的時候,用監聽器來掃描數據庫中超過1個月沒有登錄的用戶,並將其列入黑名單中,
 這就是屬於不作爲錯誤。

作爲錯誤是可以即時檢查出來的,錯誤出現就立即檢出出來並給出提示,但是不作爲錯誤只能
靠系統通過諸如定時器等手段來捕捉,不具備即時性。

 

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章