Moteur à faible code OneCode, pratique de la technologie de conception pilotée par le domaine (DDD) (1)

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

Je suppose que tu aimes

Origine blog.csdn.net/wenzhangli/article/details/130519559
conseillé
Classement