• Moqui学习Day2


    用户 本地化  消息和日志门面

    用户门面用于管理当前用户和访问,登陆,授权及登出的信息。用户信息包括区域设置,时区以及币种/ec.user.nowTimestamp设置日期。
    消息门面用于追踪用户的消息以及错误信息。错误消息列表ec.message.errors同样用于确定在一个服务调用或其他动作中是否存在错误。
    日志门面用于记录日志。org.slf4j.Logger.
     
    扩展和附加组件
    组件目录结构
      data – 包含实体 XML数据文件, 其带有 根元素 entity-facade-xml,按照和 命令行指定的类型匹 配的 type 属性进行加载 (使用 -loadloadload 的可执行 WAR文件)如果没有指定 类型 ,可以为任何类型
     entity– 这个目录下存放  的是所有 将会被加载 的实体定义和 实体 ECA XML文件 ;实体 ECA文 件必须放在这个目录中并有件必须放在这个目录中并有 ".eecas.xml"的双重扩展名
     lib – 当 web 应用被部署的时候, 这个目录下的 JAR 文件将会被添加到 classpath中
     screen  – 约定 这个目录下的 界面会 被明确的引用( 通常过 "component://*" URL)
     script – 约定 这个目录下的 脚本 会被明确的引用( 通常过 "component://*" URL);Groovy,XML动作以及其他脚本都应位于这个目录下
     service  – 服务 将会按照服务 定义 XML文件中定义的路径进行加载, 同时不但位于组件 同时不但位于组件 同时不但位于组件 同时不但位于组件的服务 目录 之下还是 位于 "classpath://service/"之下的路径都会被找到; 服务 ECA文件必须放在这个目录中并 有".secas.xml"的双重扩展名  ;邮件 ECA文件必须放在这个目录中并有 ".emecas.xml"的扩展名 
     
    组件安装
    加载组件
    1.将组件目录放在runtime/component目录里
    2.在Moqui XML配置文件中添加一个component-list.component元素
     
    装载界面
    每个Moqui框架中的web应用(包括webroot)都必须有一个根界面,其指定在moqui-conf.webapp-list.webapp.root-screen-location属性中/默认根界面被调用时,将会加载位于runtime/compoment/webroot/screen/webroot.xml中的webroot应用。
     
    对于源自于你组件中位于webroot界面下,界面路径所制定的可用界面来说,你需要令你组件中的每个顶层界面成为webroot界面祖先的子界面。有两种方式去实现。
    1.添加一个screen.subscreens.subscreen-item元素到父界面
    查看装载了example和工具应用界面的apps界面(runtime/component/webroot/screen/WebRoot/apps.xml)
    2.添加一条SubscreenItem实体的记录,在screenLocation字段中指定自界面,装载点subscreenName字段中等同于subscreens-item.name属性,同时在userGroup字段中如果其值为ALL_USERS则表示适用于所有的用户,如果为一个实际的userGroupId则表示仅适用于这个用户组。
     
     
    Moqui XML配置文件的设置
     
     
    创建自己的组件
     
    Moqui依照约定/配置优于编码的原则进行组件开发
    创建目录
    创建  runtime/component/tutorial/screen/tutorial.xml
    以自界面的方式挂载
    将该页面挂载到根界面下
    定义根界面的webroot组件runtime/component/webroot/screen/webroot.xml
    方式一在apps界面做修改,加入:
    <subscreens-item name="Toturial" location="component://tutorial/screen/tutorial.xml"
    
                             menu-title="Toturial" menu-index="1"/>
    

      

    方式二:
    <entity-facade-xml>
    
    <SubscreensItem screenLocation="component://webroot/screen/webroot/app.xml"
    
    subscreenName="tutorial" userGroupId="ALL_USERS"
    
                    subscreenLocation="component://tutorial/screen/tutorial.xml"
    
                    menuTitle="Dutorial" menuIndex="2" menuInclude="Y"
    
    />
    
    </entity-facade-xml>
    

      

     
     
    子界面嵌入:
    <screen require-authentication="false">
    
    <widgets>
    
     
    
        <label type="hi" text="hello world"/>
    
        <render-mode>
    
            <text type="html" location="component://tutorial/screen/hello.html">
    
            </text>
    
        </render-mode>
    
    </widgets>
    
    </screen>
    

      

    其中的render-mode是什么?在render-mode下,你可以为不同的渲染模式定义各种子元素,甚至是各种文本模式,如,html   xml   xsl-fo csv等。
     
     
    第二步     实体
    实体是一个基本的扁平列表的数据结构,并且通常为数据库中的一张表。一条实体值等价于数据库表的一行记录。Moqui框架没有使用对象关系映射方式,所以我们要做的就是定义一个实体,然后通过实体门面模式去写代码操作使用实体。
    创建实体:
    我们创建一个包含tutorialId和description两个字段的实体XML文件,并命名为Tutorial位于runtime/component/tutorial/entity/TutorialEntities.xml 
    <entities>
    
        <entity entity-name="Tutorial" package-name="tutorial">
    
            <field name="tutorialId" type="id" is-pk="true"/>
    
            <field name="description" type="text-long"/>
    
        </entity>
    
    </entities>
    

      

    添加数据:
    实体门面模式具有从XML文件中读取或写入数据的功能,这些XML文件中的节点元素需要和实体名对应,同样的属性名和字段名各需对应。
    runtime/component/tutorial/data/TutorialData.xml 
    <entity-facade-xml type="seed">
    
        <Tutorial tutorialId="TestOne" description="Test one description"/>
    
        <Tutorial tutorialId="TestTwo" description="Test two description"/>
    
    </entity-facade-xml>
    

      

     
     
    自动查询表单:
    runtime/component/tutorial/screen/tutorial/FindTutorial.xml 
     
    <screen require-authentication="anonymous-view">
    
        <transition name="findTutorial">
    
            <default-response url="."/>
    
        </transition>
    
        <action>
    
            <entity-find entity-name="Tutorial" list="tutorialList">
    
                <search-form-inputs/>
    
            </entity-find>
    
        </action>
    
        <widgets>
    
            <form-list name="ListTutorials" list="tutorialList"
    
            transition="findTutorial"
    
            >
    
                <auto-fields-entity entity-name="Tutorial" field-type="find-display"/>
    
            </form-list>
    
        </widgets>
    
    </screen>
    

      

     
     
    关键部分:
    转换transition
    转换/跳转指的是界面之间的链接。类似于一个顺序图易于,我们把每个界面当成一个个节点,那么界面中定义的转换/跳转就是“线”一般,从一个节点指向另外一个节点界面,并且同时有些跳转还包含动作或者服务。
        单个转换可以按照条件或者不同的错误结果返回各种响应页面,一切都取决于你的界面设计需求。
         个别转换会指向当前页面。(页面刷新)
    查询实体动作  actions.entity-find
    界面渲染时只有一个界面动作:查询实体(entity-find)
    通常使用entity-find元素(或者调用java api使用EntityFind对象)时,你需要指定过滤条件,排序字段或者其他查询相关的信息去运行。
    在上个例子中,我们使用了XML表单内的标准参数去进行实体查询,所以我么可以使用search-form-inputs子元素去自动生成处理字段。
    如果想知道参数会长啥样只要查看浏览器中的html代码即可。这些都是基于XML表单定义自动生成的。
    widgets.form-list
    该例子中定义的是个真实的表单,指定的是多条记录/行数据的“列表”表单(相对于“单个”表单)
    这里的name属性可以为任意值,但是需要XML界面内唯一
    这里的list属性参照的是动作actions块中的entity-find返回的结果,transaction属性参照的是界面定义最上面的transaction元素。
    ji既然目标是创建一个基于实体定义的表单,我们便给auto-fields-entity元素赋值为我们的Tutorial实体,设置field-type属性的值为find-display选项,表示会创建查询字段在头部并且在表格中生存并显示每条记录。
    指定字段:
    如果不想要默认的方式去生成description字段,要在form-list元素内添加一个field元素,并且跟在fields-entity元素之后
     
    <form-list name="ListTutorials" list="tutorialList"
    
            transition="findTutorial">
    
                <auto-fields-entity entity-name="Tutorial" field-type="find-display"/>
    
                 <field name="description">
    
                 <header-field show-order-by="true">
    
                     <text-find find-options="true"/>
    
                 </header-field>
    
                <default-field>
    
            <display/>
    
     
    
                   </default-field>
    
                </field>
    
            </form-list>
    

      

  • 相关阅读:
    再探最大公约数
    非旋treap
    初赛毒瘤汇总(持续更新中)
    架构漫谈阅读笔记五--以豆瓣得基础架构为例
    架构设计小论文
    第一阶段
    架构漫谈阅读笔记六--以淘宝数据魔方技术架构解析为例
    学习进度第八周
    架构漫谈阅读笔记一
    软件架构之 Refined Architecture阶段
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/5446585.html
Copyright © 2020-2023  润新知