JHipster一知半解- 4.6.6 webapp-layout目录

回文集目录:JHipster一知半解

layout目录并非子模块,因而并没有包含module.ts文件,包含了整个工程的页面切分

main目录

该目录为angular程序的主界面控件,包括主界面划分和标题切换的能力

main.component.ts

其jhi-main为jhi-main,也就是说它会替换掉index里面的angular入口<jhi-main>标签内容,加入我们需要的组件内容。
constructor(
        private jhiLanguageHelper: JhiLanguageHelper,
        private router: Router
    ) {}
    //从路由参数中获得pageTitle的属性值,如果没有就用默认的工程名,
    private getPageTitle(routeSnapshot: ActivatedRouteSnapshot) {
        let title: string = (routeSnapshot.data && routeSnapshot.data['pageTitle']) ? routeSnapshot.data['pageTitle'] : 'jhipsterSampleApplicationNg2App';
        if (routeSnapshot.firstChild) {
            title = this.getPageTitle(routeSnapshot.firstChild) || title;
        }
        return title;
    }

    ngOnInit() {
        //注册监听路由变化的事件,当NavigationEnd事件才改标题。
        this.router.events.subscribe((event) => {
            if (event instanceof NavigationEnd) {
                //注意这里的update最终会调用translative服务,实现多语种支持。
                this.jhiLanguageHelper.updateTitle(this.getPageTitle(this.router.routerState.snapshot.root));
            }
        });
    }    

main.component.html

<jhi-page-ribbon></jhi-page-ribbon>
<div>
    <router-outlet name="navbar"></router-outlet>
</div>
<!--这里已经用了container-fluid和card jh-card,所以包含在各个子模块的html都只是简单的bootstrap的div即可-->
<div class="container-fluid">
    <div class="card jh-card">
        <router-outlet></router-outlet>
        <router-outlet name="popup"></router-outlet>
    </div>
    <jhi-footer></jhi-footer>
</div>

整体页面分为3大块,最上面为<jhi-page-ribbon>块,当程序是微服务测试环境时显示,下面为navbar菜单区域。最下面为主体区域,有包含程序主体-<router-outlet>部分和foot两小块。
//TODO:页面的布局图,主界面画框

profiles目录

<jhi-page-ribbon>标签,根据从后端获取的profile,决定是否显示信息。

profile.service.ts

与后端api/profile-info进行交互,获取后端服务的profile信息
    //返回一个Promise
    getProfileInfo(): Promise<ProfileInfo> {
        if (!this.profileInfo) {
            //直接调用http.get方法通讯。
            this.profileInfo = this.http.get(this.profileInfoUrl)
                .map((res: Response) => {
                    const data = res.json();
                    //构造ProfileInfo结构体。
                    const pi = new ProfileInfo();
                    pi.activeProfiles = data.activeProfiles;
                    pi.ribbonEnv = data.ribbonEnv;
                    pi.inProduction = data.activeProfiles.includes('prod');
                    pi.swaggerEnabled = data.activeProfiles.includes('swagger');
                    return pi;
            //http.get是Observable,所以要调用toPromise转换
            }).toPromise();
        }
        return this.profileInfo;
    }

page-ribbon.component.ts

    //在Init时就获取Profile,也就是说,在打开页面必然加载<jhi-page-ribbon>,也就是说必然会调用profileService与后台交互,获取ProfileInfo
    ngOnInit() {
        this.profileService.getProfileInfo().then((profileInfo) => {
            this.profileInfo = profileInfo;
            this.ribbonEnv = profileInfo.ribbonEnv;
        });
    }

footer目录

footer.component.html和footer.component.ts比较简单,仅显示“This is your footer”这么一句话,具体工程应该加上网站地图,备案信息等。

error目录

error.route.ts

定义出现错误时候的路由地址,error和accessdenied两个url都会跳转到这个统一的提示页面ErrorComponent,唯一区别是accessdenied时候,route的data增加了一个error403: true的属性。

error.component.ts

    ngOnInit() {
        //从路由里面获取data,并把error403属性和errorMessage赋值到自己组件里面的属性中。
        this.route.data.subscribe((routeData) => {
            if (routeData.error403) {
                this.error403 = routeData.error403;
            }
            if (routeData.errorMessage) {
                this.errorMessage = routeData.errorMessage;
            }
        });
    }

error.component.html

<div>
    <div class="row">
        <div class="col-md-4">
            <span class="hipster img-fluid rounded"></span>
        </div>
        <div class="col-md-8">
            //翻译error.title
            <h1 jhiTranslate="error.title">Error Page!</h1>
            //这里简单用了hidden指令,由于没有其他样式了,这么用倒是没什么问题。
            //官方还是推荐用*ngIf,直接从dom树删除,这个比较display:none保险的的多。
            <div [hidden]="!errorMessage">
                <div class="alert alert-danger">{{errorMessage}}
                </div>
            </div>
            <div [hidden]="!error403" class="alert alert-danger" jhiTranslate="error.http.403">You are not authorized to access this page.
            </div>
        </div>
    </div>
</div>

TODO:附图。

navbar目录

navbar.route.ts

export const navbarRoute: Route = {
    path: '',
    component: NavbarComponent,
    outlet: 'navbar'
};

注意:这里指定了Route的outlet,注意就和main.component.html里面的对应起来了。

active-menu.directive.ts

定义了jhiActiveMenu属性指令,用来作为激活语种的辅助指令。默认菜单的激活状态是routerLinkActive根据url进行判断的,但是语种的选择与激活是与url无关的,因此必须自己判断那一个语种是激活的。
核心代码为updateActivFlag()方法

    updateActiveFlag(selectedLanguage) {
      if (this.jhiActiveMenu === selectedLanguage) {
          this.renderer.setElementClass(this.el.nativeElement, 'active', true);
      } else {
          this.renderer.setElementClass(this.el.nativeElement, 'active', false);
      }
    }

就是给属性的标签元素上增加或者删除'active'属性。

navbar.component组件

NavbarComponent不仅仅展示菜单外观,还包含不需要路由转换的一些动作语言转换的动作。登录,登出,语种切换。

navbar.component.html就是一个相当标准的ngbMenu的html文件了。如果窗口768px,菜单就会自动折叠。

<!-- 整个组件用nav标签包起来。-->
<nav class="navbar navbar-dark navbar-expand-md jh-navbar">
    <div class="jh-logo-container float-left">
        <!--这块是折叠时候的fa-bars图标,仅当折叠时候显示-->
        <a class="jh-navbar-toggler d-lg-none float-right" href="javascript:void(0);" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation" (click)="toggleNavbar()">
            <i class="fa fa-bars"></i>
        </a>
        <!--左边一块显示Jhipster图标,工程名,版本信息。-->
        <a class="navbar-brand logo float-left" routerLink="/" (click)="collapseNavbar()">
            <span class="logo-img"></span>
            <span jhiTranslate="global.title" class="navbar-title">JhipsterSampleApplicationNG2</span> <span class="navbar-version">{{version}}</span>
        </a>
    </div>
    <!--这里开始是menu的区域,使用ngbCollapse控制折叠状态,navbarResponsive的id为data-target-->
    <!--这了用ngSwitch判断登录情况(所以打开首页,也会自动触发/api/account通讯API -->
    <div class="navbar-collapse collapse" id="navbarResponsive" [ngbCollapse]="isNavbarCollapsed" [ngSwitch]="isAuthenticated()">
        <ul class="navbar-nav ml-auto">
            <!--第一个菜单项-home-->
            <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
                <a class="nav-link" routerLink="/" (click)="collapseNavbar()">
                    <span>
                        <i class="fa fa-home" aria-hidden="true"></i>
                        <span jhiTranslate="global.menu.home">Home</span>
                    </span>
                </a>
            </li>
            <!-- jhipster-needle-add-element-to-menu - JHipster will add new menu items here -->
            <!-- Entities子菜单由jhipster管理,会根据cli自动修改该部分内容 ,该菜单仅当用户登录后显示-->
            <li *ngSwitchCase="true" ngbDropdown class="nav-item dropdown pointer" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
                <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="entity-menu">
                    <span>
                        <i class="fa fa-th-list" aria-hidden="true"></i>
                        <span jhiTranslate="global.menu.entities.main">
                            Entities
                        </span>
                    </span>
                </a>
                <!-- 子菜单dropdown下拉框 -->
                <ul class="dropdown-menu" ngbDropdownMenu>
                    <li>
                        <a class="dropdown-item" routerLink="bank-account" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }" (click)="collapseNavbar()">
                            <i class="fa fa-fw fa-asterisk" aria-hidden="true"></i>
                            <span jhiTranslate="global.menu.entities.bankAccount">Bank Account</span>
                        </a>
                    </li>
                    <!-- 其他实体,略过 -->
                    <!-- jhipster-needle-add-entity-to-menu - JHipster will add entities to the menu here -->
                </ul>
            </li>
            <!-- Administration子菜单,该菜单使用了jhiHasAnyAuthority指令,需要有ROLE_ADMIN才显示 -->
            <li *jhiHasAnyAuthority="'ROLE_ADMIN'" ngbDropdown class="nav-item dropdown pointer" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
                <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="admin-menu">
                    <span>
                        <i class="fa fa-user-plus" aria-hidden="true"></i>
                        <span jhiTranslate="global.menu.admin.main">Administration</span>
                    </span>
                </a>
                <!-- 子菜单dropdown下拉框 -->
                <ul class="dropdown-menu" ngbDropdownMenu>
                    <li>
                        <a class="dropdown-item" routerLink="user-management" routerLinkActive="active" (click)="collapseNavbar()">
                            <i class="fa fa-fw fa-user" aria-hidden="true"></i>
                            <span jhiTranslate="global.menu.admin.userManagement">User management</span>
                        </a>
                    </li>
                    <!-- 省略-->
                    <!-- swagger菜单,会根据后台返回的profile显示与否 -->
                    <li *ngIf="swaggerEnabled">
                        <a class="dropdown-item" routerLink="docs" routerLinkActive="active" (click)="collapseNavbar()">
                            <i class="fa fa-fw fa-book" aria-hidden="true"></i>
                            <span jhiTranslate="global.menu.admin.apidocs">API</span>
                        </a>
                    </li>
                    <!-- jhipster-needle-add-element-to-admin-menu - JHipster will add entities to the admin menu here -->
                    <!-- 非生产Profile,增加连接H2数据库的菜单,如果不用H2,这个就可以隐藏掉 -->
                    <li *ngIf="!inProduction">
                        <a class="dropdown-item" href='./h2-console' target="_tab" (click)="collapseNavbar()">
                            <i class="fa fa-fw fa-hdd-o" aria-hidden="true"></i>
                            <span jhiTranslate="global.menu.admin.database">Database</span>
                        </a>
                    </li>
                </ul>
            </li>
            <!--语种子菜单-仅当languages为真,多于一个语种时候才显示 -->
            <li ngbDropdown class="nav-item dropdown pointer" *ngIf="languages">
                <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="languagesnavBarDropdown" *ngIf="languages.length > 1">
                    <span>
                        <i class="fa fa-flag" aria-hidden="true"></i>
                        <span jhiTranslate="global.menu.language">Language</span>
                    </span>
                </a>
                <ul class="dropdown-menu" ngbDropdownMenu *ngIf="languages.length > 1">
                    <!-- 用ngfor 显示语种列表,并用上jhiActiveMenu判断语种激活情况,这里还是用了findLanguageFromKey显示语种的全称 -->
                    <li *ngFor="let language of languages">
                        <a class="dropdown-item" [jhiActiveMenu]="language" href="javascript:void(0);" (click)="changeLanguage(language);collapseNavbar();">{{language | findLanguageFromKey}}</a>
                    </li>
                </ul>
            </li>
            <!--Account子菜单-->
            <li ngbDropdown class="nav-item dropdown pointer" placement="bottom-right" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
                <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="account-menu">
                  <span *ngIf="!getImageUrl()">
                    <i class="fa fa-user" aria-hidden="true"></i>
                    <span jhiTranslate="global.menu.account.main">
                      Account
                    </span>
                  </span>
                  <!--如果能获取用头像,就在这里显示-->
                  <span *ngIf="getImageUrl()">
                      <img [src]="getImageUrl()" class="profile-image img-circle" alt="Avatar">
                  </span>
                </a>
                <!-- 子菜单dropdown下拉框 -->
                <ul class="dropdown-menu" ngbDropdownMenu>
                    <!--Settings仅当用户登录情况才显示-->
                    <li *ngSwitchCase="true">
                        <a class="dropdown-item" routerLink="settings" routerLinkActive="active" (click)="collapseNavbar()">
                            <i class="fa fa-fw fa-wrench" aria-hidden="true"></i>
                            <span jhiTranslate="global.menu.account.settings">Settings</span>
                        </a>
                    </li>
                    <!--省略部分菜单-->
                </ul>
            </li>
        </ul>
    </div>
</nav>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容