Skip to content

Commit

Permalink
chore: deploy docs of project Nop Entropy via GitHub Actions
Browse files Browse the repository at this point in the history
  • Loading branch information
nop-cao committed Sep 14, 2024
1 parent 7713c81 commit 035c8ef
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 2 deletions.
4 changes: 3 additions & 1 deletion projects/nop-entropy/docs/compare/nop-vfs-ofbiz/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -1270,7 +1270,9 @@ <h2 id="数据源定义"><a href="#数据源定义" class="headerlink" title="
<p>这里体现了Nop平台的做法:能够利用通用机制实现的组织,绝不会引入一个特定的仅具有狭窄用途的配置文件。引入这种配置文件还需要实现解析、装配、应用等功能,而利用IoC容器的标准功能,根本不需要做任何额外工作。</p>
<h2 id="MVC框架"><a href="#MVC框架" class="headerlink" title="MVC框架"></a>MVC框架</h2><h2 id="实体引擎-Entity-Engine"><a href="#实体引擎-Entity-Engine" class="headerlink" title="实体引擎(Entity Engine)"></a>实体引擎(Entity Engine)</h2><p>OFBiz的<code>entitymodel.xml</code>定义可以直接转换为Nop平台的<code>orm.xml</code>模型文件。</p>
<h2 id="元模型定义"><a href="#元模型定义" class="headerlink" title="元模型定义"></a>元模型定义</h2><p>OFBiz使用的xsd语法非常臃肿,而且引入了完全不必要的顺序依赖。</p>
<h2 id="服务引擎-Service-Engine"><a href="#服务引擎-Service-Engine" class="headerlink" title="服务引擎(Service Engine)"></a>服务引擎(Service Engine)</h2><p>与程序语言无关</p>
<h2 id="服务引擎-Service-Engine"><a href="#服务引擎-Service-Engine" class="headerlink" title="服务引擎(Service Engine)"></a>服务引擎(Service Engine)</h2><p>与程序语言无关。输入是Map,输出也是Map</p>
<p>You can also override a service by using the same name down in the deployment context (which is first framework, then themes, then applications, then specialpurpose, then hot-deploy)</p>
<p>ECA (Event Condition Action) is much like a trigger. When a service is called, a lookup is performed to see if any ECAs are defined for this event.</p>
<h2 id="组件系统-Widget-System"><a href="#组件系统-Widget-System" class="headerlink" title="组件系统(Widget System)"></a>组件系统(Widget System)</h2><p>类似于报表引擎,可以产生多种输出形式。CSV,HTML,PDF等</p>
<h2 id="数据模型-Data-Model"><a href="#数据模型-Data-Model" class="headerlink" title="数据模型(Data Model)"></a>数据模型(Data Model)</h2><p>可以直接复用</p>
<h2 id="服务库-Service-Library"><a href="#服务库-Service-Library" class="headerlink" title="服务库(Service Library)"></a>服务库(Service Library)</h2><p>并不是完全的声明式表达</p>
Expand Down
8 changes: 7 additions & 1 deletion projects/nop-entropy/docs/dev-guide/codegen/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -1266,7 +1266,7 @@ <h1 class="Article-title">Maven集成代码生成器</h1>
<p>例如<code>nop-auth-service</code>模块中precompile阶段根据<code>nop-auth-dao</code>模块中的orm模型生成meta模型,而postcompile阶段根据当前工程中的meta模型生成i18n配置文件。</p>
</blockquote>
<h2 id="在Maven之外调用代码生成器"><a href="#在Maven之外调用代码生成器" class="headerlink" title="在Maven之外调用代码生成器"></a>在Maven之外调用代码生成器</h2><p><code>CodeGenTask</code>是一个普通的java类,可以在Maven外直接调用。例如</p>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">NopOrmCodeGen</span> &#123;<br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">main</span><span class="hljs-params">(String[] args)</span> &#123;<br> AppConfig.getConfigProvider().updateConfigValue(CoreConfigs.CFG_CORE_MAX_INITIALIZE_LEVEL,<br> CoreConstants.INITIALIZER_PRIORITY_ANALYZE);<br> <br> CoreInitialization.initialize();<br> <span class="hljs-keyword">try</span> &#123;<br> <span class="hljs-type">File</span> <span class="hljs-variable">projectDir</span> <span class="hljs-operator">=</span> MavenDirHelper.projectDir(NopOrmCodeGen.class);<br> <span class="hljs-type">String</span> <span class="hljs-variable">targetRootPath</span> <span class="hljs-operator">=</span> FileHelper.getFileUrl(<span class="hljs-keyword">new</span> <span class="hljs-title class_">File</span>(projectDir, <span class="hljs-string">&quot;src/main/java&quot;</span>));<br> <span class="hljs-type">XCodeGenerator</span> <span class="hljs-variable">generator</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">XCodeGenerator</span>(<span class="hljs-string">&quot;/nop/templates/orm-entity&quot;</span>, targetRootPath);<br> <span class="hljs-type">IResource</span> <span class="hljs-variable">resource</span> <span class="hljs-operator">=</span> VirtualFileSystem.instance().getResource(<span class="hljs-string">&quot;/nop/test/orm/app.orm.xml&quot;</span>);<br> <span class="hljs-type">OrmModel</span> <span class="hljs-variable">ormModel</span> <span class="hljs-operator">=</span> (OrmModel) DslModelHelper.loadDslModel(resource);<br> generator.execute(<span class="hljs-string">&quot;&quot;</span>, Collections.singletonMap(<span class="hljs-string">&quot;ormModel&quot;</span>, ormModel), XLang.newEvalScope());<br> &#125; <span class="hljs-keyword">finally</span> &#123;<br> CoreInitialization.destroy();<br> &#125;<br> &#125;<br>&#125;<br></code></pre></td></tr></table></figure>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">NopOrmCodeGen</span> &#123;<br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">main</span><span class="hljs-params">(String[] args)</span> &#123;<br> AppConfig.getConfigProvider().updateConfigValue(CoreConfigs.CFG_CORE_MAX_INITIALIZE_LEVEL,<br> CoreConstants.INITIALIZER_PRIORITY_ANALYZE);<br><br> CoreInitialization.initialize();<br> <span class="hljs-keyword">try</span> &#123;<br> <span class="hljs-type">File</span> <span class="hljs-variable">projectDir</span> <span class="hljs-operator">=</span> MavenDirHelper.projectDir(NopOrmCodeGen.class);<br> <span class="hljs-type">String</span> <span class="hljs-variable">targetRootPath</span> <span class="hljs-operator">=</span> FileHelper.getFileUrl(<span class="hljs-keyword">new</span> <span class="hljs-title class_">File</span>(projectDir, <span class="hljs-string">&quot;src/main/java&quot;</span>));<br> <span class="hljs-type">XCodeGenerator</span> <span class="hljs-variable">generator</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">XCodeGenerator</span>(<span class="hljs-string">&quot;/nop/templates/orm-entity&quot;</span>, targetRootPath);<br> <span class="hljs-type">IResource</span> <span class="hljs-variable">resource</span> <span class="hljs-operator">=</span> VirtualFileSystem.instance().getResource(<span class="hljs-string">&quot;/nop/test/orm/app.orm.xml&quot;</span>);<br> <span class="hljs-type">OrmModel</span> <span class="hljs-variable">ormModel</span> <span class="hljs-operator">=</span> (OrmModel) DslModelHelper.loadDslModel(resource);<br> generator.execute(<span class="hljs-string">&quot;&quot;</span>, Collections.singletonMap(<span class="hljs-string">&quot;ormModel&quot;</span>, ormModel), XLang.newEvalScope());<br> &#125; <span class="hljs-keyword">finally</span> &#123;<br> CoreInitialization.destroy();<br> &#125;<br> &#125;<br>&#125;<br></code></pre></td></tr></table></figure>

<p>Nop平台提供了XLang语言的Idea调试插件,可以在xgen文件中增加断点进行调试。参见<a href="../../user-guide/idea/idea-plugin/">idea-plugin.md</a></p>
<p>根据Excel数据模型生成的代码工程中, <code>xxx-codegen</code>模块以及<code>xxx-web</code>模块中都包含了一个<code>CodeGen.java</code>类,例如<code>NopAuthCodeGen</code><code>NopAuthWebCodeGen</code><br>使用它们可以在IDEA中直接执行代码生成逻辑,而不用通过Maven工具来执行。Maven工具执行时总是先执行Java编译过程,影响性能。</p>
Expand Down Expand Up @@ -1322,6 +1322,12 @@ <h3 id="表达式特殊约定"><a href="#表达式特殊约定" class="headerlin
<li><p><code>&#123;data.@mapper&#125;</code> 属性表达式存在一种特殊的约定。对于HashSet或者LinkedHashSet类型,<code>@mapper</code>属性会判断集合中是否存在该文本值。<br>相当于 <code>((Set)data).contains(&#39;mapper&#39;)</code></p>
</li>
</ol>
<h3 id="xgen模板文件"><a href="#xgen模板文件" class="headerlink" title="xgen模板文件"></a>xgen模板文件</h3><p>xgen本质上就是xpl模板语言,它动态执行输出内容。xpl模板语言中可以通过<code>&lt;c:for&gt;</code><code>&lt;c:script&gt;</code>等标签执行逻辑,并通过<code>&lt;c:import&gt;</code>来导入标签库。<br>xpl还提供了<code>&lt;c:print&gt;</code>这种标签用于原样输出它的body内容,即使其中包含<code>c:script</code>等标签。</p>
<p>例如</p>
<figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">c:unit</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">c:script</span>&gt;</span><br> let n = 100; // 设置一个变量,可以执行复杂的XScript代码<br> <span class="hljs-tag">&lt;/<span class="hljs-name">c:script</span>&gt;</span><br><br> <span class="hljs-comment">&lt;!-- 通过表达式可以使用当前环境中的变量。xpl模板语言提供了c:for等标签用于实现循环逻辑 --&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">c:for</span> <span class="hljs-attr">var</span>=<span class="hljs-string">&quot;i&quot;</span> <span class="hljs-attr">begin</span>=<span class="hljs-string">&quot;$&#123;1&#125;&quot;</span> <span class="hljs-attr">end</span>=<span class="hljs-string">&quot;$&#123;n&#125;&quot;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">div</span>/&gt;</span><br> <span class="hljs-tag">&lt;/<span class="hljs-name">c:for</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">c:unit</span>&gt;</span><br></code></pre></td></tr></table></figure>
<p>上面的代码会输出100个<code>&lt;div&gt;</code>节点。</p>
<p><code>c:script</code>就是编译成一个Expression,然后<code>expr.invoke(scope)</code>, 在当前的scope中执行。scope中的数据就是 <code>@init.xrun</code>中准备的。在<code>@init.xurn</code><code>assign(&quot;x&quot;,1&quot;)</code>可以向scope中设置变量。另外<code>builder.defineGlobalVar(&#39;basePackagePath&#39;, pkgPath)</code>等也会设置变量。</p>
<p>xpl模板语言的介绍参见<a href="../xlang/xpl/">xpl.md</a></p>
<h2 id="二-差量化的代码生成器"><a href="#二-差量化的代码生成器" class="headerlink" title="二. 差量化的代码生成器"></a>二. 差量化的代码生成器</h2><p>如果我们不把代码生成器看作是某种一次性的、临时使用的外围工具,而是把它作为元编程的一个有机组成部分,则代码生成器必然是支持增量生成的。所谓增量生成,是指代码生成器允许反复执行,且同时允许手工修改输出产物,自动生成和手工修改的部分都可以看作是对初次生成结果的增量化修改,并且它们会自动合并在一起。</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><code class="hljs plaintext">Result = FirstGeneration + AutoGenDelta + ManualDelta<br></code></pre></td></tr></table></figure>

Expand Down
2 changes: 2 additions & 0 deletions projects/nop-entropy/docs/dev-guide/orm/orm-basic/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -1328,6 +1328,8 @@ <h3 id="如果要手工打开session,可以采用如下方法"><a href="#如
<p>事务管理类似</p>
<figure class="highlight javascript"><table><tr><td class="code"><pre><code class="hljs javascript"><br>@<span class="hljs-title class_">Inject</span><br><span class="hljs-title class_">ITransactionTemplate</span> transactionTemplate;<br><br>transactionTemplate.<span class="hljs-title function_">runInTransaction</span>(txn-&gt;&#123;<br> ...<br>&#125;)<br></code></pre></td></tr></table></figure>

<h2 id="OrmEntity实体属性"><a href="#OrmEntity实体属性" class="headerlink" title="OrmEntity实体属性"></a>OrmEntity实体属性</h2><p>NopORM中的所有实体类都从OrmEntity类继承。OrmEntity不支持JSON序列化,但是提供了帮助函数可以获取实体上的字段值。</p>
<p>实体上当前的字段值是 <code>entity.orm_initedValues()</code>, 修改前的值是 <code>orm_dirtyOldValues()</code></p>
<h2 id="与MyBatis的区别"><a href="#与MyBatis的区别" class="headerlink" title="与MyBatis的区别"></a>与MyBatis的区别</h2><p>NopORM是一个类似JPA的完整的ORM引擎,因此它使用OrmSession来管理所有加载到内存中的实体,整体使用类似于JPA和Hibernate,相比于MyBatis要少很多手工调用步骤。</p>
<h3 id="1-修改的时候不需要调用update方法。"><a href="#1-修改的时候不需要调用update方法。" class="headerlink" title="1. 修改的时候不需要调用update方法。"></a>1. 修改的时候不需要调用update方法。</h3><p>一般情况下我们是使用IEntityDao接口来实现实体的增删改查。它内部使用OrmTemplate来调用底层的NopORM引擎。<br>OrmTemplate类似于Spring中的HibernateTemplate,调用它上面的方法时会自动打开OrmSession,并在操作完毕后调用<code>session.flush()</code><br>来将内存中的修改刷新到数据库中。</p>
<p>因此从数据库中加载到实体之后,我们只需要调用set方法即可,不需要调用任何update方法,引擎会负责检测实体是否已经被修改,如果已经被修改,则自动更新数据库。<br>更新数据库的时候与MyBatis不同,NopORM会自动根据修改了的字段生成对应的update语句,因此即使调用了set方法,但是如果实际并没有修改实体属性,则最后实体的状态不会转化为dirty,也就不会更新数据库。</p>
Expand Down

0 comments on commit 035c8ef

Please sign in to comment.