avant-propos
Le concept de domain-driven design (ddd en abrégé) vient de son livre le plus influent publié par le célèbre expert en modélisation Eric Evans en 2004 : "Domain-Driven Design-Tackling Complexity of Software Core" (Domain-Driven Design-Tackling Complexity in le cœur du logiciel), appelé Evans DDD, des idées de conception axées sur le domaine dans le champ de vision des développeurs de logiciels. Au cours des près de 20 ans de développement, la conception de modèles de domaine a toujours occupé une place très importante, mais son idée de conception directement orientée vers des scénarios métier est plus adaptée à la construction de modèles avec des scénarios métier spécifiques. La plupart des modèles DDD que nous voyons dans notre vie quotidienne sont des outils de modélisation spécifiques à un domaine avec des antécédents commerciaux spécifiques.
Au cours des deux dernières années, avec la promotion de la nouvelle génération de la technologie WEB, des micro-services, de la technologie de plate-forme intermédiaire et des applications natives du cloud ; le modèle piloté par le domaine (DDD) est redevenu un point chaud dans le domaine de conception de logiciels. La plateforme low-code/no-code est un domaine technique qui n'a cessé de se développer rapidement ces dernières années.
1. Introduction à l'ensemble d'outils OneCode
L' ensemble d'outils OneCode-DSM (ci-après dénommé DSM) est un outil de modélisation de haut niveau basé sur le moteur low-code OneCode qui se concentre sur les applications de modélisation low-code.
Dans le moteur OneCode, en plus de fournir aux utilisateurs ordinaires un concepteur de glissement sans code et un arrangeur de logique métier à faible code, il fournit également un outil de modélisation DSM pour les experts professionnels du domaine métier.
Application OneCode-DSM
(1) Concepteur visuel
L'outil de rapport de formulaire avec le moteur de conception visuelle comme corps principal implémente l'approbation des flux commerciaux, la conception d'affichage de données sur grand écran, l'affichage mobile et d'autres applications sans code dans les rapports de formulaire couramment utilisés quotidiennement.
(2) Outils d'intégration de services low-code
(3) Outil de modélisation DSM
2. Outil OneCode-DSM
(1) Vue d'ensemble de la composition de l'outil
L'outil de modélisation DSM est un outil auxiliaire pour la modélisation OneCode, fournissant un module de gestion de bibliothèque de ressources, un module de création de modèle de domaine et un module de configuration de fabrique de vues.
La fonction principale du module de modèle de stockage est d'aider l'utilisateur à convertir la base de données de l'utilisateur, l'interface API externe et l'application "code" existante dans un format de service de ressources qui peut être reconnu par DSM via un convertisseur.
Le module de modèle de domaine est l'outil principal de DSM. Les ressources importées dans le modèle de domaine sont combinées avec les objets de valeur dans des scénarios spécifiques, le menu de scénario et les services de domaine généraux pour compléter la modélisation du modèle de domaine selon des scénarios commerciaux spécifiques.
La fabrique de vues est la réalisation spécifique du modèle de domaine. Dans l'application du modèle de domaine, le produit de sortie de modélisation produira l'application de vue binaire via la fabrique de sortie de code, et ces applications de vue seront traitées ultérieurement et sorties dans l'utilisateur interactif. application via la fabrique de vues.
(2) Composition du langage OneCode (annotation)
(3) Processus de modélisation
Trois, modélisation d'entrepôt
(1) Par modélisation de base de données
L'outil de stockage le plus fréquemment utilisé est l'application de conversion de base de données, et l'utilisateur complète la configuration de la source de données via l'outil de base de données.
Configuration de la source de données
Exemple de code de mappage de table de bibliothèque :
@DBTable(configKey="fdt",cname="领导信息",tableName="FDT_LINGDAO",primaryKey="uuid")
@Repository(repositoryId="54fa1fd2-cae4-44b0-8387-f10f98bdd63c")
public interface FdtLingdao {
@Uid
@DBField(cnName="主键",dbFieldName="uuid")
public String getUuid();
public void setUuid(String uuid);
@CustomAnnotation(caption="名称")
@DBField(cnName="名称",length=20,dbFieldName="test")
public String getTest();
public void setTest(String test);
@CustomAnnotation(caption="领导姓名")
@DBField(cnName="领导姓名",length=20,dbFieldName="name")
public String getName();
public void setName(String name);
@CustomAnnotation(caption="职务")
@DBField(cnName="职务",length=100,dbFieldName="duty")
public String getDuty();
public void setDuty(String duty);
@CustomAnnotation(caption="创建时间")
@DBField(cnName="创建时间",length=0,dbType=ColType.DATETIME,dbFieldName="createtime")
public Date getCreatetime();
public void setCreatetime(Date createtime);
}
Exemple de code CRUD pour le chargeur de table de bibliothèque :
@Aggregation(type = AggregationType.aggregationEntity,entityClass=FdtLingdao.class,rootClass= FdtLingdaoService.class)
public interface FdtLingdaoService {
@APIEventAnnotation(bindMenu = {CustomMenuItem.reload})
public List<FdtLingdao> findAll()throws JDSException;
public List<FdtLingdao> findByWhere(String where)throws JDSException;
@APIEventAnnotation(bindMenu = {CustomMenuItem.search})
public List<FdtLingdao> find(FdtLingdao fdtLingdao)throws JDSException;
@APIEventAnnotation(bindMenu = {CustomMenuItem.add,CustomMenuItem.editor})
public FdtLingdao getFdtLingdaoInfo(String uuid) throws JDSException;
@APIEventAnnotation(bindMenu = {CustomMenuItem.save}, callback = {CustomCallBack.ReloadParent, CustomCallBack.Close})
public FdtLingdao update( FdtLingdao fdtLingdao) throws JDSException;
@APIEventAnnotation(bindMenu = {CustomMenuItem.delete}, callback = {CustomCallBack.Reload})
public Boolean delete(String uuid) throws JDSException;
}
(2) Par modélisation solide
Instance d'entité de stockage
@Entity
@Aggregation(type = AggregationType.aggregationRoot,sourceClass = Role.class, rootClass = Role.class)
public interface Role extends java.io.Serializable {
@MethodChinaName(cname = "角色标识")
@Uid
public String getRoleId();
public void setRoleId(String roleId);
@MethodChinaName(cname = "名称")
@Caption
public String getName();
public void setName(String name);
@MethodChinaName(cname = "角色类型")
public RoleType getType();
public void setType(RoleType type);
@MethodChinaName(cname = "级数")
public String getRoleNum();
public void setRoleNum(String num);
@MethodChinaName(cname = "系统ID")
@Pid
public String getSysId();
public void setSysId(String sysId);
@MethodChinaName(cname = "人员")
@Ref(ref = RefType.m2m, view = ViewType.grid)
public List<Person> getPersonList();
@MethodChinaName(cname = "部门")
@Ref(ref = RefType.m2m, view = ViewType.grid)
public List<Org> getOrgList();
public List<String> getOrgIdList();
}
(3) Relation d'entité
L'un des principaux objectifs de la modélisation d'entrepôt est de transformer des données structurées en un modèle orienté objet, et l'un des points les plus importants est le traitement des relations d'entité. La conception DSM permet aux utilisateurs d'effectuer à nouveau des relations d'entité après l'importation de tables de base de données. la relation entre les tables de la base de données est établie selon le modèle 1:1, 1:N, N:N. Une fois la modélisation terminée, le modèle d'entité sera transformé en fonction du paramètre de modèle métier pendant le processus de sortie du code, et l'application de modélisation sera complétée avec la balise de relation @Ref dans le code d'entité.
Relations du modèle de base de données | relation d'entité | Configuration des annotations d'entité |
---|---|---|
1 :N | un à plusieurs | @Ref(ref = RefType.o2m) |
N:N | plusieurs à plusieurs | @Réf(réf = RéfType.m2m) |
1:1 | Un par un | @Ref(ref = RefType.o2o) |
citation | @Ref(ref = RefType.ref) | |
chercher | @Ref(ref = RefType.) | |
La relation de modèle d'entité est conçue selon le modèle de stockage sur le modèle de base, et développée indépendamment
public enum RefType implements IconEnumstype {
ref("引用", "spafont spa-icon-c-databinder"),
o2m("一对多", "spafont spa-icon-c-treeview"),
m2o("多对一", "spafont spa-icon-alignwh"),
f2f("自循环", "spafont spa-icon-cancel"),
o2o("一对一", "spafont spa-icon-hmirror"),
find("查找", "xui-icon-search"),
m2m("多对多", "spafont spa-icon-alignwh");
private final String imageClass;
private final String name;
RefType(String name, String imageClass) {
this.name = name;
this.imageClass = imageClass;
}
}
(4) Modèle de modélisation d'entrepôt
(5) Annotations communes pour les modèles de stockage
Nom de l'annotation | utiliser | exemple |
---|---|---|
@DBTable | La configuration du mappage de table de base de données comprend principalement l'identification de la source de données, le nom de la table et les informations sur la clé primaire |
@DBTable(configKey="fdt",tableName="FDT_LINGDAO",primaryKey="uuid") |
@DBField | Configuration des champs de la base de données | @DBField(cnName="heure de création", longueur=0, dbType=ColType.DATETIME, dbFieldName="heure de création") |
@Uid | Champs d'entité, généralement identifiés comme clés primaires dans les entités de base de données, comme valeurs uniques dans les modèles DDD | @Uid |
@Pid | Champ de composant parent, généralement utilisé dans les entités relationnelles pour identifier la clé primaire de l'objet parent | @Pid |
@AnnotationPersonnalisée | Annotations d'entité couramment utilisées, les attributs d'annotation incluront les types d'affichage de champ, les attributs lisibles, les annotations d'affichage, etc. | @CustomAnnotation(légende="Position") |
@Légende | L'annotation de titre est généralement utilisée comme champ d'affichage par défaut dans l'affichage des données de ligne du tableau, comme Personne (dans l'objet personnel) utilisera le nom comme option d'affichage par défaut | @Légende |
@Réf | Propriétés de la relation d'entité | @Ref(ref = RefType.m2m, view = ViewType.grid) |
@APIEventAnnotation | L'annotation de service API est l'identification des services externes. Après avoir ajouté cette annotation, elle sera convertie en service d'API Web lors de la modélisation ultérieure du modèle | @APIEventAnnotation(bindMenu = {CustomMenuItem.search}) |
Quatrièmement, la modélisation de domaine
(1) Composition de la modélisation de domaine
(2) Principes de la modélisation de domaine
Principe de rendu du modèle
OneCode lui-même est basé sur le système de langage JAVA, qui est un ensemble de sous-ensembles étendus basés sur les annotations Java Spring. Le moteur de compilation hybride construit un modèle de domaine complet grâce à des annotations étendues, et complète le processus normal de livraison et de planification des données Web en lisant la norme Spring annotations.
Des exemples d'annotations expliquent :
Exemple de code complet :
@Controller
@RequestMapping("/admin/org/deparment/")
@MethodChinaName(cname = "部门管理", imageClass = "bpmfont bpmgongzuoliuzuhuzicaidan")
@Aggregation(sourceClass = IDeparmentService.class, rootClass = Org.class)
public interface IDeparmentAPI {
@RequestMapping(method = RequestMethod.POST, value = "Persons")
@GridViewAnnotation()
@ModuleAnnotation(caption = "人员列表")
@APIEventAnnotation(bindMenu = {CustomMenuItem.treeNodeEditor})
@ResponseBody
public <K extends IPersonGrid> ListResultModel<List<K>> getPersons(String orgId);
@RequestMapping(method = RequestMethod.POST, value = "loadChild")
@APIEventAnnotation(bindMenu = {CustomMenuItem.loadChild})
@ResponseBody
public <T extends IDeparmentTree> ListResultModel<List<T>> loadChild(String parentId);
@MethodChinaName(cname = "部门信息")
@RequestMapping(method = RequestMethod.POST, value = "DeparmentInfo")
@NavGroupViewAnnotation(saveUrl = "admin.org.deparment.saveOrg")
@DialogAnnotation
@ModuleAnnotation(caption = "编辑部门信息", width = "600", height = "480")
@APIEventAnnotation(callback = {CustomCallBack.ReloadParent, CustomCallBack.Close}, bindMenu = {CustomMenuItem.editor})
@ResponseBody
public <K extends IDeparmentNav> ResultModel<K> getDeparmentInfo(String orgId);
@MethodChinaName(cname = "添加部门")
@RequestMapping(method = RequestMethod.POST, value = "addDeparment")
@FormViewAnnotation()
@DialogAnnotation
@ModuleAnnotation(caption = "添加部门", width = "350", height = "260")
@APIEventAnnotation(bindMenu = {CustomMenuItem.add}, autoRun = true)
@ResponseBody
public <M extends IAddDeparmentForm> ResultModel<M> addDeparment(String parentId);
@MethodChinaName(cname = "保存机构信息")
@RequestMapping(value = {"saveOrg"}, method = {RequestMethod.GET, RequestMethod.POST})
@APIEventAnnotation(callback = {CustomCallBack.ReloadParent, CustomCallBack.Close}, bindMenu = {CustomMenuItem.save})
public @ResponseBody
ResultModel<Boolean> saveOrg(@RequestBody IAddDeparmentForm deparmentForm);
@MethodChinaName(cname = "删除部门")
@RequestMapping(value = {"delOrg"}, method = {RequestMethod.GET, RequestMethod.POST})
@APIEventAnnotation(callback = {CustomCallBack.Reload, CustomCallBack.ReloadParent}, bindMenu = {CustomMenuItem.delete})
public @ResponseBody
ResultModel<Boolean> delOrg(String orgId);
;
}
(3) Configuration d'agrégation
Configuration de la modélisation
configuration des interfaces
configuration du formulaire
Exécuter la livraison d'événements
(4) Classification d'agrégation
(5) racine agrégée
La conception de la racine agrégée, généralement pour identifier son application de domaine indépendante, présente les caractéristiques d'unicité globale. Dans le domaine général, une description d'objet avec une dimension d'axe de temps, telle qu'un objet d'instance de processus (ProcessInst) dans un workflow. Après avoir obtenu la racine agrégée, vous pouvez obtenir l'objet de définition de processus une fois en avant selon l'axe du temps, et obtenir les données historiques du processus en arrière, et obtenir les données d'entité telles que les autorisations, les formulaires de données et le statut de l'exemple métier selon le nœud actuel.
Exemple de processus Configuration racine agrégée
Traiter le code source de l'agrégation d'instances
@Entity
@MethodChinaName(cname = "流程实例")
@Aggregation(type = AggregationType.aggregationRoot, sourceClass = ProcessInst.class, rootClass = ProcessInst.class)
public interface ProcessInst extends java.io.Serializable {
@MethodChinaName(cname = "流程实例UUID")
@Uid
public String getProcessInstId();
@MethodChinaName(cname = "流程定义UUID")
@Pid
public String getProcessDefId();
@MethodChinaName(cname = "流程定义版本UUID")
@Pid
public String getProcessDefVersionId();
@MethodChinaName(cname = "流程实例名称")
public String getName();
@MethodChinaName(cname = "紧急程度")
public String getUrgency();
@MethodChinaName(cname = "流程实例状态")
public ProcessInstStatus getState();
@MethodChinaName(cname = "流程实例副本数量")
public int getCopyNumber();
@MethodChinaName(cname = "程实例启动时间")
public Date getStartTime();
@MethodChinaName(cname = "流程实例办结时间")
public Date getEndTime();
@MethodChinaName(cname = " 流程实例时间限制")
public Date getLimitTime();
@MethodChinaName(cname = "流程实例状态")
public ProcessInstStatus getRunStatus();
@MethodChinaName(cname = "流程定义版本")
@Ref(ref = RefType.m2o, view = ViewType.grid)
public ProcessDefVersion getProcessDefVersion() throws BPMException;
@MethodChinaName(cname = "流程定义")
@Ref(ref = RefType.m2o, view = ViewType.dic)
public ProcessDef getProcessDef() throws BPMException;
@MethodChinaName(cname = "活动实例")
@Ref(ref = RefType.o2m, view = ViewType.grid)
public List<ActivityInst> getActivityInstList() throws BPMException;
@MethodChinaName(cname = "流程属性值", returnStr = "getWorkflowAttribute($R('attName'))", display = false)
public Object getWorkflowAttribute(ProcessInstAtt name);
@MethodChinaName(cname = "权限属性值", returnStr = "getRightAttribute($R('attName'))", display = false)
public Object getRightAttribute(ProcessInstAtt name);
@MethodChinaName(cname = "应用属性值", returnStr = "getAppAttribute($R('attName'))", display = false)
public Object getAppAttribute(ProcessInstAtt name);
@MethodChinaName(cname = "定制属性值", returnStr = "getAttribute($R('attName'))", display = false)
public String getAttribute(String name);
@MethodChinaName(cname = "取得流程中的所有属性值", returnStr = "getAllAttribute()", display = false)
@Ref(ref = RefType.o2m, view = ViewType.grid)
public List<AttributeInst> getAllAttribute();
@MethodChinaName(cname = "个人定制属性值", returnStr = "getAttribute($R('personId'),$R('attName'))", display = true)
public String getPersonAttribute(String personId, String name);
@MethodChinaName(cname = "设置定制属性", returnStr = "setAttribute($R('attName'),$R('value'))", display = false)
public void setAttribute(String name, String value) throws BPMException;
@MethodChinaName(cname = "设置个人定制属性", returnStr = "setAttribute($R('personId'),$R('attName'),$R('value'))", display = false)
public void setPersonAttribute(String personId, String name, String value) throws BPMException;
@MethodChinaName(cname = "更新流程实例名称(公文标题)", returnStr = "updateProcessInstUrgency($R('processInstName'))")
public ReturnType updateProcessInstName(String name)
throws BPMException;
@MethodChinaName(cname = "更新流程实例紧急程度", returnStr = "updateProcessInstUrgency($R('urgency'))")
public ReturnType updateProcessInstUrgency(
String urgency) throws BPMException;
@MethodChinaName(cname = "流程实例挂起", returnStr = "suspendProcessInst()", display = false)
public ReturnType suspendProcessInst()
throws BPMException;
@MethodChinaName(cname = "继续流程实例", returnStr = "resumeProcessInst()", display = false)
public ReturnType resumeProcessInst()
throws BPMException;
@MethodChinaName(cname = "取得活动的历史数据, 根据流程实例")
public List<ActivityInstHistory> getActivityInstHistoryListByProcessInst() throws BPMException;
@MethodChinaName(cname = "中止流程实例", returnStr = "abortProcessInst()", display = false)
public ReturnType abortProcessInst()
throws BPMException;
@MethodChinaName(cname = "流程实例完成", returnStr = "completeProcessInst()", display = false)
public ReturnType completeProcessInst()
throws BPMException;
@MethodChinaName(cname = "删除流程实例", returnStr = "deleteProcessInst()", display = false)
public ReturnType deleteProcessInst()
throws BPMException;
@MethodChinaName(cname = "获取表单数据")
public DataMap getFormValues() throws BPMException;
@MethodChinaName(cname = "更新表单数据")
public void updateFormValues(DataMap dataMap) throws BPMException;
}
(6) Entités agrégées
Les entités agrégées sont généralement utilisées pour décrire des entités indépendantes, telles que des tables simples ou des tables d'association simples dans les formulaires commerciaux. Il ne contient généralement que des relations de valeur simples et ses fonctions sont limitées à des applications simples telles que l'interrogation de listes et l'enregistrement de formulaires.
formulaire de table unique
exemple de code
@Controller
@RequestMapping("/test/fdtlingdaoservice/")
@Aggregation(type=AggregationType.aggregationEntity,sourceClass=FdtLingdaoService.class)
public interface FdtLingdaoAPI {
@APIEventAnnotation(bindMenu=CustomMenuItem.search)
@RequestMapping(value="searchUrl")
@ModuleAnnotation
@GridViewAnnotation
@ResponseBody
public ListResultModel<List<FindGridView>> find (FdtLingdao fdtLingdao);
@APIEventAnnotation(bindMenu={CustomMenuItem.add,CustomMenuItem.editor})
@RequestMapping(value="addPath")
@ModuleAnnotation
@FormViewAnnotation
@ResponseBody
public ResultModel<GetFdtLingdaoInfoView> getFdtLingdaoInfo (String uuid);
@APIEventAnnotation(bindMenu=CustomMenuItem.save,callback={CustomCallBack.ReloadParent,CustomCallBack.Close})
@RequestMapping(value="update")
@ResponseBody
public ResultModel<FdtLingdao> update (@RequestBody FdtLingdao fdtLingdao);
@RequestMapping(value="findByWhere")
@ResponseBody
public ListResultModel<List<FdtLingdao>> findByWhere (String where);
@APIEventAnnotation(bindMenu=CustomMenuItem.delete,callback=CustomCallBack.Reload)
@RequestMapping(value="delete")
@ResponseBody
public ResultModel<Boolean> delete (String uuid);
@APIEventAnnotation(bindMenu=CustomMenuItem.reload)
@RequestMapping(value="dataUrl")
@ModuleAnnotation
@GridViewAnnotation
@ResponseBody
public ListResultModel<List<FindAllGridView>> findAll ();
}
(6) Menu Actions
Les menus d'action ne sont pas définis dans le modèle DDD, mais ils jouent un rôle important dans les applications low-code.
Dans la modélisation du menu d'action, l'affichage du menu et les actions associées sont principalement combinés.
Modélisation du menu d'envoi de flux de travail
emplacement des menus
Menu contextuel de l'éditeur
Remarques communes sur les menus
annotation | Emplacement | exemple |
---|---|---|
@ToolBarMenu | barre d'outils supérieure du conteneur | @ToolBarMenu(hAlign = HAlignType.left, handler = false, menuClass = JavaRepositoryEditorTools.class) |
@MenuBarMenu | barre de menu supérieure | @MenuBarMenu(menuType = CustomMenuType.sub, caption = "新建", imageClass = "xuicon xui-uicmd-add", index = 5) |
@BottomBarMenu | barre de boutons inférieure du conteneur | @BottomBarMenu(menuClass = CustomBuildAction.class) |
@PageBar | barre de pages | @PageBar(pageCount = 100) |
@GridRowCmd | Barre de boutons d'action de ligne de liste | @GridRowCmd(tagCmdsAlign = TagCmdsAlign.left, menuClass = {AttachMentService.class}) |
@RightContextMenu | clic droit barre de menu | @RightContextMenu(menuClass = JavaViewPackageMenu.class) |
@Controller
@RequestMapping(value = {"/java/agg/context/"})
@MenuBarMenu(menuType = CustomMenuType.component, caption = "菜单")
@Aggregation(type = AggregationType.menu)
public class JavaAggPackageMenu {
@RequestMapping(method = RequestMethod.POST, value = "paste")
@CustomAnnotation(imageClass = "spafont spa-icon-paste", index = 1, caption = "粘贴")
@APIEventAnnotation(customRequestData = {RequestPathEnum.treeview, RequestPathEnum.sTagVar}, callback = CustomCallBack.TreeReloadNode)
public @ResponseBody
TreeListResultModel<List<JavaAggTree>> paste(String sfilePath, String packageName, String domainId, String projectName) {
TreeListResultModel<List<JavaAggTree>> result = new TreeListResultModel<List<JavaAggTree>>();
try {
DSMFactory dsmFactory = DSMFactory.getInstance();
File desFile = new File(sfilePath);
DomainInst domainInst = dsmFactory.getAggregationManager().getDomainInstById(domainId);
JavaSrcBean srcBean = dsmFactory.getTempManager().genJavaSrc(desFile, domainInst, null);
DSMFactory.getInstance().getBuildFactory().copy(srcBean, packageName);
result.setIds(Arrays.asList(new String[]{domainId + "|" + packageName}));
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
@RequestMapping(method = RequestMethod.POST, value = "reLoad")
@CustomAnnotation(imageClass = "xuicon xui-refresh", index = 1, caption = "刷新")
@APIEventAnnotation(customRequestData = RequestPathEnum.treeview, callback = CustomCallBack.TreeReloadNode)
public @ResponseBody
TreeListResultModel<List<JavaAggTree>> reLoad(String packageName, String domainId, String filePath) {
TreeListResultModel<List<JavaAggTree>> result = new TreeListResultModel<List<JavaAggTree>>();
String id = domainId + "|" + packageName;
result.setIds(Arrays.asList(new String[]{id}));
return result;
}
@RequestMapping(value = {"split"})
@Split
@CustomAnnotation(index = 2)
@ResponseBody
public ResultModel<Boolean> split2() {
ResultModel<Boolean> result = new ResultModel<Boolean>();
return result;
}
@RequestMapping(value = "UploadFile")
@APIEventAnnotation(autoRun = true)
@DialogAnnotation(width = "450", height = "380", caption = "上传JAVA文件")
@ModuleAnnotation
@FormViewAnnotation
@CustomAnnotation(caption = "上传", index = 3, imageClass = "xui-icon-upload", tips = "上传")
public @ResponseBody
ResultModel<UPLoadFile> uploadFile(String domainId, String packageName) {
ResultModel<UPLoadFile> resultModel = new ResultModel<UPLoadFile>();
try {
UPLoadFile upLoadFile = new UPLoadFile(domainId, packageName);
resultModel.setData(upLoadFile);
} catch (Exception e) {
e.printStackTrace();
}
return resultModel;
}
@RequestMapping(value = {"split"})
@Split
@CustomAnnotation(index = 4)
@ResponseBody
public ResultModel<Boolean> split6() {
ResultModel<Boolean> result = new ResultModel<Boolean>();
return result;
}
@RequestMapping(method = RequestMethod.POST, value = "newApp")
@CustomAnnotation(imageClass = "xuicon xui-uicmd-add", index = 5)
@MenuBarMenu(menuType = CustomMenuType.sub, caption = "新建", imageClass = "xuicon xui-uicmd-add", index = 5)
public JavaAggNewMenu getJavaJarAction() {
return new JavaAggNewMenu();
}
@RequestMapping(method = RequestMethod.POST, value = "importAgg")
@CustomAnnotation(imageClass = "xuicon xui-uicmd-add", index = 6)
@MenuBarMenu(menuType = CustomMenuType.sub, caption = "导入", imageClass = "spafont spa-icon-html", index = 5)
public JavaAggImportMenu importAgg() {
return new JavaAggImportMenu();
}
@RequestMapping(value = {"split"})
@Split
@CustomAnnotation(index = 7)
@ResponseBody
public ResultModel<Boolean> split7() {
ResultModel<Boolean> result = new ResultModel<Boolean>();
return result;
}
@MethodChinaName(cname = "删除")
@RequestMapping(method = RequestMethod.POST, value = "delete")
@CustomAnnotation(imageClass = "xuicon xui-icon-minus", index = 8)
@APIEventAnnotation(customRequestData = RequestPathEnum.treeview, callback = CustomCallBack.TreeReloadNode)
public @ResponseBody
TreeListResultModel<List<JavaAggTree>> delete(String domainId, String parentId, String filePath, String javaTempId) {
TreeListResultModel<List<JavaAggTree>> result = new TreeListResultModel<List<JavaAggTree>>();
try {
File desFile = new File(filePath);
DSMFactory dsmFactory = DSMFactory.getInstance();
DomainInst domainInst = dsmFactory.getAggregationManager().getDomainInstById(domainId);
if (desFile.exists()) {
if (desFile.isDirectory()) {
JavaPackage javaPackage = domainInst.getPackageByFile(desFile);
dsmFactory.getTempManager().deleteJavaPackage(javaPackage);
} else {
JavaSrcBean srcBean = dsmFactory.getTempManager().genJavaSrc(desFile, domainInst, javaTempId);
dsmFactory.getTempManager().deleteJavaFile(srcBean);
}
}
result.setIds(Arrays.asList(new String[]{parentId}));
} catch (JDSException e) {
e.printStackTrace();
}
return result;
}
public ESDChrome getCurrChromeDriver() {
Object handleId = JDSActionContext.getActionContext().getParams("handleId");
ChromeDriver chrome = null;
if (handleId != null) {
chrome = ESDEditor.getInstance().getChromeDriverById(handleId.toString());
}
if (chrome == null) {
chrome = ESDEditor.getInstance().getCurrChromeDriver();
}
return new ESDChrome(chrome);
}
}
(7)通用域
通用域将系统中常用服务进行了独立分类可以在工程构建时导入进来。
通用域管理
(8)API服务接口
api服务接口是手工代码接入的域服务,在普通java类上加上聚和接口后会统一归类到该类型管理。
(9)领域模型常用注解
注解名称 | 用途 | 实例 |
---|---|---|
@RequestMapping | 直接使用的SpringMvc注解用于将当前方法标识为,web可访问 | @RequestMapping(value = {"AggAPITree"}, method = {RequestMethod.GET, RequestMethod.POST}) |
@ModuleAnnotation | 视图标识,在方法上标识改注解后会被模型编译器识别为视图模型将其内部对象渲染为视图。 | @ModuleAnnotation(dynLoad = true, imageClass = "spafont spa-icon-moveforward", caption = "模块授权") |
@ResponseBody | 直接使用的SpringMvc注解,标识为JSON数据返回 | @ResponseBody |
@DialogAnnotation | 添加该标识时,当前端路由到当前方法时,以独立窗口的方式返回 | @DialogAnnotation(width = "850", height = "750") |
@Aggregation | 领域标识,在类注解中添加该标识,会被DSM引擎自动索引并根据注解中指定类型加载到相关的实体列表中 | @Aggregation(type = AggregationType.customDomain, sourceClass = PersonService.class, rootClass = Person.class) |
@*Domain | 通用域标识 | @OrgDomain @BpmDomain @VfsDomain @MsgDomain @NavDomain |
@*TreeView | 树形注解包括了,导航树、弹出字典树,折叠分组树等注解集合 | @TreeViewAnnotation @NavTreeViewAnnotation @NavFoldingTreeViewAnnotation @PopTreeViewAnnotation |
@GridViewAnnotation | 数据列表注解 | |
@GalleryView*Annotation | 详情图形混合注解 | @GalleryViewAnnotation @NavGalleryViewAnnotation |
@*TabsViewAnnotation | Tab切换页 | @TabsViewAnnotation @NavTabsViewAnnotation @NavFoldingTabsViewAnnotation |
@PopMenuViewAnnotation | 菜单导航 | @PopMenuViewAnnotation |
@NavGroupViewAnnotation | 分组表单 | @NavGroupViewAnnotation |
@FormViewAnnotation | 表单注解 | @FormViewAnnotation |
@*ButtonViewsViewAnnotation | 按钮栏视图 | @ButtonViewsAnnotation @NavButtonViewsAnnotation |
五,后续章节内容介绍
在下一章节中,我们将重点介绍,OneCode视图工厂以及,模块组装,权限设定、菜单应用等相关工具使用。
章节预览:
(1)视图工厂组成
视图工厂,最终面向用户的展现方式,在建模中通常会有相关的服务通过聚合实体与关系完成初步的视图构建。
voir la composition de l'usine
(2) Objectif de conception
Dans l'usine de domaine, des objets d'entité de base plus anémiques sont agrégés et triés pour former un modèle hyperémique qui est plus propice à la compréhension et au fonctionnement de l'entreprise, et son application à faible couplage est réalisée en étendant les annotations sur son modèle d'interface. Ce style de conception est toujours poursuivi dans la fabrique de vues pour transmettre des composants uniques ordinaires, et l'agrégation de codes JAVA back-end encapsule des fonctions communes et des composants auxiliaires pour former des composants de vue indépendants.
(3) Affichage de la liste
Fonctions de liste communes
Configuration commune
Configuration des informations de liste