Ng-Matero 0.1 已发布,添加 schamatics,支持 ng add
目前市面上关于 Angular Material 的后台框架比较少,大多都是收费主题,并且都不太好用。css
不少人都说 Material 是一个面向 C 端的框架,其实在使用其它框架作管理系统的时候,我发现 Material 的组件基本已经够用了,其它不足的地方能够配合一些优秀的第三方库。另外,Material 的确是一个高质量的组件库,不论是设计思路仍是使用方式,都近乎完美。html
通过一个多月的设计与思考,我开发了这款基于 Angular Material 的中后台管理框架,初期架构设计已经完成,在接下来的版本中会提供 schematics 支持及 vscode snippet 工具。同时,为了弥补 Material 的不足以及更好的发挥框架的优点,我建立了另一个项目以扩展 Material 的组件库。git
由于目前尚未完善的文档,因此本篇文章会简单介绍一下框架的使用。github
Github: https://github.com/ng-matero/...预览地址: https://ng-matero.github.io/n...json
先看一下目录结构,这个目录结构遵循了 Angular 的最佳实践,尽可能保证结构的规范化与合理性。sass
├── src │ ├── app │ │ ├── core # 核心模块 │ │ │ ├── interceptors # HTTP 拦截器 │ │ │ │ └── default.interceptor.ts │ │ │ ├── services │ │ │ │ ├── settings.service.ts # 页面布局配置 │ │ │ │ ├── menu.service.ts # 菜单配置 │ │ │ │ └── startup.service.ts # 初始化项目配置 │ │ │ └── core.module.ts # 核心模块文件 │ │ ├── routes │ │ │ ├── ** # 业务目录 │ │ │ ├── routes-routing.module.ts # 业务路由注册口 │ │ │ └── routes.module.ts # 业务路由模块 │ │ ├── shared # 共享模块 │ │ │ └── shared.module.ts # 共享模块文件 │ │ ├── theme # 主题目录 │ │ │ ├── admin-layout # admin 布局 │ │ │ ├── auth-layout # 登录注册布局 │ │ | └── theme.module.ts # 主题模块 │ │ ├── app.component.ts # 根组件 │ │ └── app.module.ts # 根模块 │ │ └── material.module.ts # Material 组件模块 │ ├── assets # 本地静态资源 │ ├── environments # 环境变量配置 │ ├── styles # 样式目录 │ │ ├── component # 公用组件样式 │ │ ├── helpers # 工具类 │ │ ├── mixins # mixins │ │ ├── plugins # 第三方库样式 │ │ ├── ** │ │ ├── theme # 主题核心样式 │ │ └── app.scss # 主题样式入口文件 └── └── style.scss # 样式主入口文件
框架的响应式布局系统采用了 Angular 官方提供的 flex-layout,包含 flex 以及 grid,确实很是好用。架构
可是关于列间距问题稍微有点坑,虽然 flex-layout 增长了 fxLayoutGap="16px grid"
这样看似完美的方案,可是仍是不太好用,除非每个元素块都包含在 fxFlex 中。最终我仍是使用业界比较广泛的 margin 负值的方式。须要在 fxLayout 上面添加 .matero-row
,在 fxFlex 上面添加 .matero-col
,固然这也不是必须的,在某些状况下使用 grid 方式可能更简单。app
<div class="matero-row" fxLayout="row wrap"> <div class="matero-col" fxFlex.gt-sm="60" fxFlex="100"> ... </div> </div>
<div fxLayout="row wrap" fxLayoutGap="16px grid"> <div fxFlex.gt-sm="60" fxFlex="100"> ... </div> </div>
经过在 settings 服务中传入配置对象能够配置页面的布局,好比框架
// 配置选项接口 export interface Defaults { showHeader?: boolean; headerPos?: 'fixed' | 'static' | 'above'; navPos?: 'side' | 'top'; sidenavCollapsed?: boolean; sidenavOpened?: boolean; showUserPanel?: boolean; dir?: 'ltr' | 'rtl'; } // 默认配置选项 const defaults: Defaults = { showHeader: true, headerPos: 'fixed', navPos: 'side', sidenavCollapsed: false, sidenavOpened: true, showUserPanel: true, dir: 'ltr', }; // 设置布局,注入服务,初始化数据后能够执行以下方法 this.settings.setLayout(options)
目前关于配置布局的设计尚未想好,后期可能会在根模块进行全局配置,我的以为更好的方式仍是直接调整 layout 的模板,不要使用上面这种配置方式。ide
如下是菜单的类型定义
export interface Tag { color: string; // Background Color value: string; } export interface ChildrenItem { state: string; name: string; type: 'link' | 'sub' | 'extLink' | 'extTabLink'; children?: ChildrenItem[]; } export interface Menu { state: string; name: string; type: 'link' | 'sub' | 'extLink' | 'extTabLink'; icon: string; label?: Tag; badge?: Tag; children?: ChildrenItem[]; }
菜单服务会注入到根组件,经过 getAll()
能够获取到所有菜单,一样是在初始化数据后经过 set()
方法设置好菜单。如下是菜单的配置示例:
{ "menu": [{ "state": "dashboard", "name": "Dashboard", "type": "link", "icon": "dashboard", "badge": { "color": "red-500", "value": "5" } }, { "state": "design", "name": "Design", "type": "sub", "icon": "color_lens", "children": [{ "state": "colors", "name": "Color System", "type": "link" }, { "state": "icons", "name": "Icons", "type": "link" }] }] }
在预览页面,你们能够看到很丰富的颜色,而 Material 自己只有三种主色,经过颜色系统也能够很容易更换颜色。
颜色系统是经过 Material 的官方色值用 sass 生成的,Material 的颜色定义以下,包括主体色值以及对应的对比色值:
red: { 50: '#FFEBEE', 100: '#FFCDD2', 200: '#EF9A9A', 300: '#E57373', 400: '#EF5350', 500: '#F44336', 600: '#E53935', 700: '#D32F2F', 800: '#C62828', 900: '#B71C1C', A100: '#FF8A80', A200: '#FF5252', A400: '#FF1744', A700: '#D50000', contrast: { 50: 'dark', 100: 'dark', 200: 'dark', 300: 'dark', 400: 'light', 500: 'light', 600: 'light', 700: 'light', 800: 'light', 900: 'light', A100: 'dark', A200: 'light', A400: 'light', A700: 'light', }, }
能够直接使用 class 添加颜色,好比背景色能够用 .bg-red-500
,文本色则是 .text-red-500
,与之对应的对比色能够是 .text-light
,.text-dark
框架默认提供了 page-header
和 breadcrumb
两个通用组件,其中 page-header
默认包含 breadcrumb
,能够经过设置 showBreadCrumb="false"
关闭面包屑,另外能够经过 title
和 subtitle
设置标题和副标题,page-header
一样支持颜色系统,能够直接添加颜色类来改变页面标题部分的颜色,以下:
<page-header class="bg-purple-500"></page-header>
Helper 编写延续了 snack-helper 的设计原则,很是简单,能够参见源码,在此不过多阐述,感兴趣的朋友能够阅读我以前写的文章 如何编写通用的 Helper Class
目前框架只完成了一期规划,后面的路还有很长,首先会支持 schematics,可使用 ng add
来添加项目,同时也会提供 vscode 工具包,最后还但愿广大 ng 爱好者能够加入到项目中来,共建 ng 生态。