JHipster一知半解- 4.6.4 webapp-shared目錄-2

回文集目錄:JHipster一知半解

constants目錄

error.constants.ts

與后臺ErrorConstants.java對應,定義出錯情況的url地址

pagination.constants.ts

就一個值,每頁顯示的項目數(shù),初始化NgbPaginationConfig時候有用到。

export const ITEMS_PER_PAGE = 20;

language目錄

find-language-from-key.pipe.ts

定義了一個findLanguageFromKey管道,進行語種簡寫到語種全稱之間的對照。

P.S //jhipster-needle-××這樣的注釋,一般說明這邊的代碼是由jhipster的jhi命令進行管理的,通常情況下,我們不需要手工編輯修改。

language.constants.ts

定義了LANGUAGES數(shù)組,表示工程支出的語種數(shù)目。

language.helper.ts

切換瀏覽器標題的語種信息的輔助類,核心方法為

    /**
     * Update the window title using params in the following
     * order:
     * 1. titleKey parameter
     * 2. $state.$current.data.pageTitle (current state page title)
     * 3. 'global.title'
     */
    updateTitle(titleKey?: string) {
        //如果有傳入key值,就用傳入的,這樣就能支出各個頁面都有自己的Title。
        if (!titleKey) {
             titleKey = this.getPageTitle(this.router.routerState.snapshot.root);
        }
        //調(diào)用Translate服務獲取翻譯值后,在設置到標題上面
        this.translateService.get(titleKey).subscribe((title) => {
            this.titleService.setTitle(title);
        });
        //由于get返回一個Observable,所以必須用異步的方式設置,
        //修改如下代碼可以用同步的方式,直觀設置 //this.titleService.setTitle(this.translateService.instant(titleKey));
    }

login目錄

在Jhipster中,登錄認證狀態(tài)是由proncipal管理,因而并不需要一個集中的登錄頁面。登錄動作也就抽象才成一個獨立的服務,供其他模塊調(diào)用。

login-modal.service.ts

從@ng-bootstrap/ng-bootstrap中引入NgbModal, NgbModalRef。
constructor(
        private modalService: NgbModal,
    ) {}

構(gòu)造方法注入SharedLibsModule中已經(jīng)forRoot初始化的NgbModal。

open(): NgbModalRef {
        //冗余校驗,如果已經(jīng)彈開,就直接返回
        if (this.isOpen) {
            return;
        }
        this.isOpen = true;
        //調(diào)用modalService的open方法,生成一個彈出窗引用,
        const modalRef = this.modalService.open(JhiLoginModalComponent, {
            //僅傳入一個參數(shù),容器標簽。
            container: 'nav'
        });
        modalRef.result.then((result) => {
            this.isOpen = false;
        }, (reason) => {
            this.isOpen = false;
        });
        //返回登錄框引用,方便在其他組件中關閉,比如登錄成功后
        return modalRef;
    }

open的容器標簽額外說明:
沒有選擇container,默認值是body-即{container:'body'},那么當我們的內(nèi)容,超過一整頁,就會造成scroll滾動到最后。
TODO:補圖
//而跳出登錄框一般是通過菜單(在頁面頂端)跳轉(zhuǎn)到其他頁面或者點擊登錄菜單,那么不希望有scroll變動的效果,從后面的main窗體可知,菜單導航條nav是每個頁面都共有的標簽,用它做容器很合適。

login.service.ts

通過AuthServerProvider的包裝,完成登錄的具體動作,loginWithToken()和logout()都是簡單的封裝調(diào)用,而login()相對復雜

    login(credentials, callback?) {
        //如果callback沒有定義,就定義成空函數(shù)
        const cb = callback || function() {};

        return new Promise((resolve, reject) => {
            //調(diào)用authServerProvider的login
            this.authServerProvider.login(credentials).subscribe((data) => {
                //判斷用戶設置的語種信息,
                this.principal.identity(true).then((account) => {
                    // After the login the language will be changed to
                    // the language selected by the user during his registration
                    if (account !== null) {
                        this.languageService.changeLanguage(account.langKey);
                    }
                    //解析data,也就是調(diào)用login的地方then()繼續(xù)執(zhí)行。
                    //參見login.component.ts的51行,then(() => {....})
                    resolve(data);
                });
                //調(diào)用回調(diào)方法,并返回
                return cb();
            }, (err) => {
                //出錯執(zhí)行登出
                this.logout();
                reject(err);
                return cb(err);
            });
        });
    }

login.component.html和login.component.ts

登錄窗體組件--除index外,第一個Html頁面,是一個比較標準的Angular Form窗體,有雙向數(shù)據(jù)判斷,數(shù)據(jù)校驗等
TODO:補充這兩個分析。

model目錄

通用的數(shù)據(jù)模型

base-entity.ts

統(tǒng)一定義一個Id屬性,作為所有實體類的父類

request-util.ts

提供一個構(gòu)造BaseRequestOptions的工具方法,從req(any)型取出分頁查詢信息,放入構(gòu)造的options.params中。

response-wrapper.model.ts

解析服務端響應,解析成Header,json,stauts三塊。

user 目錄

account.model.ts

定義Account數(shù)據(jù)模型,包含激活,權(quán)限,email,姓名,語種,登錄名等

user.model.ts

定義User數(shù)據(jù)模型,所含信息比Account多,還有其Id

user.service.ts

調(diào)用后端API接口,對用戶管理操作的基本操作,增,刪,改,查,授權(quán)。操作多,邏輯卻比較簡單
    private resourceUrl = SERVER_API_URL + 'api/users';
    constructor(private http: Http) { }

通過SERVER_API_URL構(gòu)造Resource的API地址,并且注入帶有攔截器功能的自定義http客戶端。

    authorities(): Observable<string[]> {
        return this.http.get(SERVER_API_URL + 'api/users/authorities').map((res: Response) => {
            const json = res.json();
            return <string[]> json;
        });
    }

獲得用戶權(quán)限的方法,通過get發(fā)送請求,并且直接把返回值json轉(zhuǎn)換為數(shù)組類型。

Principal,Account,User關系

Jhipster中和用戶有關的有3種類型,Principal,Account,User

  1. User與后臺User表對應,是操作的具體數(shù)據(jù)對象,與工程本身運作無關。
  2. Account,也對應后臺的User表,但是它是關聯(lián)AccountResource,代表“當前”使用工程的登錄用戶實體。因此有激活,注冊,登錄,改密的動作。
  3. Principal比較抽象,是一個比Account大的概念,代表當前用戶的一個身份憑證,表示一種狀態(tài)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容