自定義字段的設計與實現(Java實用版)


前言
自定義字段又叫做“開放模型”,用戶可以根據自已的需求,添加需要的字段,實現個性化定制。
使用自定義字段的目的,使用自定義字段解決哪些問題
如現有一套CRM系統,客戶模塊中客戶信息,需要實現不同行業,不同業態都可以個性化需求。那我們知道客戶信息表T_CUSTOM,如姓名,性別,電話
等基本通用屬性是可以通用的,但如葯療行業客戶需要記錄體重,血壓等,而運輸行業的客戶更關注貨物品類,產量等,而又如快速消費品行業關注客戶的愛好,年齡,星座啊,這些問題該如何處理呢?
自定義字段的設計與實現
a、相關數據庫表說明
自定義模板表:T_CUSTOM_FIELD_TEMPLATE
客戶信息表:T_CUSTOM
業態行業類型與自定模板對應用表:T_BUSINISS_TEMPLATE
注:T_BUSINISS_TEMPLATE不同的業態、行業類型對應不同的自定義模板

b、相關數據庫表結構說明
1
自定義模板表:T_CUSTOM_FIELD_TEMPLATE


注:模板內容如下

[{"label":"貨品名稱","fieldName":"productName","type":"textfield","required":true,"sequence":1,"rows":3,"minLength":5,"maxLength":20,"vtype":"none","vtypeContent":"","vtypeText":"","defaultValue":"apple Mac","readOnly":false},{"label":"產量","fieldName":"turnout","type":"numberfield","required":true,"sequence":2,"minValue":5,"maxValue":20,"decimalPrecision":2,"defaultValue":20000,"readOnly":false},{"label":"愛好","fieldName":"loves","type":"combobox","required":false,"sequence":4,"singleOption":[{"itemValue":"1","itemName":"看書"},{"itemValue":"2","itemName":"羽毛球"}],"defaultValue":"1"}]
1

 


運輸行業擴展模板


自定義字段的類型有,文本框、數字框、日期框、單選框、多選框
新增文本框類型的自定義字段

新增數字框類型的自定義字段

新增日期框類型的自定義字段

新增單選框框類型的自定義字段

新增多選框類型的自定義字段的界面可以參考單選框界面。

看到這里,有一定基礎的同志們肯定會有豁然開朗的感覺。
數據庫表中數據如下:

醫療行業新增用戶界面

快消行業新增用戶界面

運輸行業新增用戶界面

點新增客戶按鈕后,會根據用當前的不同業態自動加載不同的自定義模板,在界面顯示不同的業務自定義字段。
d、涉及相關知識點的剖析和處理
• 新增不同的自定義字段保存到自定義模板中

//獲取post請求的所有參數以及參數對應的值
Map<String, String[]> params = request.getParameterMap(); 
JSONObject jsonObject = new JSONObject();
for (String key : params.keySet()) { 
String[] values = params.get(key); 
for (int i = 0; i < values.length; i++) { 
String value = values[i]; 
jsonObject.put(key, value);
} 
} 
String content = jsonObject.toString();

  


用上面的代碼,新增不同的自定義字段在后台就可以統一處理了,然后將自定義字段的JSON拼裝起來。
• 新增用戶時,在后台獲取到模板內容,擴展字段怎么顯示在前台新增頁面。

后台代碼如下:

String content = customFieldTemplate.getContent();
request.setAttribute("content", content);

  



在頁面動態加載自定義模板,頁面代碼如下:

<div id="customFieldDiv" class="easyui-panel" title="自定義字段"
style="width:96%;height:200px;padding:5px;">
</div>
var dataStr = '${content}';

var jsondatas=eval("("+dataStr+")"); 
var resultHtml = "";
$.each(jsondatas,function(i,n){ 
if(n.sequence == (i + 1)){
resultHtml = resultHtml + '<table class="table" style="width: 100%;">';
if(n.type == 'textfield'){
resultHtml = resultHtml + '<tr><td><input labelAlign="right" labelWidth="100px;" label="'+n.label+'" style="width:300px;" type="text" name="'+n.fieldName+'" value="'+n.defaultValue+'" class="easyui-textbox" data-options="required:'+n.required+'"/></td></tr>';
}else if(n.type == 'numberfield'){
resultHtml = resultHtml + '<tr><td><input labelAlign="right" labelWidth="100px;" label="'+n.label+'" style="width:300px;" type="text" name="'+n.fieldName+'" value="'+n.defaultValue+'" class="easyui-numberbox" data-options="required:'+n.required+',min:'+n.minValue+',precision:'+n.decimalPrecision+'"/></td></tr>';
}else if(n.type == 'datetime'){
resultHtml = resultHtml + '<tr><td><input labelAlign="right" labelWidth="100px;" label="'+n.label+'" style="width:300px;" type="text" name="'+n.fieldName+'" value="'+n.defaultValue+'" class="easyui-datebox" data-options="required:'+n.required+',min:'+n.minValue+'"/></td></tr>';
}else if(n.type == 'combobox'){
resultHtml = resultHtml + '<tr><td><select labelAlign="right" labelWidth="100px;" label="'+n.label+'" style="width:300px;" name="'+n.fieldName+'" class="easyui-combobox" data-options="required:'+n.required+'">';
$.each(n.singleOption,function(j,m){ 
resultHtml = resultHtml + '<option value="'+m.itemValue+'">'+m.itemName+'</option>';
});
resultHtml = resultHtml + '</select>';
resultHtml = resultHtml + '</td></tr>';
}

resultHtml = resultHtml + '</table>';
}
}); 
$('#customFieldDiv').append(resultHtml);


小結
自定義字段的另一種解決方案EAV(Entity-Attribute-Value),大家可以百度。
自定義模板內容和客戶表中的護展字段模板數據都是大文本類型(longtext), mysql5.7 支持json,可以將這兩個字段改為json類型。另外hibernate映射數據庫中的json字段解決方案可以參考http://blog.csdn.net/qian_meng/article/details/48394379。通過上面兩點可以對系統進行進一步的優化。
自定義字段的類型,除文本框、數字框、日期框、單選框、多選框外還可以添加圖片、聲音、視頻等其他類型。
自定義字段數量很多時,又類型不同,怎樣布局,使用頁面更美觀、舒服也有一定難度。
————————————————
版權聲明:本文為CSDN博主「蔚藍色天空sky」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ytangdigl/java/article/details/70145910


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM