
產(chǎn)品能力

-
頁(yè)面的千行千面(千人千面),包含同一個(gè)頁(yè)面不同布局、不同字段、不同樣式
-
數(shù)據(jù)模塊的千行千面(千人千面),根據(jù)不同身份執(zhí)行不同的業(yè)務(wù)技術(shù)邏輯和服務(wù)編排
-
page一鍵創(chuàng)建,在沒(méi)有新的業(yè)務(wù)組建和新的module情況無(wú)需開(kāi)發(fā)接入,0代碼上線,運(yùn)營(yíng)同學(xué)自行配置頁(yè)面。
-
前端組件復(fù)用,在沒(méi)有新前端組件,前端無(wú)需參與開(kāi)發(fā),后端只需編寫(xiě)module對(duì)應(yīng)的業(yè)務(wù)接口。
-
實(shí)現(xiàn)module可復(fù)用,module數(shù)據(jù)渲染、數(shù)據(jù)寫(xiě)入,查詢條件、浮層、半推頁(yè)面、頁(yè)面操作
-
新增字段擴(kuò)展0代碼,模型字段可以自定義,動(dòng)態(tài)擴(kuò)展,可定義來(lái)自本地?cái)?shù)據(jù)庫(kù)、遠(yuǎn)程HSF接口數(shù)據(jù)
-
環(huán)境可隔離,測(cè)試、預(yù)發(fā)、生產(chǎn)
-
平臺(tái)和業(yè)務(wù)代碼分離,業(yè)務(wù)上線只需關(guān)注業(yè)務(wù)邏輯本身的代碼。
-
DO DTO可定義,動(dòng)態(tài)映射
-
數(shù)據(jù)枚舉動(dòng)態(tài)定義,動(dòng)態(tài)綁定
產(chǎn)品界面


用戶
產(chǎn)品模塊

核心邏輯
前端渲染

后端綁定
模型設(shè)計(jì)

template定義
-
列表頁(yè)面 -
詳情頁(yè)面 -
半開(kāi)頁(yè)面 -
表單提交頁(yè)面
page定義

module定義

module_type 定義
McubeContextAware
@Component
public class McubeContextAware implements ApplicationContextAware {
private static volatile ApplicationContext alc;
@Resource
private ModuleBeanFactory moduleBeanFactory;
@Resource
private ModuleGroupBeanFactory moduleGroupBeanFactory;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
alc = applicationContext;
}
@PostConstruct
public void init(){
setModuleBeanMap();
setModuleGroupBeanMap();
}
private void setModuleBeanMap() {
Map<String, McubeModuleExecutor> beanMap = alc.getBeansOfType(McubeModuleExecutor.class);
if (beanMap != null) {
beanMap.values().stream().forEach(m -> {
McubeModule module = AnnotationUtils.findAnnotation(m.getClass(), McubeModule.class);
if (module != null) {
String code = module.code();
String name = module.name();
if (code != null) {
moduleBeanFactory.getMcubeBeanMap().put(code, m);
}
}
});
}
}
private void setModuleGroupBeanMap() {
Map<String, McubeModuleExecutor> beanMap = alc.getBeansOfType(McubeModuleExecutor.class);
if (beanMap != null) {
beanMap.values().stream().forEach(m -> {
McubeModuleGroup module = AnnotationUtils.findAnnotation(m.getClass(), McubeModuleGroup.class);
if (module != null) {
String code = module.code();
String name = module.name();
moduleGroupBeanFactory.getMcubeBeanMap().put(code,m);
}
});
}
}
}
執(zhí)行單元(moduleGroup executor)
/**
* Created by hzliuxuan on 2022/5/27.
* @author hzliuxuan
* 模塊接口
*/
public interface McubeModuleExecutor<T,V> {
/**
* 填充數(shù)據(jù),頁(yè)面渲染,一般是read接口
* @param value
* @return
*/
T populate(V value);
/**
* 編輯模塊
* @param value
* @return
*/
void edit(V value);
/**
* 寫(xiě)接口
* @param value
* @return
*/
void add(V value);
/**
* 刪除接口
* @param value
* @return
*/
void delete(V value);
}
@Inherited
@Component
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface McubeModuleGroup {
/**
* moduleGroup code (必填,唯一標(biāo)識(shí))
*/
@NotNull
String code();
/**
* 對(duì)應(yīng)module code值
*/
@NotNull
String[] moduleCodes();
/**
* moduleGroup name
*/
String name();
@NotNull
ModuleGroupType type();
}
field定義

field數(shù)據(jù)結(jié)構(gòu)定義
[
{ "key": "equityInvestment", "value": null, "label": null, "name": "權(quán)益投放記錄", "text": null, "width": null, "lock": null, "copyEnable": null, "copy": null, "sortable": null, "tooltip": null, "wordBreak": null, "fieldMapper": null, /**數(shù)據(jù)類型取值input, select, date, address(地址), switch(開(kāi)關(guān)), staffSelector(花名選擇),textArea,upload(上傳)**/ "dataType": "input", private String dataType; "format": null, "dataSource": null, "dataUrl": null, "required": null, "unit": null, "readOnly": false, "isHidden": false, "multiple": false, "features": null, "showTime": null, "maxLength": null } ]
page 數(shù)據(jù)結(jié)構(gòu)
public class McubePageBeanDTO {
/**
* 頁(yè)面編碼
*/
@CrmOperateLogBizCode
private String pageCode;
/**
* 業(yè)務(wù)線
*/
private String bizCode;
/**
* 配置類型
*/
private TemplateTypeEnum templateType;
/**
* 配置模塊
*/
private List<McubeModuleBeanDTO> originalModules;
/**
* 配置字段
*/
private Map<String, List<McubeField>> originalFields;
/**
* 實(shí)例的模塊
*/
private List<McubeModuleBeanDTO> instanceModules;
private List<String> instanceModulesList;
/**
* 實(shí)例的字段
*/
private Map<String, List<McubeField>> instanceFields;
private String subBizCode;
/**
* 元頁(yè)面version
*/
private Byte originVersion;
/**
* 實(shí)例version
*/
private Byte instanceVersion;
/**
* module version
*/
private Byte moduleVersion;
/**
* 屬性集合
*/
private List<Property> properties;
///**
// * 顯示的模塊
// */
//private List<String> instanceModulesList;
private Boolean isCache;
@Data
public static class Property {
/**
* property
*/
private Boolean checkable;
private Boolean isEdit;
private Boolean selectable;
private Boolean isLeaf;
private Boolean isAdd;
private Boolean isDelete;
private String showType;
private Integer level;
private String extendedField;
}
}
page渲染運(yùn)行時(shí)序圖

運(yùn)行時(shí)類設(shè)計(jì)圖


文章來(lái)源:阿里開(kāi)發(fā)者
作者:劉玄(玄哥)
未經(jīng)允許不得轉(zhuǎn)載:RPA中國(guó) | RPA全球生態(tài) | 數(shù)字化勞動(dòng)力 | RPA新聞 | 推動(dòng)中國(guó)RPA生態(tài)發(fā)展 | 流 > 一種關(guān)于低代碼平臺(tái)(LCDP)建設(shè)實(shí)踐與設(shè)計(jì)思路
熱門信息
閱讀 (14728)
1 2023第三屆中國(guó)RPA+AI開(kāi)發(fā)者大賽圓滿收官&獲獎(jiǎng)名單公示閱讀 (13753)
2 《Market Insight:中國(guó)RPA市場(chǎng)發(fā)展洞察(2022)》報(bào)告正式發(fā)布 | RPA中國(guó)閱讀 (13055)
3 「RPA中國(guó)杯 · 第五屆RPA極客挑戰(zhàn)賽」成功舉辦及獲獎(jiǎng)名單公示閱讀 (12964)
4 與科技共贏,與產(chǎn)業(yè)共進(jìn),第四屆ISIG中國(guó)產(chǎn)業(yè)智能大會(huì)成功召開(kāi)閱讀 (11567)
5 《2022年中國(guó)流程挖掘行業(yè)研究報(bào)告》正式發(fā)布 | RPA中國(guó)