Ng-Matero 0.1 已發布,添加 schamatics,支持 ng add
前言
目前市面上關於 Angular Material 的后台框架比較少,大多都是收費主題,而且都不太好用。
很多人都說 Material 是一個面向 C 端的框架,其實在使用其它框架做管理系統的時候,我發現 Material 的組件基本已經夠用了,其它不足的地方可以配合一些優秀的第三方庫。另外,Material 的確是一個高質量的組件庫,不管是設計思路還是使用方式,都近乎完美。
經過一個多月的設計與思考,我開發了這款基於 Angular Material 的中后台管理框架,初期架構設計已經完成,在接下來的版本中會提供 schematics 支持及 vscode snippet 工具。同時,為了彌補 Material 的不足以及更好的發揮框架的優勢,我創建了另外一個項目以擴展 Material 的組件庫。
因為目前還沒有完善的文檔,所以本篇文章會簡單介紹一下框架的使用。
目錄結構
先看一下目錄結構,這個目錄結構遵循了 Angular 的最佳實踐,盡量保證結構的規范化與合理性。
├── 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 方式可能更簡單。
<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 的模板,不要使用上面這種配置方式。
配置菜單
以下是菜單的類型定義
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 生態。
