11.BDF2-PROFILE

2023-07-03 17:33 更新
BDF2-PROFILE模塊提供了一個(gè)允許管理員對(duì)系統(tǒng)當(dāng)中頁(yè)面組件的顯示進(jìn)行個(gè)性化定制的功能。對(duì)于這種組件的個(gè)性化定制,管理可以將其施加給某個(gè)用戶、某個(gè)部門(mén)或某個(gè)公司等,一旦對(duì)目標(biāo)群體(用戶、部門(mén)或者公司)施加了個(gè)性化定制功能,那么隸屬于這個(gè)用戶、部門(mén)或者公司的人登錄系統(tǒng)之后就可以看到這個(gè)頁(yè)面被管理員修改后的效果,接下來(lái)們舉個(gè)例子來(lái)說(shuō)明這個(gè)功能的適用場(chǎng)景。

假如我們需要開(kāi)發(fā)一個(gè)系統(tǒng),這個(gè)系統(tǒng)將以SAAS模式給不同的公司去使用,但對(duì)于某一些功能頁(yè)面,不同的公司對(duì)頁(yè)面顯示效果要求可能也略有不同,比如某個(gè)業(yè)務(wù)系統(tǒng)維護(hù)頁(yè)面,某些公司可能其中的一個(gè)表單中字段A、B、C的顯示順序?yàn)锳、B、C,但有些公司可能因?yàn)槟承┰蛳M麑㈨樞蚋某葿、C、A,對(duì)于這樣一種需求,因?yàn)閮杉夜玖?xí)慣不同,對(duì)頁(yè)面的顯示要求也不相同,但這么一點(diǎn)不同又不值得我們專門(mén)開(kāi)發(fā)一個(gè)頁(yè)面特地給這家公司使用,這個(gè)時(shí)候就可以利用BDF2-PROFILE模塊輕松解決這個(gè)問(wèn)題。當(dāng)然,BDF2-PROFILE模塊能個(gè)性化的功能不僅僅是表單元素或表格列的顯示順序,它幾乎可以實(shí)現(xiàn)所有的支持屬性及事件定義的組件個(gè)性化定制,比如針對(duì)不同的公司為某個(gè)Button設(shè)置不同的caption,或者針對(duì)不同公司為某個(gè)UpdataAction設(shè)置不同的保存前的確認(rèn)消息或保存成功之后的提示消息等。

要使用BDF2-PROFILE模塊,首先需要將BDF2-PROFILE模塊相關(guān)的jar放置到我們的項(xiàng)目當(dāng)中,具體做法就是可以到nexus.bsdn.org上下載BDF2-PROFILE模塊相關(guān)jar或到我們提供的在線項(xiàng)目向?qū)М?dāng)中,創(chuàng)建一個(gè)包含BDF2-PROFILE模塊的項(xiàng)目,當(dāng)然如果您采用的是Maven來(lái)管理我們的項(xiàng)目,那么只需要在我們項(xiàng)目的 pom.xml當(dāng)中添加下面的依賴信息即可。
BDF2-PROFILE模塊的依賴信息
<dependency>
 <groupId>com.bstek.bdf2</groupId>
 <artifactId>bdf2-profile</artifactId>
 <version>2.0.0</version>
</dependency>
添加完BDF2-PROFILE模塊所需要的jar之后,接下來(lái)還需要編寫(xiě)一個(gè)IProfileDataService接口實(shí)現(xiàn)類,并將其配置到Spring當(dāng)中,否則啟動(dòng)時(shí)會(huì)拋出下面的異常:
異常消息
Caused by: java.lang.RuntimeException: The current spring application context without a
[com.bstek.bdf2.profile.service.IProfileDataService] interface implementation
 at
com.bstek.bdf2.profile.view.component.ComponentMaintain.afterPropertiesSet(ComponentMaintain.java:
414)
 at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1545)
 at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1483)
 ... 23 more
我們來(lái)看看IProfileDataService接口實(shí)現(xiàn)類代碼:
IProfileDataService接口源碼
package com.bstek.bdf2.profile.service;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.bstek.bdf2.profile.model.AssignTarget;
import com.bstek.bdf2.profile.model.UrlDefinition;
import com.bstek.dorado.data.provider.Criteria;
import com.bstek.dorado.data.provider.Page;
/**
 * 使用profile模塊必須實(shí)現(xiàn)的接口
 * @author Jacky.gao
 * @since 2013-2-26
 */
public interface IProfileDataService {
 /**
 * 根據(jù)給出的父ID,返回其下所有子的URL,實(shí)現(xiàn)URL樹(shù)構(gòu)建
 * @param companyId 所在公司(或其它)的ID
 * @param parentId 父URL ID
 * @return 返回指定父ID的URL集合
 */
 List<UrlDefinition> loadUrls(String companyId,String parentId);
 /**
 * 分頁(yè)加載分配資源的目標(biāo)對(duì)象
 * @param page Dorado7分頁(yè)對(duì)象
 * @param criteria 過(guò)濾查詢對(duì)象
 */
 void loadAssignTargets(Page<AssignTarget> page,Criteria criteria);
 /**
 * 返回加載個(gè)性化信息需要使用的分配資源目標(biāo)對(duì)象的ID,比如username,companyid之
 * @return 一個(gè)字符串
 */
 String getAssignTargetId(HttpServletRequest request);
}
接下來(lái)我們編寫(xiě)一個(gè)IProfileDataService接口實(shí)現(xiàn)類,代碼如下:
IProfileDataService接口實(shí)現(xiàn)類源碼
package test;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.bstek.bdf2.core.context.ContextHolder;
import com.bstek.bdf2.core.model.Url;
import com.bstek.bdf2.core.view.url.UrlMaintain;
import com.bstek.bdf2.profile.model.AssignTarget;
import com.bstek.bdf2.profile.model.UrlDefinition;
import com.bstek.bdf2.profile.service.IProfileDataService;
import com.bstek.dorado.data.provider.Criteria;
import com.bstek.dorado.data.provider.Page;
@Component
public class TestProfileDataService implements IProfileDataService {
 @Autowired
 @Qualifier("bdf2.urlMaintain")
 private UrlMaintain urlMaintain;
 public List<UrlDefinition> loadUrls(String companyId,String parentId) {
 List<UrlDefinition> list=new ArrayList<UrlDefinition>();
 try {
 for(Url url:urlMaintain.loadUrls(parentId)){
 UrlDefinition def=new UrlDefinition();
 def.setId(url.getId());
 def.setUrl(url.getUrl());
 def.setName(url.getName());
 def.setParentId(parentId);
 list.add(def);
 }
 } catch (Exception e) {
 throw new RuntimeException(e);
 }
 return list;
 }
 public void loadAssignTargets(Page<AssignTarget> page, Criteria criteria) {
 List<AssignTarget> targets=new ArrayList<AssignTarget>();
 AssignTarget t1=new AssignTarget();
 t1.setId("root-bstek");
 t1.setName("上海銳道");
 targets.add(t1);
 
 AssignTarget t2=new AssignTarget();
 t2.setId("root-ibm");
 t2.setName("IBM中國(guó)");
 targets.add(t2);
 page.setEntities(targets);
 }
 public String getAssignTargetId(HttpServletRequest request) {
 return ContextHolder.getLoginUser()==null?null:ContextHolder.getLoginUser().getCompanyId();
 }
}
從實(shí)現(xiàn)類當(dāng)中可以看到,在第一個(gè)方法加載菜單時(shí),我們使用時(shí)BDF2-CORE模塊當(dāng)中加載菜單的類,實(shí)際應(yīng)用當(dāng)中,如果您項(xiàng)目當(dāng)中沒(méi)有CORE模塊,那么,您需要自己編寫(xiě)加載URL菜單的代碼;第二個(gè)方法加載需要分配個(gè)性化信息的目標(biāo)對(duì)象時(shí),我們虛擬了兩家公司,實(shí)際應(yīng)用當(dāng)中,可以是公司,也可以是部門(mén)、群組或者直接分給某個(gè)用戶;最后一個(gè)方法是系統(tǒng)在加載個(gè)性化信息時(shí)使用的,這里與前面對(duì)應(yīng)采用的是公司的ID。

實(shí)現(xiàn)類編寫(xiě)好并配置到Spring當(dāng)中之后,接下來(lái)啟動(dòng)我們的項(xiàng)目,瀏覽com.bstek.bdf2.profile.view.component.ComponentMaintain.d這個(gè)URL,可以看到如下圖所示的頁(yè)面效果:

可以看到,在選擇不同的公司后,對(duì)應(yīng)的URL菜單也會(huì)加載進(jìn)來(lái),在選擇不同的URL時(shí),這個(gè)URL對(duì)應(yīng)的頁(yè)面組件會(huì)被剖析成一棵樹(shù)形,在這棵樹(shù)當(dāng)中找到我們需要進(jìn)行個(gè)性化調(diào)整的組件,設(shè)置它的屬性、事件或其下子組件的順序。在做完這些操作之后,別忘記刷新系統(tǒng)緩存,否則將不會(huì)生效。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)