dva-boot-admin 是一個用React開發的一個企業級中後臺管理UI,包含經常使用的業務,組件,及數據流轉方案,先後端分離的開發方式,按業務劃分的目錄結構,能夠大大提升咱們的開發效率
下面是總體的介紹,感興趣的同窗能夠去官網詳加了解。javascript
. ├── public # 不參與編譯的資源文件 ├── src # 主程序目錄 │ ├── index.js # 程序啓動和渲染入口文件 │ ├── components # 全局公共組件 │ ├── layouts # 頁面結構組件 │ │ ├── BasicLayout # 基本佈局 │ │ └── OtherLayout # 佈局組件根據具體功能調整,在路由配置中引用 │ ├── routes # 動態路由目錄(每一個功能一個文件夾的MVC結構) │ │ ├── index.js # 路由配置文件 │ │ ├── Home # 功能模塊 │ │ │ ├── index.js # 路由配置文件 │ │ │ ├── assets # 單獨屬於這個模塊的靜態資源文件 │ │ │ ├── components # 頁面組件 │ │ │ ├── model # dva model │ │ │ ├── service # dva service │ │ │ └── routes ** # 子路由(目錄結構與父級相同) │ │ └── Login # 功能模塊 │ │ ├── index.js # 路由配置文件 │ │ ├── assets # 單獨屬於這個模塊的靜態資源文件 │ │ ├── components # 頁面組件 │ │ ├── model # dva model │ │ ├── service # dva service │ │ └── routes ** # 子路由(目錄結構與父級相同) │ ├── utils # 工具類 │ └── assets # 資源文件 │ ├── fonts # 字體 & 字體圖標 │ ├── images # 圖片 │ └── styles # 全局樣式
modelEnhance是對dva model層的簡單包裝函數,有時候咱們只是想要簡單的fetch一下,從服務端獲取數據進行展現,以前可能要專門在model中寫一些effects和reducers,在service中定義請求函數,若是用modelEnhance包裝一下的話能夠簡寫成下面的形式java
// src/routes/UserInfo/model/index.js import modelEnhance from '@/utils/modelEnhance'; // 就是普通的dva model傳入modelEnhance便可,不用定義其它變量 export default modelEnhance({ namespace: 'userInfo', }); // src/routes/UserInfo/components/index.js // 在組件中直接發出一個類型爲`@request`的action, // 結果會存入userInfo對應的state中,使用的key爲`valueField`的值 this.props.dispatch({ type: 'userInfo/@request', payload: { url: 'http://httpbin.org/get', valueField: 'httpbin', method: 'GET' } }); // 同時請求兩個 this.props.dispatch({ type: 'userInfo/@request', payload: [{ url: 'http://httpbin.org/get', valueField: 'httpbin', method: 'GET' }, { url: 'http://httpbin.org/post', valueField: 'httpbin' }] }); // 結合分頁助手使用,查詢第1頁10條數據 this.props.dispatch({ type: 'userInfo/@request', payload: { valueField: 'pageData', url: '/api/userInfo/getList', pageInfo: pageData.startPage(1, 10), } });
全局異常處理,咱們能夠在src/config.js的exceptiion
中處理通用異常,這裏共實就是dva的onError方法的入口,咱們通常處理如登陸超時,用戶沒有權限,或另種請求異常等,建議你們不一樣的異常能夠單獨包裝成一個異常類進行分類處理,這樣更容易維護以及調試。git
工程的配置文件github
模擬服務端響應數據,經常用在先後端分離的項目中,咱們在開發新功能的時候,先後端是不一樣步的,這時咱們就會建立一些數據原型,協商好後這時後端就能夠開始開發,而咱們能夠繼續使用模擬數據,只有當後端完成這個接口並測試經過後,兩者纔會被整合。這以後若是後端由於某些緣由服務不可用時,咱們也會很方便的切換回模擬數據,這樣不會由於後端的問題而影響後續的開發。npm
要新建一些模擬數據只要在__mocks__
文件夾中,建立一個文件,並在文件夾中的index.js
中進行聲明,一些例子能夠直接在文件夾下面找到。後端
全部的模擬數據是在開發環境中運行的,當您打包成生產環境的包時,會自動屏蔽全部模擬數據接口。api
// 例子: /src/__mocks__/userInfo.js /** * 模擬請求數據 * @param {FetchMock} fetchMock 當現有條件不知足時,可使用fetchMock來進行擴展 * @param {number} delay 增長延遲時間 ms * @param {function} mock 使用mock生成數據,例如: mock({ 'string|1-10': '★' // 生成最少1顆,最多10顆星字符 }) // {'string': '★★★★★★'} */ export default ({fetchMock, delay, mock}) => { // 若是現有擴展不知足需求,能夠直接使用fetchMock方法 // fetchMock.mock(/httpbin.org\/post/, {/* response */}, {/* options */}); return { // 通常用法 'GET /api/getUserInfo': { name: 'jonn' }, // 省略 method, 模擬真實請求延遲效果 '/api/getUsers': delay([ { name: 'jonn' }, { name: 'weiq' }, ]), // 表格帶分頁 '/api/userInfo/getList': delay(mock({ 'pageNum|+1': 1, // 遞增長1 'pageSize': 10, 'size': 10, 'total': 500, 'totalPages': 50, 'list|10': [{ 'name': '@cname', // 中文名稱 'age|1-100': 100, // 100之內隨機整數 'birthday': '@date("yyyy-MM-dd")', // 日期 'city': '@city(true)', // 中國城市 'phone': /^1[385][1-9]\d{8}/ // 手機號 }], })), // 表格帶分頁, 寫成函數形式可使用請求參數, // 更真實的模擬後端數據處理業務 '/api/userInfo/getList1': (options) => { const body = JSON.parse(options.body); const pageNum = body.pageNum; const idbase = (pageNum - 1) * 10 + 1; return toSuccess(mock({ 'pageNum': pageNum, 'pageSize': 10, 'size': 10, 'total': 100, 'totalPages': 10, 'list|10': [{ 'id|+1': idbase, 'name': '@cname', // 中文名稱 'age|1-100': 100, // 100之內隨機整數 'birthday': '@date("yyyy-MM-dd")', // 日期 'city': '@city(true)', // 中國城市 'phone': /^1[385][1-9]\d{8}/ // 手機號 }], }), 400) } } }
在作後臺系統的時候,作的最多的可能就是對錶格的增、刪、改、查,這時咱們的頁面通常是這樣的,上面是對錶格條件的檢索框,中間是咱們的數據表格,表格下面是分頁組件,還會有新增,修改時用到表單組件bash
拿對錶格數據進行檢索這個場景來講,在搜索框(可能有多個)輸入條件,點擊搜索,檢索到結果(可能很是多),咱們會點擊下面的分頁組件進行翻頁,翻頁時咱們就得帶着以前的檢索條件,咱們會在發送請求前手動合併這些條件,並計算下一頁的頁數等antd
而PageHelper
分頁助手就是爲了簡化咱們的代碼量的,如使用PageHelper.create()
這個方法會爲咱們自動生成分頁對象框架
// model.js state: { pageData: PageHelper.create() }
這時咱們能夠在組件中使用這個對象很方便的進行分頁,及檢索,而且支持鏈式寫法,全部條件會自動進行合併,如:
// components const {pageData} = this.props; // 查詢第1頁,每頁10條,而且name爲jonn的數據 pageData.startPage(1, 10).filter({name: 'jonn'}).filter(...).sortBy(...); // 查詢下一頁,而且會帶着以前的查詢條件 pageData.nextPage();
咱們還能夠結合modelEnhance
來使用分頁,更多用法會在例子中進行說明。
腳手架使用了cmn-utils作爲工具庫,這裏面提供了請求、存儲、事件等許多實用方法
$ git clone https://github.com/LANIF-UI/dva-boot.git $ cd dva-boot $ yarn $ yarn start // 或使用npm $ npm install $ npm start