zhuth 7 лет назад
Родитель
Сommit
a2ef2627c6

+ 57 - 13
src/components/dashboard/list.jsx

@@ -33,10 +33,10 @@ class DashboardList extends React.Component {
         }
     }
 
-    componentDidMount() {
-        const { dispatch } = this.props;
-        dispatch({ type: 'dashboard/fetchList' });
-    }
+    // componentDidMount() {
+    //     const { dispatch } = this.props;
+    //     dispatch({ type: 'dashboard/remoteMenuDashboardList' });
+    // }
 
     getShareList = () => {
         new Promise((resolve, reject) => {
@@ -129,11 +129,40 @@ class DashboardList extends React.Component {
         return filterItems.map(t => <Option key={t.name} value={t.name}>{t.label}</Option>);
     }
 
+    generateMenuItems = (menuTree) => {
+        const { dispatch } = this.props;
+        const { selectedRecord } = this.state;
+        return menuTree.filter(t => t.type === 'menu').map(t => {
+            if(t.children && t.children.length > 0) {
+                return <Menu.SubMenu
+                    key={t.code}
+                    title={selectedRecord.menuCode === t.code ? <span style={{ color: '#1890ff', fontWeight: 'bold' }}>{t.name}</span> : t.name}
+                    onTitleClick={() => {
+                        dispatch({ type: 'dashboard/remoteSetMenu', dashboard: selectedRecord, menu: t });
+                        let obj = {selectedRecord: null};
+                        obj['visibleOperatingMenu' + selectedRecord.code] = false;
+                        this.setState(obj);
+                    }}
+                >
+                    {this.generateMenuItems(t.children)}
+                </Menu.SubMenu>
+            }else {
+                return <Menu.Item key={t.code} onClick={() => {
+                    dispatch({ type: 'dashboard/remoteSetMenu', dashboard: selectedRecord, menu: t });
+                    let obj = {selectedRecord: null};
+                    obj['visibleOperatingMenu' + selectedRecord.code] = false;
+                    this.setState(obj);
+                }}>{selectedRecord.menuCode === t.code ? <span style={{ color: '#1890ff', fontWeight: 'bold' }}>{t.name}</span> : t.name}</Menu.Item>
+            }
+        })
+    }
+
     render() {
         const { dispatch, dashboard, main } = this.props;
-        const { visibleShareBox, shareUrl, visibleDistributeBox, visibleTransferBox, visibleDeleteBox, visibleCopyBox, selectedRecord, defaultSelectedGroups, defaultSelectedUsers } = this.state
+        const { visibleShareBox, shareUrl, visibleDistributeBox, visibleTransferBox, visibleDeleteBox,
+            visibleCopyBox, selectedRecord, defaultSelectedGroups, defaultSelectedUsers } = this.state
         const { currentUser } = main;
-        const { filterItem } = dashboard;
+        const { menuTree, menuSelectedKeys, filterItem } = dashboard;
 
         const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符
         let filterLabel = dashboard.filterLabel.replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1'); // 添加转义符号
@@ -142,7 +171,9 @@ class DashboardList extends React.Component {
             <Menu className='menu-operation'>
                 { selectedRecord && currentUser.code === selectedRecord.creatorCode && <Menu.Item onClick={() => {
                     dispatch({ type: 'dashboard/getShareKey', record: selectedRecord, delay: 7 }).then((key) => {
-                        this.setState({ visibleShareBox: true, shareUrl: window.location.origin + '/#/dashboard/share_key/' + key })
+                        let obj = { visibleShareBox: true, shareUrl: window.location.origin + '/#/dashboard/share_key/' + key };
+                        obj['visibleOperatingMenu' + selectedRecord.code] = false;
+                        this.setState(obj);
                     });
                 }}> 
                     <Icon type='share-alt'/>分享
@@ -153,22 +184,31 @@ class DashboardList extends React.Component {
                 </Menu.Item>}
                 { selectedRecord && currentUser.code === selectedRecord.creatorCode && <Menu.Item
                     onClick={()=>{
-                        this.setState({ visibleTransferBox: true})
+                        let obj = {visibleTransferBox: true};
+                        obj['visibleOperatingMenu' + selectedRecord.code] = false;
+                        this.setState(obj);
                     }}
                 >
                     <Icon type="swap" />移交
                 </Menu.Item>}
                 { selectedRecord && currentUser.code === selectedRecord.creatorCode && <Menu.Divider />}
+                { selectedRecord && currentUser.code === selectedRecord.creatorCode && <Menu.SubMenu className='setgroupmenu' title={<div><Icon style={{ marginRight: '6px' }} type='profile' />移动到</div>}>
+                    {this.generateMenuItems(menuTree)}
+                </Menu.SubMenu>}
                 { selectedRecord && (selectedRecord.dataConnects.length <= 1) && <Menu.Item
                     onClick={()=>{
-                        this.setState({ visibleCopyBox: true})
+                        let obj = {visibleCopyBox: true};
+                        obj['visibleOperatingMenu' + selectedRecord.code] = false;
+                        this.setState(obj);
                     }}
                 >
                     <Icon type="copy" />复制
                 </Menu.Item> }
                 { selectedRecord && currentUser.code === selectedRecord.creatorCode && <Menu.Item
                     onClick={(e) => {
-                        this.setState({ visibleDeleteBox: true})
+                        let obj = {visibleDeleteBox: true};
+                        obj['visibleOperatingMenu' + selectedRecord.code] = false;
+                        this.setState(obj);
                     }}
                 >
                     <Icon type="delete" />删除
@@ -253,7 +293,11 @@ class DashboardList extends React.Component {
             title: '操作',
             key: 'action',
             render: (text, record, index) => (
-                <Dropdown code={record.code} overlay={moreOperatingMenu} trigger={['click']} >
+                <Dropdown key={record.code} code={record.code} overlay={moreOperatingMenu} trigger={['click']} visible={this.state['visibleOperatingMenu' + record.code]} onVisibleChange={visible => {
+                    let obj = {};
+                    obj['visibleOperatingMenu' + record.code] = visible;
+                    this.setState(obj)
+                }}>
                     <Icon type="setting" />
                 </Dropdown>
             ),
@@ -318,9 +362,9 @@ class DashboardList extends React.Component {
                                     }
                                 </Col>
                                 <Col >
-                                    <Button onClick={() => {
+                                    <Button disabled={menuSelectedKeys.length !== 1 || menuSelectedKeys[0] === '-1'} onClick={() => {
                                         dispatch({ type: 'dashboardDesigner/reset' });
-                                        dispatch({ type: 'dashboard/remoteQucikAdd' });
+                                        dispatch({ type: 'dashboard/remoteQucikAdd', menuCode: menuSelectedKeys[0] });
                                     }}>
                                         <Icon type="layout" />创建报表
                                     </Button>

+ 9 - 2
src/components/dashboard/menu.jsx

@@ -92,6 +92,13 @@ class DashboardMenu extends React.Component {
     onSelect = (selectedKeys, info) => {
         const { dispatch } = this.props;
         dispatch({ type: 'dashboard/setField', name: 'menuSelectedKeys', value: selectedKeys })
+        if(selectedKeys.length === 1) {
+            if(selectedKeys[0] === '-1') {
+                dispatch({ type: 'dashboard/fetchList', mandatory: true });
+            }else {
+                dispatch({ type: 'dashboard/remoteMenuDashboardList', menuCode: selectedKeys[0] });
+            }
+        }
     }
 
     onSearch = (value) => {
@@ -119,8 +126,8 @@ class DashboardMenu extends React.Component {
 
     onAddClick = () => {
         const { dashboard, dispatch } = this.props;
-        const { menuList, menuSelectedKeys, menuExpandedKeys } = dashboard;
-        const pmenu = menuList.find(l => l.code === menuSelectedKeys[0]);
+        const { menuList, menuTree, menuSelectedKeys, menuExpandedKeys } = dashboard;
+        const pmenu = [{ code: '-1', name: '全部目录', pcode: '-1', childrenCount: menuTree.length }].concat(menuList).find(l => l.code === menuSelectedKeys[0]);
         const menu = {
             index: pmenu.childrenCount,
             name: '新目录',

+ 8 - 2
src/constants/url.js

@@ -1,6 +1,6 @@
-// const BASE_URL = 'http://10.1.1.168:8094/BI';
+const BASE_URL = 'http://10.1.1.168:8094/BI';
 // const BASE_URL = 'http://10.1.80.36:8011';
-const BASE_URL = 'http://218.18.115.198:8888/BI'
+// const BASE_URL = 'http://218.18.115.198:8888/BI'
 
 /**后台接口地址 */
 const URLS = {
@@ -187,6 +187,8 @@ const URLS = {
 
     DASHBOARD_SHARE_DETAIL_BY_CODE: BASE_URL + '/getDashboardByCode', // 通过报表编号获得报表数据
 
+    /***************************************报表目录***************************************/
+
     DASHBOARD_MENU_TREE: BASE_URL + '/dashBoard/menu/list', // 获取报表目录树
 
     DASHBOARD_MENU_ADD: BASE_URL + '/dashBoard/menu/save', // 添加报表目录
@@ -195,6 +197,10 @@ const URLS = {
 
     DASHBOARD_MENU_DELETE: BASE_URL + '/dashBoard/menu/delete', // 删除报表目录
 
+    DASHBOARD_MENU_DASHBOARD_LIST: BASE_URL + '/dashBoard/menu/list/dashBoard', // 获得目录下的所有报表
+
+    DASHBOARD_SET_MENU: BASE_URL + '/dashBoard/menu/update/dashboard', // 设置报表所属目录
+
     /***************************************浏览记录***************************************/
     
     HISTORY_ADD: BASE_URL + '/addRecord', // 添加图表、报表浏览记录 0 - 图表  1 - 报表

+ 13 - 13
src/models/chart.js

@@ -165,7 +165,7 @@ export default {
                     message.error('请求图表列表失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('请求图表列表失败: ' + e);
+                message.error('请求图表列表失败: ' + e.message);
             }
         },
         *remoteDetail(action, { select, call, put }) {
@@ -245,7 +245,7 @@ export default {
                     message.error('解析图表错误: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('解析图表错误: ' + e);
+                message.error('解析图表错误: ' + e.message);
             }
         },
         *remoteAdd(action, { select, call, put }) {
@@ -298,7 +298,7 @@ export default {
                 }
             }catch(e) {
                 console.error(e);
-                message.error('新增失败: ' + e);
+                message.error('新增失败: ' + e.message);
             }
         },
         *remoteModify(action, { select, call, put }) {
@@ -351,7 +351,7 @@ export default {
                 }
             }catch(e) {
                 console.error(e);
-                message.error('修改失败: ' + e);
+                message.error('修改失败: ' + e.message);
             }
         },
         *remoteDelete(action, { select, call, put, takeEvery, takeLatest }) {
@@ -378,7 +378,7 @@ export default {
                 }
             }catch(e) {
                 console.log(e);
-                message.error('删除失败: ' + e);
+                message.error('删除失败: ' + e.message);
             }
         },
         
@@ -407,7 +407,7 @@ export default {
                     message.error('读取图表分组列表错误: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('读取图表分组列表错误: ' + e);
+                message.error('读取图表分组列表错误: ' + e.message);
             }
         },
         *remoteSetGroups(action, { select, call, put }) {
@@ -474,7 +474,7 @@ export default {
                 }
             }catch(e) {
                 console.log(e);
-                message.error('添加分组失败: ' + e);
+                message.error('添加分组失败: ' + e.message);
             }
         },
         /**
@@ -507,7 +507,7 @@ export default {
                 }
             }catch(e) {
                 console.log(e);
-                message.error('修改分组失败: ' + e);
+                message.error('修改分组失败: ' + e.message);
             }
         },
         /**
@@ -537,7 +537,7 @@ export default {
                 }
             }catch(e) {
                 console.log(e);
-                message.error('修改分组失败: ' + e);
+                message.error('修改分组失败: ' + e.message);
             }
         },
         *remoteDeleteGroup(action, { select, call, put }) {
@@ -565,7 +565,7 @@ export default {
                     message.error('删除分组失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('删除分组失败: ' + e);
+                message.error('删除分组失败: ' + e.message);
             }
         },
         *remoteMoveGroup(action, { select, call, put }) {
@@ -711,7 +711,7 @@ export default {
                 yield put({ type: 'remoteModifyGroups', groups: modifyGroups });
             }catch(e) {
                 console.log(e);
-                message.error('位置调整失败: ' + e);
+                message.error('位置调整失败: ' + e.message);
             }
         },
         /**
@@ -738,7 +738,7 @@ export default {
                 }
             } catch(e) {
                 console.log(e);
-                message.error('设置分组失败: ' + e);
+                message.error('设置分组失败: ' + e.message);
             }
         },
         *transfer(action, { put, call, select }) {
@@ -770,7 +770,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('移交失败: ' + e);
+                message.error('移交失败: ' + e.message);
             }
         },
     },

+ 10 - 10
src/models/chartDesigner.js

@@ -181,7 +181,7 @@ export default {
                     message.error('新增失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('新增失败: ' + e);
+                message.error('新增失败: ' + e.message);
             }
         },
         /**
@@ -238,7 +238,7 @@ export default {
                     message.error('创建副本失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('创建副本失败: ' + e);
+                message.error('创建副本失败: ' + e.message);
             }
         },
         *remoteDataColumn(action, { select, call, put }) {
@@ -269,7 +269,7 @@ export default {
                     yield put({ type: 'silentSetField', name: 'columns', value: [] });
                 }
             }catch(e) {
-                message.error('请求列数据失败: ' + e);
+                message.error('请求列数据失败: ' + e.message);
                 yield put({ type: 'silentSetField', name: 'columns', value: [] });
             }
         },
@@ -362,7 +362,7 @@ export default {
                 yield put({ type: 'silentSetField', name: 'fetchConfig', value: body });
             }catch(e) {
                 yield put({ type: 'silentSetField', name: 'chartOption', value: {} });
-                message.error('请求柱状图数据失败: ' + e);
+                message.error('请求柱状图数据失败: ' + e.message);
             }
         },
         *fetchPieData(action, { select, call, put }) {
@@ -400,7 +400,7 @@ export default {
                 yield put({ type: 'silentSetField', name: 'fetchConfig', value: body });
             }catch(e) {
                 yield put({ type: 'silentSetField', name: 'chartOption', value: {} });
-                message.error('请求饼图数据失败: ' + e);
+                message.error('请求饼图数据失败: ' + e.message);
             }
         },
         *fetchLineData(action, { select, call, put }) {
@@ -437,7 +437,7 @@ export default {
                 yield put({ type: 'silentSetField', name: 'fetchConfig', value: body });
             }catch(e) {
                 yield put({ type: 'silentSetField', name: 'chartOption', value: {} });
-                message.error('请求折线图数据失败: ' + e);
+                message.error('请求折线图数据失败: ' + e.message);
             }
         },
         *fetchScatterData(action, { select, call, put }) {
@@ -474,7 +474,7 @@ export default {
                 yield put({ type: 'silentSetField', name: 'fetchConfig', value: body });
             }catch(e) {
                 yield put({ type: 'silentSetField', name: 'chartOption', value: {} });
-                message.error('请求散点图数据失败: ' + e);
+                message.error('请求散点图数据失败: ' + e.message);
             }
         },
         *fetchDataViewData(action, { select, call, put }) {
@@ -509,7 +509,7 @@ export default {
                 yield put({ type: 'silentSetField', name: 'fetchConfig', value: body });
             }catch(e) {
                 yield put({ type: 'silentSetField', name: 'chartOption', value: {} });
-                message.error('请求列表数据失败: ' + e);
+                message.error('请求列表数据失败: ' + e.message);
             }
         },
         *fetchAggregateTableData(action, { select, call, put }) {
@@ -545,7 +545,7 @@ export default {
                 yield put({ type: 'silentSetField', name: 'fetchConfig', value: body });
             }catch(e) {
                 yield put({ type: 'silentSetField', name: 'chartOption', value: {} });
-                message.error('请求统计数据失败: ' + e);
+                message.error('请求统计数据失败: ' + e.message);
             }
         },
         /**
@@ -698,7 +698,7 @@ export default {
                     // yield put({ type: 'silentSetField', name: 'chartOption', value: {} });
                 }
             }catch(e) {
-                message.error('请求数据列表失败: ' + e);
+                message.error('请求数据列表失败: ' + e.message);
             }finally {
                 yield put({ type: 'dataList/setField', name: 'loading', value: false });
             }

+ 6 - 6
src/models/chartPolicy.js

@@ -125,7 +125,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('读取图表策略列表错误: ' + e);
+                message.error('读取图表策略列表错误: ' + e.message);
             }
         },
         *remoteAdd(action, { put, call, select }) {
@@ -156,7 +156,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('添加失败: ' + e);
+                message.error('添加失败: ' + e.message);
             }
         },
         *remoteModify(action, { put, call, select }) {
@@ -182,7 +182,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('修改失败: ' + e);
+                message.error('修改失败: ' + e.message);
             }
         },
         *remoteDelete(action, { put, call, select }) {
@@ -209,7 +209,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('删除失败: ' + e);
+                message.error('删除失败: ' + e.message);
             }
         },
         *remoteSetTarget(action, { put, call, select }) {
@@ -238,7 +238,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('设置对象失败: ' + e);
+                message.error('设置对象失败: ' + e.message);
             }
         },
         /**
@@ -264,7 +264,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('获得图表列数据失败: ' + e);
+                message.error('获得图表列数据失败: ' + e.message);
             }
         }
     }

+ 155 - 66
src/models/dashboard.js

@@ -105,6 +105,7 @@ export default {
                         return {
                             key: d.id + '',
                             code:  d.id+'',
+                            menuCode: d.menuId + '',
                             name: d.bdName,
                             items: items,
                             description: d.bdNote || '',
@@ -123,8 +124,7 @@ export default {
                     message.error('请求报表列表失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                console.log(body, e);
-                message.error('请求报表列表失败: ' + e)
+                message.error('请求报表列表失败: ' + e.message)
             }
         },
         *remoteDetail(action, { select, call, put }) {
@@ -170,6 +170,7 @@ export default {
                     let data = {
                         code:  resData.id+'',
                         name: resData.bdName,
+                        menuCode: resData.menuId + '',
                         items: items,
                         description: resData.bdNote || '',
                         creatorCode: resData.createId + '',
@@ -196,7 +197,7 @@ export default {
                     message.error('解析报表错误: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('解析报表错误: ' + e);
+                message.error('解析报表错误: ' + e.message);
             }finally {
                 yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
             }
@@ -226,10 +227,11 @@ export default {
                     message.error('保存失败: ' + (res.err || res.data.msg));
                 } 
             }catch(e) {
-                message.error('保存失败: ' + e);
+                message.error('保存失败: ' + e.message);
             }
         },
         *remoteQucikAdd(action, { select, call, put }) {
+            const { menuCode } = action;
             try {
                 const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
                 const { name, items, description, relationColumns, filters } = dashboardDesigner;
@@ -241,7 +243,8 @@ export default {
                     filters: JSON.stringify(filters) || "",
                     bdCode: generateShareCode(),
                     thumbnail: '',
-                    chartIds: ''
+                    chartIds: '',
+                    menuId: menuCode,
                 }
                 const res = yield call(service.fetch, {
                     url: URLS.DASHBOARD_ADD,
@@ -254,7 +257,7 @@ export default {
                     message.error('保存失败: ' + (res.err || res.data.msg));
                 } 
             }catch(e) {
-                message.error('保存失败: ' + e);
+                message.error('保存失败: ' + e.message);
             }
         },
         *remoteModify(action, { select, call, put }) {
@@ -283,7 +286,7 @@ export default {
                     message.error('保存失败: ' + (res.err || res.data.msg));
                 } 
             }catch(e) {
-                message.error('保存失败: ' + e);
+                message.error('保存失败: ' + e.message);
             }
         },
         *remoteDelete(action, { select, call, put }) {
@@ -308,7 +311,7 @@ export default {
                     message.error('删除失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('删除失败: ' + e);
+                message.error('删除失败: ' + e.message);
             }
         },
         *remoteMenuTree(action, { put, call, select }) {
@@ -316,65 +319,72 @@ export default {
             if(!action.mandatory && dashboard.menuTree.length > 0) {
                 return;
             }
-            const res = yield call(service.fetch, {
-                url: URLS.DASHBOARD_MENU_TREE,
-                method: 'GET'
-            })
-            if(!res.err && res.data.code > 0) {
-                const resTree = res.data.data;
-                const list = [];
-                let fun = (tree, pcode) => {
-                    let newTree = tree.map((t, i) => {
-                        let ch = [];
-                        if(t.children && t.children.length > 0) {
-                            ch = fun(t.children, t.id);
-                        }
-                        let obj = {
-                            code: t.id + '',
-                            pcode: pcode + '',
-                            name: t.name,
-                            type: t.type,
-                            index: i,
-                            children: ch,
-                            childrenCount: ch.length
-                        }
-                        list.push(obj);
-                        return obj
-                    });
-                    return newTree;
+            try{
+                const res = yield call(service.fetch, {
+                    url: URLS.DASHBOARD_MENU_TREE,
+                    method: 'GET'
+                })
+                if(!res.err && res.data.code > 0) {
+                    const resTree = res.data.data;
+                    const list = [];
+                    let fun = (tree, pcode) => {
+                        let newTree = tree.map((t, i) => {
+                            let ch = [];
+                            if(t.children && t.children.length > 0) {
+                                ch = fun(t.children, t.id);
+                            }
+                            let obj = {
+                                code: t.id + '',
+                                pcode: pcode + '',
+                                name: t.name,
+                                type: t.type,
+                                index: i,
+                                children: ch,
+                                childrenCount: ch.length
+                            }
+                            list.push(obj);
+                            return obj
+                        });
+                        return newTree;
+                    }
+                    let menuList = list;
+                    let menuTree = fun(resTree, '-1');
+                    yield put({ type: 'setFields', fields: [
+                        { name: 'menuList', value: menuList },
+                        { name: 'menuTree', value: menuTree },
+                    ] });
+                }else {
+                    message.error('获取报表目录失败: ' + (res.err || res.data.msg));
                 }
-                let menuList = list;
-                let menuTree = fun(resTree, '-1');
-                yield put({ type: 'setFields', fields: [
-                    { name: 'menuList', value: menuList },
-                    { name: 'menuTree', value: menuTree },
-                ] });
-            }else {
-                message.error('获取报表目录失败: ' + (res.err || res.data.msg));
+            }catch(e) {
+                message.error('获取报表目录失败: ' + e.message);
             }
         },
         *remoteAddMenu(action, { put, call, select }) {
             const { menu } = action;
-            const res = yield call(service.fetch, {
-                url: URLS.DASHBOARD_MENU_ADD,
-                method: 'POST',
-                body: {
-                    id: menu.code,
-                    index: menu.index,
-                    name: menu.name,
-                    parentId: menu.pcode
+            try {
+                const res = yield call(service.fetch, {
+                    url: URLS.DASHBOARD_MENU_ADD,
+                    method: 'POST',
+                    body: {
+                        id: menu.code,
+                        index: menu.index,
+                        name: menu.name,
+                        parentId: menu.pcode
+                    }
+                })
+                if(!res.err && res.data.code > 0) {
+                    yield put({ type: 'remoteMenuTree', mandatory: true });
+                    yield put({ type: 'setFields', fields: [
+                        { name: 'menuSelectedKeys', value: [] },
+                    ] });
+                    return true;
+                }else {
+                    message.error('添加报表目录失败: ' + (res.err || res.data.msg));
+                    return false;
                 }
-            })
-
-            if(!res.err && res.data.code > 0) {
-                yield put({ type: 'remoteMenuTree', mandatory: true });
-                yield put({ type: 'setFields', fields: [
-                    { name: 'menuSelectedKeys', value: [] },
-                ] });
-                return true;
-            }else {
-                message.error('添加报表目录失败: ' + (res.err || res.data.msg));
-                return false;
+            }catch(e) {
+                message.error('添加报表目录失败: ' + e.message);
             }
         },
         *remoteModifyMenu(action, { put, call, select }) {
@@ -409,6 +419,85 @@ export default {
                 return false;
             }
         },
+        *remoteSetMenu(action, { put, call, select }) {
+            const { dashboard, menu } = action;
+            try {
+                const res = yield call(service.fetch, {
+                    url: URLS.DASHBOARD_SET_MENU,
+                    body: {
+                        dashBoardId: dashboard.code,
+                        menuId: menu.code
+                    },
+                })
+                if(!res.err && res.data.code > 0) {
+                    yield put({ type: 'remoteMenuDashboardList', menuCode: menu.code });
+                    yield put({ type: 'setFields', fields: [
+                        { name: 'menuSelectedKeys', value: [menu.code] },
+                        { name: 'menuExpandedKeys', value: [menu.code] },
+                    ] })
+                }else {
+                    message.error('移动到目录失败: ' + (res.err || res.data.msg));
+                }
+            }catch(e) {
+                message.error('移动到目录失败: ' + e.message);
+            }
+        },
+        *remoteMenuDashboardList(action, { put, call, select }) {
+            const { menuCode } = action;
+            try {
+                const res = yield call(service.fetch, {
+                    url: URLS.DASHBOARD_MENU_DASHBOARD_LIST + '/' + menuCode,
+                    method: 'GET',
+                })
+                if(!res.err && res.data.code > 0) {
+                    const resData = res.data.data;
+                    let list = resData.map(d => {
+                        let items = d.bdConfiguration ? JSON.parse(d.bdConfiguration) : [];
+
+                        const dataSources = [];
+                        const dataConnects = [];
+                        items.forEach(item => {
+                            if(item.viewType === 'chart') {
+                                if(!dataSources.find(ad => ad.code === item.dataSourceCode)) {
+                                    dataSources.push({
+                                        code: item.dataSourceCode,
+                                        name: item.dataSourceName
+                                    })
+                                }
+                                if(!dataConnects.find(ad => ad.code === item.dataSourceCode)) {
+                                    dataConnects.push({
+                                        code: item.dataConnectCode,
+                                        name: item.dataConnectName
+                                    })
+                                }
+                            }
+                        })
+    
+                        return {
+                            key: d.id + '',
+                            code:  d.id+'',
+                            name: d.bdName,
+                            menuCode: d.menuId + '',
+                            items: items,
+                            description: d.bdNote || '',
+                            creatorCode: d.createId + '',
+                            creatorName: d.createBy,
+                            createTime: d.createDate,
+                            shareCode: d.bdCode,
+                            dataSources: dataSources,
+                            dataConnects: dataConnects,
+                            chartCodes: d.chartIds ? d.chartIds.split(',') : [],
+                            demo: d.demo
+                        }
+                    })
+                    yield put({ type: 'list', list: list });
+                }else {
+                    message.error('获取看板列表失败: ' + (res.err || res.data.msg));
+                }
+            }catch(e) {
+                message.error('获取看板列表失败: ' + e.message);
+            }
+        },
         *share(action, { put, call, select }) {
             const { code, targets } = action;
             const body = {
@@ -430,7 +519,7 @@ export default {
                     message.error('设置分发对象失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('分发失败: ' + e);
+                message.error('分发失败: ' + e.message);
             }
         },
         *shareList(action, { put, call, select }) {
@@ -468,7 +557,7 @@ export default {
                     message.error('移交失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('移交失败: ' + e);
+                message.error('移交失败: ' + e.message);
             }
         },
         *remoteShareDetail(action, { select, call, put }) {
@@ -541,7 +630,7 @@ export default {
                     message.error('解析报表错误: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('解析报表错误: ' + e);
+                message.error('解析报表错误: ' + e.message);
             }finally {
                 yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
             }
@@ -568,7 +657,7 @@ export default {
                     message.error('生成分享链接失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('生成分享链接失败: ' + e);
+                message.error('生成分享链接失败: ' + e.message);
             }
         },
         *remoteShareKeyDetail(action, { select, call, put }) {
@@ -641,7 +730,7 @@ export default {
                     message.error('解析报表错误: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('解析报表错误: ' + e);
+                message.error('解析报表错误: ' + e.message);
             }finally {
                 yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
             }

+ 3 - 3
src/models/dashboardDesigner.js

@@ -340,7 +340,7 @@ export default {
                 }
             }catch(e) {
                 console.log(e, body);
-                message.error('请求列数据失败: ' + e);
+                message.error('请求列数据失败: ' + e.message);
             }
         },
         /**
@@ -447,7 +447,7 @@ export default {
                     { name: 'chartType', value: '' },
                     { name: 'chartOption', value: {} }
                 ] });
-                message.error('请求图表展示数据失败: ' + e);
+                message.error('请求图表展示数据失败: ' + e.message);
             }finally {
                 yield put({ type: 'setItemFetching', code: chartCode, fetching: false });
             }
@@ -463,7 +463,7 @@ export default {
                 yield put({ type: 'silentSetField', name: 'loading', value: false });
             }catch(e) {
                 console.log(e);
-                message.error('生成缩略图失败: ' + e);
+                message.error('生成缩略图失败: ' + e.message);
             }
         },
         *encryptCode(action, { put, call, select }) {

+ 5 - 5
src/models/dataConnect.js

@@ -161,7 +161,7 @@ export default {
                     message.error('读取数据链接配置列表错误: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('读取数据链接配置列表错误: ' + e);
+                message.error('读取数据链接配置列表错误: ' + e.message);
             }
         },
         *remoteValidate(action, { select, call, put, takeEvery, takeLatest }) {
@@ -209,7 +209,7 @@ export default {
                     yield put({ type: 'setNewModelInvalid', name: 'invalid', value: true });
                 }
             }catch(e) {
-                message.error('校验失败: ' + e);
+                message.error('校验失败: ' + e.message);
                 yield put({ type: 'setNewModelField', name: 'validating', value: false });
             }
         },
@@ -249,7 +249,7 @@ export default {
                     return false;
                 }
             }catch(e) {
-                message.error('新增失败: ' + e);
+                message.error('新增失败: ' + e.message);
                 yield put({ type: 'setNewModelField', name: 'saving', value: false });
                 return false;
             }
@@ -294,7 +294,7 @@ export default {
                     return false;
                 }
             }catch(e) {
-                message.error('修改失败: ' + e);
+                message.error('修改失败: ' + e.message);
                 yield put({ type: 'setNewModelField', name: 'saving', value: false });
                 return false;
             }
@@ -321,7 +321,7 @@ export default {
                     message.error('删除失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('删除失败: ' + e);
+                message.error('删除失败: ' + e.message);
             }
         }
     },

+ 14 - 14
src/models/dataSource.js

@@ -176,7 +176,7 @@ export default {
                     message.error('读取数据源列表错误: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('读取数据源列表错误: ' + e);
+                message.error('读取数据源列表错误: ' + e.message);
             }
             
         },
@@ -221,7 +221,7 @@ export default {
                     message.error('新增失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('新增失败: ' + e);
+                message.error('新增失败: ' + e.message);
 
             }
         },
@@ -287,7 +287,7 @@ export default {
                     message.error('数据源解析错误: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('数据源解析错误: ' + e);
+                message.error('数据源解析错误: ' + e.message);
                 yield put({ type: 'list', list: [] });
             }
         },
@@ -314,7 +314,7 @@ export default {
                 }
             }catch(e) {
                 console.log(e);
-                message.error('删除失败: ' + e);
+                message.error('删除失败: ' + e.message);
             }
         },
         *remoteModify(action, { select, call, put }) {
@@ -361,7 +361,7 @@ export default {
                 }
             }catch(e) {
                 console.log(e);
-                message.error('保存失败: ' + e);
+                message.error('保存失败: ' + e.message);
             }
         },
 
@@ -390,7 +390,7 @@ export default {
                     message.error('请求数据源列表错误: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('请求数据源列表错误: ' + e);
+                message.error('请求数据源列表错误: ' + e.message);
             }
         },
 
@@ -455,7 +455,7 @@ export default {
                     message.error('新增分组失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('新增分组失败: ' + e);
+                message.error('新增分组失败: ' + e.message);
             }
         },
         /**
@@ -481,7 +481,7 @@ export default {
                     message.error('修改分组失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('修改分组失败: ' + e);
+                message.error('修改分组失败: ' + e.message);
             }
         },
         /**
@@ -510,7 +510,7 @@ export default {
                     message.error('修改分组失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('修改分组失败: ' + e);
+                message.error('修改分组失败: ' + e.message);
             }
         },
         *remoteDeleteGroup(action, { select, call, put }) {
@@ -538,7 +538,7 @@ export default {
                     message.error('删除分组失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('删除分组失败: ' + e);
+                message.error('删除分组失败: ' + e.message);
             }
         },
         *remoteMoveGroup(action, { select, call, put }) {
@@ -684,7 +684,7 @@ export default {
                 yield put({ type: 'remoteModifyGroups', groups: modifyGroups });
             }catch(e) {
                 console.log(e);
-                message.error('位置调整失败: ' + e);
+                message.error('位置调整失败: ' + e.message);
             }
         },
         /**
@@ -710,7 +710,7 @@ export default {
                     message.error('设置分组失败: ' + (res.err || res.data.msg));
                 }
             } catch(e) {
-                message.error('设置分组失败: ' + e);
+                message.error('设置分组失败: ' + e.message);
             }
         },
         *transfer(action, { put, call, select }) {
@@ -743,7 +743,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('移交失败: ' + e);
+                message.error('移交失败: ' + e.message);
             }
         },
         /**
@@ -790,7 +790,7 @@ export default {
                     message.error('请求数据列表失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('请求数据列表失败: ' + e);
+                message.error('请求数据列表失败: ' + e.message);
             }finally {
                 yield put({ type: 'dataList/setField', name: 'loading', value: false });
             }

+ 1 - 1
src/models/dataSourceDetail.js

@@ -133,7 +133,7 @@ export default {
                     { name: 'columns', value: [] },
                     { name: 'notice', value: e.message + '' || e + '' }
                 ] });
-                message.error('请求列数据错误: ' + e);
+                message.error('请求列数据错误: ' + e.message);
             }
         },
     },

+ 5 - 5
src/models/dataSourcePolicy.js

@@ -115,7 +115,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('读取数据源策略列表错误: ' + e);
+                message.error('读取数据源策略列表错误: ' + e.message);
             }
         },
         *remoteAdd(action, { put, call, select }) {
@@ -147,7 +147,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('添加失败: ' + e);
+                message.error('添加失败: ' + e.message);
             }
         },
         *remoteModify(action, { put, call, select }) {
@@ -174,7 +174,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('修改失败: ' + e);
+                message.error('修改失败: ' + e.message);
             }
         },
         *remoteDelete(action, { put, call, select }) {
@@ -199,7 +199,7 @@ export default {
                     message.error('删除失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('删除失败: ' + e);
+                message.error('删除失败: ' + e.message);
             }
         },
         *remoteSetTarget(action, { put, call, select }) {
@@ -228,7 +228,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('设置对象失败: ' + e);
+                message.error('设置对象失败: ' + e.message);
             }
         }
     }

+ 3 - 7
src/models/main.js

@@ -122,7 +122,7 @@ export default {
                         code: user.id+'',
                         account: username,
                         phone: user.phone,
-                        password: password,
+                        password: autoLogin ? password : '',
                         name: user.name,
                         role: user.role || 'default',
                         department: user.department,
@@ -141,7 +141,7 @@ export default {
                     return false;
                 }
             }catch(e) {
-                message.error('登录失败: ' + e);
+                message.error('登录失败: ' + e.message);
                 console.error(body, e);
                 return false;
             }
@@ -168,15 +168,11 @@ export default {
                 yield put({ type: 'setFields', fields: [
                     { name: 'isLogin', value: false },
                     { name: 'authenticated', value: false },
-                    { name: 'currentUser', value: {
-                        account,
-                        password: autoLogin ? password : null
-                    } }
                 ]});
                 // yield put({ type: 'recent/listRecentDashboard', recentDashboard: [] });
             }catch(e) {
                 console.log(e);
-                message.error('注销失败: ' + e);
+                message.error('注销失败: ' + e.message);
             }
         },
     },

+ 3 - 3
src/models/recent.js

@@ -62,7 +62,7 @@ export default {
                 }
             }catch(e) {
                 console.error(e);
-                message.error('读取最近访问图表列表错误: ' + e);
+                message.error('读取最近访问图表列表错误: ' + e.message);
             }
         },
         *fetchRecentDashboard(action, { select, call, put }) {
@@ -93,7 +93,7 @@ export default {
                 }
             }catch(e) {
                 console.error(e);
-                message.error('读取最近访问报表列表错误: ' + e);
+                message.error('读取最近访问报表列表错误: ' + e.message);
             }
             
         },
@@ -110,7 +110,7 @@ export default {
                 console.log("添加访问记录: " + res + tarId, recordType)
             }catch(e) {
                 console.log(e);
-                message.error('添加访问记录错误: ' + e);
+                message.error('添加访问记录错误: ' + e.message);
             }
         }
     },

+ 2 - 2
src/models/user.js

@@ -57,7 +57,7 @@ export default {
                     message.error('请求用户列表失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('请求用户列表失败: ' + e);
+                message.error('请求用户列表失败: ' + e.message);
             }
         },
         *remoteModify(action, { put, call, select }) {
@@ -84,7 +84,7 @@ export default {
                     message.error('修改失败: ' + (res.err || res.data.msg));
                 }
             }catch(e) {
-                message.error('修改失败: ' + e);
+                message.error('修改失败: ' + e.message);
             }
         }
     },

+ 7 - 7
src/models/userGroup.js

@@ -120,7 +120,7 @@ export default {
                 }
             }catch(e) {
                 console.log(e);
-                message.error('请求用户组列表失败: ' + e);
+                message.error('请求用户组列表失败: ' + e.message);
             }
         },
         *remoteAdd(action, { put, call, select }) {
@@ -150,7 +150,7 @@ export default {
                 }
             }catch(e) {
                 console.log(e);
-                message.error('新增失败: ' + e);
+                message.error('新增失败: ' + e.message);
             }
         },
         *remoteModify(action, { put, call, select }) {
@@ -175,7 +175,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('修改失败: ' + e);
+                message.error('修改失败: ' + e.message);
             }
         },
         *remoteDelete(action, { put, call, select }) {
@@ -196,7 +196,7 @@ export default {
                 }
             }catch(e) {
                 console.log([group.code], e);
-                message.error('删除失败: ' + e);
+                message.error('删除失败: ' + e.message);
             }
         },
         *changeSelectedGroup(action, { put, call, select }) {
@@ -236,7 +236,7 @@ export default {
                 }
             }catch(e) {
                 console.log(groupCode, e);
-                message.error('请求用户组成员列表失败: ' + e);
+                message.error('请求用户组成员列表失败: ' + e.message);
             }
         },
         *remoteMemberAdd(action, { put, call, select }) {
@@ -259,7 +259,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('添加失败: ' + e);
+                message.error('添加失败: ' + e.message);
             }
         },
         *remoteMemberDelete(action, { put, call, select }) {
@@ -281,7 +281,7 @@ export default {
                 }
             }catch(e) {
                 console.log(body, e);
-                message.error('删除失败: ' + e);
+                message.error('删除失败: ' + e.message);
             }
         },
     },

+ 1 - 1
src/services/index.js

@@ -36,7 +36,7 @@ export function fetch(option) {
 
         return request(url, opt, timeout);
     }else {
-        // 使用一个空的Promise组织后续链式方法的调用
+        // 使用一个空的Promise阻止后续链式方法的调用
         return new Promise(() => {});
     }
 }

+ 7 - 4
src/utils/request.js

@@ -9,9 +9,12 @@ function checkStatus(response) {
     return response;
   }
 
-  const error = new Error(response ? response.statusText : 'Error Fetch');
-  error.response = response;
-  throw error;
+  if (response.status === 400) {
+    return response;
+  }
+  if (response.status === 404) {
+    throw new Error('请求未找到');
+  }
 }
 
 /**
@@ -59,7 +62,7 @@ export default function request(url, options, timeout) {
           retryCount++;
           this.then(fn);
         } else {
-          let error = new TimeoutError(`timeout of ${this.timeout}ms execeeded`);
+          let error = new TimeoutError(`请求超时`);
           this.catchError(error);
         }
       }, this.timeout);