一.問題
現在很多web服務,都是前端展現與后端數據放在不同的內部服務器上。其結構為
1.那些數據可以在html,js中存在
a.為了安全性,避免隱私數據存在
b.如果僅僅為了保存一些數據,然后在互動的時候使用,該不該存在?如果不保存這個數據,那么必須到后台去取。
2.那些數據可以在業務邏輯,即前端網站的后台存在?
那些數據會需要暫存到前端的后台嗎?
我覺得一些不會更改的,數據字典類型的數據可以暫存到前端,應該這個數據是基本永遠不會變的,而僅僅對數據起到解釋的作用,
a.比如數據表中的字段在界面應該顯示為什么名字等等,
b.有多少個類型的對象,對象可以變,對象類型不會變
c.或者使用memcache,讓它自動的優化那些該臨時存放。
這些數據通用(使用次數多),不變,不易展示於html與js里面(能被瀏覽器直接看到),所以放到前端站點的后台。
3.數據服務的數據是什么
一般是基於數據庫提供json的數據傳輸。
二.標准化做法
1.前台的數據表格:
a.采用bootstrap-table,查詢為form的ajax查詢的刷新數據。服務端分頁(加載數據量為一個頁面的數據,翻頁要請求后台),
b.表格的標題顯示:表格標題就直接寫在html中,寫在后台沒有必要,這個是很難標准化的。
c.表格內容顯示:這個涉及數據字典,查詢出來的是數據庫里面的數據,有時候需要將里面的數據轉化一下,比如某個狀態的英文字轉為中文表示。轉化如果發生的在后台,就需要對查詢列表再次遍歷,然后轉化,增加了后台工作量;發生在前台,則計算壓力在js。(django里面有語言translate模塊,這里假設這種狀態轉化不能通過django里面翻譯模塊實現。因為同樣字符串在不同數據表里面代表不同意思,所以在前端展現也不一致。)
一般來說,在后台寫上數據字典,為了保持一致性,所以數據字典的定義可以在web應用中使用一個模塊定義,而頁面邏輯可以繼承該模塊,獲取所使用表格的數據字典。前台使用js函數轉化。數據字典的定義不必寫在前台,這樣前台的js轉化函數可以復用。不過客戶可以通過方法看到原始數據庫里面的數據。
后台,給數據結構傳遞給context,並且傳遞tablename 的字符串,設置為bootstrap-table的table標簽 id,以及組合成查詢條件form 的id;這樣就會使得代碼極度復用。
def data_define(): table_dict={ "table1":{ "field1":{ "normal":"正常", "error":"異常", } }, "table2":{ "field1":{ "good":"好", "bad":"壞" } } } return table_dict
前台引用該數據結構解釋某個字段
function translate_field(value,row){ current_table={{ table_dict.tablename }} field_def=current_table[this.field] return field_def[value] }
二.web應用
web應用包括前台界面以及后台頁面處理,部分業務處理,以及需要向后台發送api應用發送請求
a.html以及后台頁面處理:html頁面功能為展現,前端驗證用戶輸入,根據狀態決定控制邏輯。后台直接處理該頁面請求的函數,應該只涉及前台頁面輸入驗證,或者查詢其他模塊請求獲取用於展示的數據。不要寫可能會被復用的處理邏輯,不要寫別的系統性的體系中的零件。直接在這塊里面寫復雜邏輯會使得代碼分散,比如價格控制,此類邏輯應該用一個專門的模塊來處理,而非分散在各個頁面處理代碼中。由於價格控制是一個整體,而且很可能體系會進行變換,分散的代碼將使得維護變得困難。
b.請求api的數據:為了使得程序更加分布式,向數據庫處理的應用是獨立的,高性能的。部署在集群當中。web應用向api請求數據。我覺得應該就api的每個接口都統一寫成函數調用。而不是,每次請求api就需要自己寫一個url請求的代碼。然后判斷返回值之類的。因為這類的請求會多次發生,會被前端url直接調用,也可能被web的后台調用。所以寫成函數,大家都能夠很方便調用,不容易出錯。
c.ajax請求處理:所有ajax請求都會對接收到的反饋進行處理,而對錯誤也進行反饋。如果希望所有處理保持一致,那么對於success的ajax請求應該使用建立單獨的函數提供每次success調用;同樣error處理相同。這樣希望替換某種出錯處理提示內容樣式,不需要去每個ajax請求中尋找,只需要更改單獨的函數。基本每個出錯提示信息顯示樣式都相同,不同只是文字內容。
d.模塊獨立可運行,獨立可測試:多個模塊的程序組合的情況下,在web中,需要調用其他web應用的接口什么的,為了保證自己的模塊獨立可測試,在引用其他模塊的時候,加上try 再import,否則程序引用一多,很可能程序上線組合完成,再調試不了。因為可能東西揉合在一塊了,必須保證單獨模塊的獨立可運行。獨立可測試。