天天看點

基于實體模型開發主題管理簡析

實體模型主要實作單表操作(insert, update, delete, select),凡是需要這4條sql語句要完成的功能,基本上都可以完成。多表處理的,需要用到關系模型,後續專門講述。

裡面有詳細的模型配置檔案,但隻是一個結果而已,接下來,對其進行詳細剖析,講述如何進進行配置。

<a href="http://my.oschina.net/tinyframework/blog/166843#">?</a>

1

2

<code>&lt;</code><code>entity-model</code> <code>id</code><code>=</code><code>"theme"</code> <code>name</code><code>=</code><code>"theme"</code> <code>title</code><code>=</code><code>"主題"</code>

<code>    </code><code>enable-delete</code><code>=</code><code>"true"</code> <code>enable-modity</code><code>=</code><code>"true"</code> <code>version</code><code>=</code><code>"2.0"</code> <code>cache-enabled</code><code>=</code><code>"true"</code><code>&gt;</code>

上面是根節點,描述了模型的基本資訊,幾鼐enable-開頭的标記,主要是為工具提供的參數,使得工具進行處理時,通過這些參數控制對文檔的編輯,删除等處理。

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<code>&lt;</code><code>groups</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>group</code> <code>id</code><code>=</code><code>"basicgroup"</code> <code>name</code><code>=</code><code>"basicgroup"</code> <code>title</code><code>=</code><code>"基本字段"</code>

<code>    </code><code>enable-delete</code><code>=</code><code>"true"</code> <code>enable-modity</code><code>=</code><code>"true"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>field</code> <code>standard-field-id</code><code>=</code><code>"theme_id"</code> <code>primary</code><code>=</code><code>"true"</code> <code>unique</code><code>=</code><code>"true"</code>

<code>      </code><code>display</code><code>=</code><code>"false"</code> <code>not-null</code><code>=</code><code>"false"</code> <code>auto-increase</code><code>=</code><code>"false"</code> <code>editable</code><code>=</code><code>"false"</code>

<code>      </code><code>hidden</code><code>=</code><code>"false"</code> <code>table-field</code><code>=</code><code>"true"</code> <code>id</code><code>=</code><code>"theme_id"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>field</code> <code>standard-field-id</code><code>=</code><code>"theme_code"</code> <code>primary</code><code>=</code><code>"false"</code> <code>unique</code><code>=</code><code>"false"</code>

<code>      </code><code>hidden</code><code>=</code><code>"false"</code> <code>table-field</code><code>=</code><code>"true"</code> <code>id</code><code>=</code><code>"theme_code"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>field</code> <code>standard-field-id</code><code>=</code><code>"theme_title"</code> <code>primary</code><code>=</code><code>"false"</code> <code>unique</code><code>=</code><code>"false"</code>

<code>      </code><code>hidden</code><code>=</code><code>"false"</code> <code>table-field</code><code>=</code><code>"true"</code> <code>id</code><code>=</code><code>"theme_title"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>field</code> <code>standard-field-id</code><code>=</code><code>"theme_css_path"</code> <code>primary</code><code>=</code><code>"false"</code>

<code>      </code><code>unique</code><code>=</code><code>"false"</code> <code>display</code><code>=</code><code>"false"</code> <code>not-null</code><code>=</code><code>"false"</code> <code>auto-increase</code><code>=</code><code>"false"</code>

<code>      </code><code>editable</code><code>=</code><code>"false"</code> <code>hidden</code><code>=</code><code>"false"</code> <code>table-field</code><code>=</code><code>"true"</code> <code>id</code><code>=</code><code>"theme_css_path"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>field</code> <code>standard-field-id</code><code>=</code><code>"theme_thumbnail"</code> <code>primary</code><code>=</code><code>"false"</code>

<code>      </code><code>editable</code><code>=</code><code>"false"</code> <code>hidden</code><code>=</code><code>"false"</code> <code>table-field</code><code>=</code><code>"true"</code> <code>id</code><code>=</code><code>"theme_thumbnail"</code> <code>/&gt;</code>

<code>  </code><code>&lt;/</code><code>group</code><code>&gt;</code>

<code>&lt;/</code><code>groups</code><code>&gt;</code>

上面定義了實體模型中的字段,一個實體的字段可以分成多個分組,這樣即便于展現,又便于管理。所有字段都是引用标準字段的,标準字段相關内容參見中繼資料相關文章。其中field的屬性:

<code>table-field="true"</code>

定義了其是否是一個表字段,實體模型對象與資料表是一一對應的,但是實體模型中的字段不一定都是建表所有的。

比如:我們要做一個使用者管理,其中要做一個修改密碼的功能,一般來說,修改密碼都有一個重複輸入密碼的框來進行驗證,避免使用者打入時不小心輸入錯誤,而無法登入的問題。很顯然,我們在做功能的時候是需要有這個域的,但是在資料庫表中,是不需要有這麼個字段的,是以,可以通過配置其屬性table-field="false",來增加這個域,但是以建表的時候,又忽略它。

如此,就可以把模型的字段定義好了。

模型上,有兩種類型的操作對象可以配置,一種是操作,一種是視圖。

下面逐個進行分析:

首先是建立操作

21

<code>&lt;</code><code>operation</code> <code>id</code><code>=</code><code>"thememodelopadduuid"</code> <code>name</code><code>=</code><code>"addtheme"</code> <code>title</code><code>=</code><code>"新增"</code>

<code>  </code><code>enable-delete</code><code>=</code><code>"true"</code> <code>enable-modity</code><code>=</code><code>"true"</code> <code>type</code><code>=</code><code>"add"</code> <code>fixed-size</code><code>=</code><code>"false"</code>

<code>  </code><code>modal</code><code>=</code><code>"true"</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>operation-group</code> <code>id</code><code>=</code><code>"addopbasicgroup"</code> <code>name</code><code>=</code><code>"basicgroup"</code>

<code>    </code><code>title</code><code>=</code><code>"操作字段"</code> <code>enable-delete</code><code>=</code><code>"true"</code> <code>enable-modity</code><code>=</code><code>"true"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>operation-fields</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>operation-field</code> <code>editable</code><code>=</code><code>"true"</code> <code>hidden</code><code>=</code><code>"false"</code>

<code>        </code><code>field-id</code><code>=</code><code>"theme_code"</code> <code>/&gt;</code>

<code>        </code><code>field-id</code><code>=</code><code>"theme_title"</code> <code>/&gt;</code>

<code>        </code><code>field-id</code><code>=</code><code>"theme_css_path"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>input-mode</code> <code>type</code><code>=</code><code>"textwholelinemode"</code><code>&gt;&lt;/</code><code>input-mode</code><code>&gt;</code>

<code>      </code><code>&lt;/</code><code>operation-field</code><code>&gt;</code>

<code>        </code><code>field-id</code><code>=</code><code>"theme_thumbnail"</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>operation-fields</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>operation-group</code><code>&gt;</code>

<code>&lt;/</code><code>operation</code><code>&gt;</code>

操作的基本描述:

type="add",是指這個操作的操作類型是什麼,可選的範圍在模型類型定義檔案中擷取,fixed-size表示視窗大小是否允許修改,如果是true,則表示不允許修改,如果是false,則可以修改。modal屬性标明了是否是模式視窗,建議所有的操作都采用模式視窗方式。

<code>&lt;</code><code>operation-group</code> <code>id</code><code>=</code><code>"addopbasicgroup"</code> <code>name</code><code>=</code><code>"basicgroup"</code>

操作分組,是一個嵌套結構,也就是說operation-group 節點下面可以有多個operation-group節點,上面隻包含了基本的資訊,實際上它下面還有大量的其它屬性可用。

display-mode表明分組的顯示方式,其值可以為:tab,fieldset,wizard,expander,accordion,carousel等,以控制字段的顯示方式,實際上,通過配置display-mode及多層分組可以做出非常漂亮的界面組織形式,強烈建議必須掌握。如果不會用display-mode和operation-group嵌套,做出來的界面隻能叫normal,如果會用的話,做出來的界面就是professional,差别是非常大的。

有時,界面中還要引用其它操作或視圖的内容,顯示在目前操作界面中。此時可以在operation-group節點下添加reference節點來完成:

<code>&lt;</code><code>reference</code> <code>id</code><code>=</code><code>""</code> <code>type</code><code>=</code><code>"operation|view"</code> <code>model-id</code><code>=</code><code>""</code> <code>/&gt;</code>

id為所引用對象的id,type可以有兩種選擇,operation或view,model-id表示引用的模型的id,如果是目前模型,則可以忽略。

當然,引用的内容也有可能來自其它頁面,這個時候可以用屬性url=""的方式進行指定。

好吧,由于我們的主題管理太過簡單,是以這些内容都沒有用到,先跳過之。

<code>&lt;</code><code>operation-field</code> <code>editable</code><code>=</code><code>"true"</code> <code>hidden</code><code>=</code><code>"false"</code>

指操作時用的字段,它隻能從group中的field中進行引用。editable="true" 表示是否可編輯,hidden="false"表示是否隐藏。在它下面可以添加子節點input-mode,可以用來指定各種輸入模式,如果不指定則表示用标準的文本輸入框模式

<code>&lt;</code><code>input-mode</code> <code>type</code><code>=</code><code>"textwholelinemode"</code><code>&gt;&lt;/</code><code>input-mode</code><code>&gt;</code>

通過指定輸入模式,可以把我們的界面中的輸入形式豐富起來。 

對于添加操作來說,沒有查詢字段,對于修改和删除字段,則需要添加查詢字段,一般來說是主鍵,如果不配置查詢字段,後續會非常嚴重!會導緻全表删除或修改。

在修改及删除中就存在查詢字段,來控制修改的範圍。

<code>&lt;</code><code>condition-fields</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>condition-field</code> <code>editable</code><code>=</code><code>"false"</code> <code>hidden</code><code>=</code><code>"false"</code>

<code>    </code><code>field-id</code><code>=</code><code>"theme_id"</code> <code>connect-mode</code><code>=</code><code>"and"</code> <code>/&gt;</code>

<code>&lt;/</code><code>condition-fields</code><code>&gt;</code>

其它的操作,基本類似。

22

23

24

25

26

27

<code>&lt;</code><code>view</code> <code>id</code><code>=</code><code>"thememodeloptableuuid"</code> <code>name</code><code>=</code><code>"tabletheme"</code> <code>title</code><code>=</code><code>"主題管理"</code>

<code>  </code><code>enable-delete</code><code>=</code><code>"true"</code> <code>enable-modity</code><code>=</code><code>"true"</code> <code>type</code><code>=</code><code>"table"</code> <code>page-size</code><code>=</code><code>"10"</code>

<code>  </code><code>allow-edit</code><code>=</code><code>"false"</code> <code>allow-filter-front</code><code>=</code><code>"false"</code> <code>fixed-size</code><code>=</code><code>"false"</code>

<code>  </code><code>modal</code><code>=</code><code>"false"</code> <code>front-paging</code><code>=</code><code>"false"</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>view-groups</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>view-group</code> <code>id</code><code>=</code><code>"viewbasicgroup"</code> <code>name</code><code>=</code><code>"basicgroup"</code> <code>title</code><code>=</code><code>"基本資訊"</code>

<code>      </code><code>enable-delete</code><code>=</code><code>"true"</code> <code>enable-modity</code><code>=</code><code>"true"</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>display-field</code> <code>editable</code><code>=</code><code>"false"</code> <code>hidden</code><code>=</code><code>"true"</code>

<code>        </code><code>field-id</code><code>=</code><code>"theme_id"</code> <code>aggregate-by-view</code><code>=</code><code>"false"</code> <code>/&gt;</code>

<code>      </code><code>&lt;</code><code>display-field</code> <code>editable</code><code>=</code><code>"false"</code> <code>hidden</code><code>=</code><code>"false"</code>

<code>        </code><code>field-id</code><code>=</code><code>"theme_code"</code> <code>aggregate-by-view</code><code>=</code><code>"false"</code> <code>/&gt;</code>

<code>        </code><code>field-id</code><code>=</code><code>"theme_title"</code> <code>aggregate-by-view</code><code>=</code><code>"false"</code> <code>/&gt;</code>

<code>    </code><code>&lt;/</code><code>view-group</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>view-groups</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>references</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>operation-reference</code> <code>type</code><code>=</code><code>"operation"</code> <code>id</code><code>=</code><code>"thememodelopadduuid"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>operation-reference</code> <code>type</code><code>=</code><code>"operation"</code>

<code>      </code><code>id</code><code>=</code><code>"thememodelopaddcopyuuid"</code> <code>/&gt;</code>

<code>      </code><code>id</code><code>=</code><code>"thememodelopdeleteuuid"</code> <code>/&gt;</code>

<code>      </code><code>id</code><code>=</code><code>"thememodelopupdateuuid"</code> <code>/&gt;</code>

<code>      </code><code>id</code><code>=</code><code>"thememodelopqueryuuid"</code> <code>/&gt;</code>

<code>  </code><code>&lt;/</code><code>references</code><code>&gt;</code>

<code>&lt;/</code><code>view</code><code>&gt;</code>

視圖節點描述,除了基本的資訊之外,需要注意的是type="table",這個類型可以有多種選擇,具體參照模型類型定義檔案 ,這裡的是表格。後面定義了分布大小,視窗是否固定大小,是否模式視窗,是否支援前台分頁等。

view-groups中可以有多個group,如果有多個group,支援二層表頭模式,大緻如下:

基于實體模型開發主題管理簡析

<code>&lt;</code><code>view-groups</code><code>&gt;</code>

下面是引用的操作,引用了操作或視圖後,可以在操作清單中顯示相關的按鈕,以便于進行相應的操作。

<code>&lt;</code><code>references</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>operation-reference</code> <code>type</code><code>=</code><code>"operation"</code> <code>id</code><code>=</code><code>"thememodelopadduuid"</code> <code>/&gt;</code>

<code>  </code><code>&lt;</code><code>operation-reference</code> <code>type</code><code>=</code><code>"operation"</code>

<code>    </code><code>id</code><code>=</code><code>"thememodelopaddcopyuuid"</code> <code>/&gt;</code>

<code>    </code><code>id</code><code>=</code><code>"thememodelopdeleteuuid"</code> <code>/&gt;</code>

<code>    </code><code>id</code><code>=</code><code>"thememodelopupdateuuid"</code> <code>/&gt;</code>

<code>    </code><code>id</code><code>=</code><code>"thememodelopqueryuuid"</code> <code>/&gt;</code>

<code>&lt;/</code><code>references</code><code>&gt;</code>

上面就引用了添加,修改删除,複制添加等操作。具體如下圖所示:

基于實體模型開發主題管理簡析

下面是選擇并修改主題的視圖:

<code>&lt;</code><code>view</code> <code>id</code><code>=</code><code>"thememodelopcarduuid"</code> <code>name</code><code>=</code><code>"cardtheme"</code> <code>title</code><code>=</code><code>"主題選擇"</code>

<code>  </code><code>enable-delete</code><code>=</code><code>"true"</code> <code>enable-modity</code><code>=</code><code>"true"</code> <code>type</code><code>=</code><code>"card"</code> <code>page-size</code><code>=</code><code>"0"</code>

<code>  </code><code>allow-edit</code><code>=</code><code>"false"</code> <code>allow-filter-front</code><code>=</code><code>"true"</code> <code>fixed-size</code><code>=</code><code>"false"</code>

<code>  </code><code>&lt;</code><code>customize-stage-configs</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>customize-stage-config</code> <code>stage-name</code><code>=</code><code>"card"</code>

<code>      </code><code>view-path</code><code>=</code><code>"/biz/theme/theme_card.page"</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>customize-stage-config</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>customize-stage-configs</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>condition-fields</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>condition-fields</code><code>&gt;</code>

<code>        </code><code>field-id</code><code>=</code><code>"theme_css_path"</code> <code>aggregate-by-view</code><code>=</code><code>"false"</code> <code>/&gt;</code>

<code>        </code><code>field-id</code><code>=</code><code>"theme_thumbnail"</code> <code>aggregate-by-view</code><code>=</code><code>"false"</code> <code>/&gt;</code>

從配置可以看到,采用的類型是card類型,也就是卡片。

由于其渲染方式比較特殊,是以采用下面的配置來修改渲染模闆為自定義模闆:

<code>&lt;</code><code>customize-stage-configs</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>customize-stage-config</code> <code>stage-name</code><code>=</code><code>"card"</code>

<code>    </code><code>view-path</code><code>=</code><code>"/biz/theme/theme_card.page"</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>customize-stage-config</code><code>&gt;</code>

<code>&lt;/</code><code>customize-stage-configs</code><code>&gt;</code>

theme_card.page的檔案内容如下: 

<code>#@wijdialog("${modeldefine.id}_${operationdefine.id}" "${operationdefine.title}" "" $option $captionbuttons)</code>

<code>#foreach($bean in $modelprocessresult.beans)</code>

<code>    </code><code>&lt;</code><code>a</code> <code>href</code><code>=</code><code>"javascript:dochangetheme('${tiny_context_path}$bean.themecsspath')"</code><code>&gt;&lt;</code><code>img</code> <code>title</code><code>=</code><code>"$bean.themetitle"</code> <code>style</code><code>=</code><code>"float:left;border:1px solid;margin:5px 5px;width:50pt;"</code> <code>src</code><code>=</code><code>"${tiny_context_path}$bean.themethumbnail"</code> <code>/&gt;&lt;/</code><code>a</code><code>&gt;</code>

<code>#end</code>

<code>#end##dialog</code>

<code>&lt;</code><code>script</code><code>&gt;</code>

<code>    </code><code>function dochangetheme(path){</code>

<code>        </code><code>var list=$("link");</code>

<code>        </code><code>for(var i=0;i&lt;</code><code>list.length</code><code>;i++){</code>

<code>            </code><code>var</code><code>link</code><code>=</code><code>list</code><code>.get(i);</code>

<code>            </code><code>var</code><code>pos</code><code>=</code><code>link</code><code>.href.indexof("/themes/");</code>

<code>            </code><code>if(pos&gt;0){</code>

<code>                </code><code>pos=link.href.indexof(contextpath+"/");</code>

<code>                </code><code>link.href=link.href.substr(0,pos)+ path;</code>

<code>            </code><code>}</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

<code>&lt;/</code><code>script</code><code>&gt;</code>

就産生了下面的視窗:

基于實體模型開發主題管理簡析

是以,隻需要通過簡單的配置就可以生成非常漂亮的界面。實際上,還支援資料校驗等功能,上面沒有示範。

隻要在group下的field節點下,增加下面的節點即可:

<code>&lt;</code><code>validate-rules</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>validate-rule</code> <code>rule-name</code><code>=</code><code>"required"</code> <code>/&gt;</code>

<code>  </code><code>&lt;</code><code>validate-rule</code> <code>rule-name</code><code>=</code><code>"max"</code> <code>rule-value</code><code>=</code><code>"30"</code><code>/&gt;</code>

<code>&lt;/</code><code>validate-rules</code><code>&gt;</code>

這裡的校驗規則同時支援前背景校驗,也就是說,js校驗首先會通不過。

如果被使用者禁用了前台校驗,直接向背景送出資料,還會進行一次背景資料校驗,確定資料的合法有效。

當然,上面的文章還隻是簡明扼要的講一下,詳細參見開發手冊。