本公開涉及計算機
技術(shù)領(lǐng)域:
:,尤其涉及一種用于控件渲染的表單權(quán)限控制方法和裝置。
背景技術(shù):
::在平常的業(yè)務(wù)審批過程中,需要各種各樣的業(yè)務(wù)表單,如請假申請需要填寫請假申請單、財務(wù)報銷申請需要填寫財務(wù)報銷申請單。業(yè)務(wù)表單在隨著業(yè)務(wù)流程的流轉(zhuǎn)過程中,不同的審批環(huán)節(jié),對表單中的不同的字段的可見性(是否可以看到)、可操作性(是否可以編輯)等要求不同。以請假申請為例,請假人姓名、請假天數(shù)、請假原因等字段需要請假人填寫,主管審批意見等字段則只能由主管填寫,請假人不可以填寫。在業(yè)務(wù)開發(fā)中,我們就需要按照業(yè)務(wù)環(huán)節(jié)或辦理人對表單中的字段進行授權(quán),即授權(quán)某些字段對特定業(yè)務(wù)環(huán)節(jié)或辦理人的可見性和可操作性。在現(xiàn)有技術(shù)中,通過設(shè)置每個字段對應(yīng)的控件的針對不同預(yù)置條件(即授權(quán)主體)的權(quán)限來生成權(quán)限控制數(shù)據(jù),該權(quán)限控制數(shù)據(jù)中包括了表單ID、預(yù)置條件的ID、控件ID以及授權(quán)情況的對應(yīng)關(guān)系。當某一預(yù)置條件(如張三)訪問該表單的時候,首先從根據(jù)張三的ID和表單的ID從數(shù)據(jù)庫中加載該權(quán)限控制數(shù)據(jù),然后遍歷所有控件,從而獲取權(quán)限數(shù)據(jù)中設(shè)置的對張三的控件權(quán)限。但是,由于預(yù)置條件很多,表單的控件更多,對于有的業(yè)務(wù)流程有上百個業(yè)務(wù)環(huán)節(jié),每個環(huán)節(jié)綁定不同的表單,每個表單內(nèi)的控件也會有幾十個甚至是上百個,如果采用上述現(xiàn)有技術(shù)的方法會生成大量的權(quán)限控制數(shù)據(jù),對存儲有很大的消耗。并且,由于表單和控件的數(shù)量非常多,如果對表單的控件進行遍歷處理,也會造成性能的大量消耗。技術(shù)實現(xiàn)要素:本公開的目的是提供一種用于控件渲染的表單權(quán)限控制方法和裝置,用于解決現(xiàn)有技術(shù)中生成大量權(quán)限控制數(shù)據(jù)噪聲的存儲量大以及在處理時性能消耗大的問題。為了實現(xiàn)上述目的,本公開提供一種用于控件渲染的表單權(quán)限控制方法,所述方法包括:當預(yù)置條件訪問表單時,獲取所述預(yù)置條件的狀態(tài)碼;判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果;根據(jù)所述每個控件的權(quán)限判斷結(jié)果確定需要渲染的控件;根據(jù)每個需要渲染的控件的權(quán)限判斷結(jié)果進行所述每個需要渲染的控件的自渲染。可選的,所述預(yù)置條件的狀態(tài)碼包括:所述預(yù)置條件的標識;或者,將所述預(yù)置條件的標識進行哈希計算得到的哈希值;或者,將所述預(yù)置條件的標識以及所述預(yù)置條件的屬性信息進行哈希計算得到的哈希值,所述預(yù)置條件的屬性信息包括:所述預(yù)置條件的權(quán)限、級別中的至少一者??蛇x的,所述每個控件的權(quán)限屬性為授權(quán)屬性時,所述判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果包括:判斷第一控件的權(quán)限屬性中是否包含所述狀態(tài)碼;所述第一控件為所述每個控件中的任一控件;當所述第一控件的權(quán)限屬性中包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件已授權(quán);當所述第一控件的權(quán)限屬性中不包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件未授權(quán)??蛇x的,所述每個控件的權(quán)限屬性為禁止屬性時,所述判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果包括:判斷第一控件的權(quán)限屬性中是否包含所述狀態(tài)碼;所述第一控件為所述每個控件中的任一控件;當所述第一控件的權(quán)限屬性中包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件未授權(quán);當所述第一控件的權(quán)限屬性中不包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件已授權(quán)??蛇x的,所述預(yù)置條件包括訪問所述表單的用戶,或者訪問所述表單的業(yè)務(wù)環(huán)節(jié),或者訪問所述表單的網(wǎng)絡(luò)鏈接。本公開還提供一種用于控件渲染的表單權(quán)限控制裝置,所述裝置包括:獲取模塊,用于當預(yù)置條件訪問表單時,獲取所述預(yù)置條件的狀態(tài)碼;判斷模塊,用于判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果;控件確定模塊,用于根據(jù)所述每個控件的權(quán)限判斷結(jié)果確定需要渲染的控件;渲染模塊,用于根據(jù)每個需要渲染的控件的權(quán)限判斷結(jié)果進行所述每個需要渲染的控件的自渲染??蛇x的,所述預(yù)置條件的狀態(tài)碼包括:所述預(yù)置條件的標識;或者,將所述預(yù)置條件的標識進行哈希計算得到的哈希值;或者,將所述預(yù)置條件的標識以及所述預(yù)置條件的屬性信息進行哈希計算得到的哈希值,所述預(yù)置條件的屬性信息包括:所述預(yù)置條件的權(quán)限、級別中的至少一者。可選的,所述每個控件的權(quán)限屬性為授權(quán)屬性時,所述判斷模塊用于:判斷第一控件的權(quán)限屬性中是否包含所述狀態(tài)碼;所述第一控件為所述每個控件中的任一控件;當所述第一控件的權(quán)限屬性中包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件已授權(quán);當所述第一控件的權(quán)限屬性中不包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件未授權(quán)??蛇x的,所述每個控件的權(quán)限屬性為禁止屬性時,所述判斷模塊用于:判斷第一控件的權(quán)限屬性中是否包含所述狀態(tài)碼;所述第一控件為所述每個控件中的任一控件;當所述第一控件的權(quán)限屬性中包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件未授權(quán);當所述第一控件的權(quán)限屬性中不包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件已授權(quán)??蛇x的,所述預(yù)置條件包括訪問所述表單的用戶,或者訪問所述表單的業(yè)務(wù)環(huán)節(jié),或者訪問所述表單的網(wǎng)絡(luò)鏈接。本公開提供的用于控件渲染的表單權(quán)限控制方法中,當預(yù)置條件訪問表單時,獲取所述預(yù)置條件的狀態(tài)碼,從而可以根據(jù)所述每個控件的預(yù)先設(shè)置的權(quán)限屬性來判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果,并根據(jù)所述每個控件的權(quán)限判斷結(jié)果確定需要渲染的控件,從而可以根據(jù)每個需要渲染的控件的權(quán)限判斷結(jié)果進行所述每個需要渲染的控件的自渲染。由于不需要預(yù)先生成大量權(quán)限控制數(shù)據(jù),因此能夠降低數(shù)據(jù)存儲量,并且由于各個控件可以根據(jù)權(quán)限判斷結(jié)果進行自渲染,因此避免了有現(xiàn)有遍歷處理的性能消耗問題,能夠降低性能消耗。本公開的其他特征和優(yōu)點將在隨后的具體實施方式部分予以詳細說明。附圖說明附圖是用來提供對本公開的進一步理解,并且構(gòu)成說明書的一部分,與下面的具體實施方式一起用于解釋本公開,但并不構(gòu)成對本公開的限制。在附圖中:圖1是根據(jù)本公開一實施例示出的一種用于控件渲染的表單權(quán)限控制方法的流程圖;圖2是根據(jù)本公開一實施例示出的另一種用于控件渲染的表單權(quán)限控制方法的流程圖;圖3是根據(jù)本公開一實施例示出的又一種用于控件渲染的表單權(quán)限控制方法的流程圖;圖4是根據(jù)本公開一實施例示出的一種用于控件渲染的表單權(quán)限控制裝置的框圖。具體實施方式以下結(jié)合附圖對本公開的具體實施方式進行詳細說明。應(yīng)當理解的是,此處所描述的具體實施方式僅用于說明和解釋本公開,并不用于限制本公開。圖1是根據(jù)本公開一實施例示出的一種用于控件渲染的表單權(quán)限控制方法的流程圖,參見圖1,該方法可以包括:步驟101,當預(yù)置條件訪問表單時,獲取所述預(yù)置條件的狀態(tài)碼。其中,預(yù)置條件可以理解為訪問表單的特定場景,或者理解為表單的訪問者,該訪問者可以是某一個人,某一個業(yè)務(wù)環(huán)節(jié)或者某一個網(wǎng)絡(luò)鏈接。例如,張三訪問某一表單,比如請假表單,那么張三就是該請假表單的預(yù)置條件。狀態(tài)碼是用來表示預(yù)置條件身份的信息,對于每一個預(yù)置條件而言具有唯一性。因此,狀態(tài)碼可以根據(jù)預(yù)置條件的具有唯一性的標識來確定,例如,如果訪問者為某一個人,則狀態(tài)碼可以根據(jù)這個人的用戶標識來確定,或者如果訪問者為一個網(wǎng)絡(luò)鏈接,則狀態(tài)碼可以根據(jù)這個網(wǎng)絡(luò)鏈接的連接地址來確定。另外,在確定狀態(tài)碼時,可以將上述的具有唯一性的標識直接作為狀態(tài)碼,也可是將該標識進行哈希運算后得到的數(shù)值作為狀態(tài)碼。另外,除了考慮上述的具有唯一性的標識,還可以考慮預(yù)置條件的其他屬性,例如權(quán)限信息,可以將預(yù)置條件的標識以及該權(quán)限信息共同進行哈希運算后得到的數(shù)值作為狀態(tài)碼。步驟102,判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果。其中,所述每個控件的權(quán)限屬性是預(yù)先設(shè)置的。步驟103,根據(jù)所述每個控件的權(quán)限判斷結(jié)果確定需要渲染的控件。其中,表單中的每個控件的權(quán)限屬性是預(yù)先配置好的,對于表單中的任一個控件而言,權(quán)限屬性可以是在該控件的已有屬性字段的基礎(chǔ)上擴展一部分新的字段,該每個控件可以配置多個功能的權(quán)限屬性,其中每個控件的每個功能的權(quán)限屬性中設(shè)置有該功能所授權(quán)(或禁止)的預(yù)置條件的狀態(tài)碼,從而當獲取某一預(yù)置條件的狀態(tài)碼后,將該狀態(tài)碼分別與表單中的每個控件的權(quán)限屬性中設(shè)置的狀態(tài)碼進行比較,就可以確定哪些控件的哪些功能對該預(yù)置條件授權(quán)(或禁止),從而就可以確定需要渲染哪些控件,以及每個需要渲染的控件的渲染程度。步驟104,根據(jù)每個需要渲染的控件的權(quán)限判斷結(jié)果進行所述每個需要渲染的控件的自渲染。其中,根據(jù)每個需要渲染的控件的權(quán)限判斷結(jié)果就可以得知每個需要渲染的控件中有哪些功能(例如可見、可編輯等)對該控件授權(quán)(或禁止),可以確定該控件的渲染程度,從而每個控件可以渲染成權(quán)限屬性所規(guī)定的程度。本公開提供的用于控件渲染的表單權(quán)限控制方法中,當預(yù)置條件訪問表單時,獲取所述預(yù)置條件的狀態(tài)碼,從而可以根據(jù)所述每個控件的預(yù)先設(shè)置的權(quán)限屬性來判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果,并根據(jù)所述每個控件的權(quán)限判斷結(jié)果確定需要渲染的控件,從而可以根據(jù)每個需要渲染的控件的權(quán)限判斷結(jié)果進行所述每個需要渲染的控件的自渲染。由于不需要預(yù)先生成大量權(quán)限控制數(shù)據(jù),因此能夠降低數(shù)據(jù)存儲量,并且由于各個控件可以根據(jù)權(quán)限判斷結(jié)果進行自渲染,因此避免了有現(xiàn)有遍歷處理的性能消耗問題,能夠降低性能消耗。需要說明的是,在圖1所示的方法之前,首先需要對表單中的控件的權(quán)限屬性以及預(yù)置條件對應(yīng)的權(quán)限進行設(shè)置,圖2是根據(jù)本公開一實施例示出的另一種用于控件渲染的表單權(quán)限控制方法的流程圖,參見圖2,在圖1所示的方法之前,該方法可以包括以下步驟:步驟105,為所述表單中的各個控件設(shè)置權(quán)限屬性。示例的,可以在各個控件的已有屬性字段的基礎(chǔ)上擴展一部分新的字段,用于表示該控件的不同功能的權(quán)限,例如可以設(shè)置visible、editable作為某個控件的權(quán)限屬性,分別表示該控件的可見權(quán)限和可編輯權(quán)限的屬性。步驟106,獲取各個預(yù)置條件的狀態(tài)碼。各個預(yù)置條件可以指可能訪問表單的所有預(yù)置條件,其中一個預(yù)置條件可能訪問一個或多個表單,如步驟101中所述,狀態(tài)碼是用來表示預(yù)置條件身份的信息,對于每一個預(yù)置條件而言具有唯一性。示例的,該狀態(tài)碼可以為:預(yù)置條件的標識(比如ID);或者,將該預(yù)置條件的標識進行哈希計算得到的哈希值;或者,將該預(yù)置條件的標識以及所述預(yù)置條件的屬性信息進行哈希計算得到的哈希值,所述預(yù)置條件的屬性信息包括:所述預(yù)置條件的權(quán)限、級別中的至少一者。其中,對于級別,如果預(yù)置條件是某個人,則級別可以是這個人的職務(wù)、用戶等級等,如果預(yù)置條件是某個業(yè)務(wù)環(huán)節(jié)或者網(wǎng)絡(luò)鏈接,則級別可以是它們的優(yōu)先級、重要級別等等。步驟107,將各個預(yù)置條件的狀態(tài)碼添加至對應(yīng)的控件的權(quán)限屬性中。在獲取各個預(yù)置條件的狀態(tài)碼后,根據(jù)每個預(yù)置條件實際擁有的權(quán)限,將每個預(yù)置條件的狀態(tài)碼添加在與其權(quán)限對應(yīng)的控件的權(quán)限屬性中,以控件A為例,假設(shè)控件A具有權(quán)限屬性包括:visible(可見)、editable(可編輯)兩個屬性,分別表示該控件A的可見權(quán)限和可編輯權(quán)限,如果訪問者張三具有可見控件A的權(quán)限但是沒有編輯控件A的權(quán)限,則可以將張三的狀態(tài)碼添加到控件A的visible中,但不能添加到editable中。圖3是根據(jù)本公開一實施例示出的又一種用于控件渲染的表單權(quán)限控制方法的流程圖,參見圖3,上述步驟102中所述的判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果的步驟可以包括:步驟1021,獲取預(yù)置條件的狀態(tài)碼后,向所述每個控件發(fā)送包含所述狀態(tài)碼的狀態(tài)碼更新事件。步驟1022,所述每個控件收到狀態(tài)碼更新事件后,獲取所述狀態(tài)碼。步驟1023,所述每個控件按照預(yù)設(shè)的順序逐個對比所述每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果。其中,每個控件的權(quán)限屬性不限于是授權(quán)屬性還是禁止屬性,例如對于控件的可見性,其權(quán)限屬性既可以是visible,也可以是invisible。下面以第一控件為例進行說明(所述第一控件為所述每個控件中的任一控件):所述每個控件的權(quán)限屬性為授權(quán)屬性時,所述判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果包括:判斷第一控件的權(quán)限屬性中是否包含所述狀態(tài)碼;當所述第一控件的權(quán)限屬性中包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件已授權(quán);當所述第一控件的權(quán)限屬性中不包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件未授權(quán)?;蛘?,所述每個控件的權(quán)限屬性為禁止屬性時,所述判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果的步驟包括:判斷第一控件的權(quán)限屬性中是否包含所述狀態(tài)碼;當所述第一控件的權(quán)限屬性中包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件未授權(quán);當所述第一控件的權(quán)限屬性中不包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件已授權(quán)。從而在步驟1023后,執(zhí)行步驟103所述的根據(jù)所述每個控件的權(quán)限判斷結(jié)果確定需要渲染的控件,以及步驟104所述的根據(jù)每個需要渲染的控件的權(quán)限判斷結(jié)果進行所述每個需要渲染的控件的自渲染。還是以控件A為例,假設(shè)控件A具有權(quán)限屬性包括:visible、editable兩個屬性,分別表示該控件A的可見權(quán)限和可編輯權(quán)限,當張三訪問表單時,表單向表單中的控件發(fā)送狀態(tài)碼更新事件,當控件A收到狀態(tài)碼更新事件后,獲取張三的狀態(tài)碼,并根據(jù)張三的狀態(tài)碼訪問控件A的editable屬性,從而能夠判斷控件A的editable屬性是否存在張三的狀態(tài)碼,若存在則說明張三具有控件A的編輯權(quán)限,若不存在張三的狀態(tài)碼則說明張三沒有控件A的編輯權(quán)限;而后再根據(jù)張三的狀態(tài)碼訪問控件A的visible屬性,從而能夠判斷控件A的visible屬性是否存在張三的狀態(tài)碼,若存在則說明張三具有控件A的可見權(quán)限,若不存在張三的狀態(tài)碼則說明張三沒有控件A的可見權(quán)限。假設(shè)張三具有控件A的可見權(quán)限,但是沒有控件A的編輯權(quán)限,則控件A根據(jù)這個權(quán)限判斷結(jié)果進行自渲染并展現(xiàn)給張三,張三對完成渲染的控件A只能看見但是不能編輯。比如控件A是某業(yè)務(wù)的審批控件,張三只能看到上級的審批結(jié)果,但是不能進行編輯。因此,通過上述技術(shù)方案,由于不需要預(yù)先生成大量權(quán)限控制數(shù)據(jù),因此能夠降低數(shù)據(jù)存儲量,并且由于各個控件可以根據(jù)權(quán)限判斷結(jié)果進行自渲染,因此避免了有現(xiàn)有遍歷處理的性能消耗問題,能夠降低性能消耗。圖4是根據(jù)本公開一實施例示出的一種用于控件渲染的表單權(quán)限控制裝置的框圖,所述裝置400可以用于執(zhí)行上述圖1~3任一所示的方法,參見圖4,所述裝400包括:獲取模塊410,用于當預(yù)置條件訪問表單時,獲取所述預(yù)置條件的狀態(tài)碼;判斷模塊420,用于判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果;控件確定模塊430,用于根據(jù)所述每個控件的權(quán)限判斷結(jié)果確定需要渲染的控件;渲染模塊440,用于根據(jù)每個需要渲染的控件的權(quán)限判斷結(jié)果進行所述每個需要渲染的控件的自渲染??蛇x的,所述預(yù)置條件的狀態(tài)碼包括:所述預(yù)置條件的標識;或者,將所述預(yù)置條件的標識進行哈希計算得到的哈希值;或者,將所述預(yù)置條件的標識以及所述預(yù)置條件的屬性信息進行哈希計算得到的哈希值,所述預(yù)置條件的屬性信息包括:所述預(yù)置條件的權(quán)限、級別中的至少一者??蛇x的,所述每個控件的權(quán)限屬性為授權(quán)屬性時,所述判斷模塊420用于:判斷第一控件的權(quán)限屬性中是否包含所述狀態(tài)碼;所述第一控件為所述每個控件中的任一控件;當所述第一控件的權(quán)限屬性中包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件已授權(quán);當所述第一控件的權(quán)限屬性中不包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件未授權(quán)??蛇x的,所述每個控件的權(quán)限屬性為禁止屬性時,所述判斷模塊420用于:判斷第一控件的權(quán)限屬性中是否包含所述狀態(tài)碼;所述第一控件為所述每個控件中的任一控件;當所述第一控件的權(quán)限屬性中包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件未授權(quán);當所述第一控件的權(quán)限屬性中不包含所述狀態(tài)碼時,確定所述第一控件對所述預(yù)置條件已授權(quán)??蛇x的,所述預(yù)置條件包括訪問所述表單的用戶,或者訪問所述表單的業(yè)務(wù)環(huán)節(jié),或者訪問所述表單的網(wǎng)絡(luò)鏈接。可見,本公開提供的用于控件渲染的表單權(quán)限控制裝置,通過在預(yù)置條件訪問表單時,獲取所述預(yù)置條件的狀態(tài)碼,從而可以根據(jù)所述每個控件的預(yù)先設(shè)置的權(quán)限屬性來判斷所述表單中的每個控件的權(quán)限屬性中是否包含所述狀態(tài)碼,得到所述每個控件的權(quán)限判斷結(jié)果,并根據(jù)所述每個控件的權(quán)限判斷結(jié)果確定需要渲染的控件,從而可以根據(jù)每個需要渲染的控件的權(quán)限判斷結(jié)果進行所述每個需要渲染的控件的自渲染。由于不需要預(yù)先生成大量權(quán)限控制數(shù)據(jù),因此能夠降低數(shù)據(jù)存儲量,并且由于各個控件可以根據(jù)權(quán)限判斷結(jié)果進行自渲染,因此避免了有現(xiàn)有遍歷處理的性能消耗問題,能夠降低性能消耗。以上結(jié)合附圖詳細描述了本公開的優(yōu)選實施方式,但是,本公開并不限于上述實施方式中的具體細節(jié),在本公開的技術(shù)構(gòu)思范圍內(nèi),可以對本公開的技術(shù)方案進行多種簡單變型,這些簡單變型均屬于本公開的保護范圍。另外需要說明的是,在上述具體實施方式中所描述的各個具體技術(shù)特征,在不矛盾的情況下,可以通過任何合適的方式進行組合,為了避免不必要的重復(fù),本公開對各種可能的組合方式不再另行說明。此外,本公開的各種不同的實施方式之間也可以進行任意組合,只要其不違背本公開的思想,其同樣應(yīng)當視為本公開所公開的內(nèi)容。當前第1頁1 2 3 當前第1頁1 2 3