Browse Source

报表分享码/报表展示页设计

zhuth 6 years ago
parent
commit
d38b545a87

+ 1 - 1
.eslintrc.js

@@ -12,5 +12,5 @@ module.exports = {
             "experimentalObjectRestSpread": true,
             "experimentalObjectRestSpread": true,
             "legacyDecorators": true
             "legacyDecorators": true
         }
         }
-    },
+    }
 };
 };

+ 0 - 3
.roadhogrc.mock.js

@@ -1,3 +0,0 @@
-
-export default {
-};

+ 3 - 4
src/components/common/shareQR/shareQR.jsx

@@ -9,11 +9,10 @@ class ShareQR extends React.Component {
         }
         }
     }
     }
     componentDidMount(){
     componentDidMount(){
-
-    this.setState({
+        this.setState({
             url: "http://www.baidu.com/"
             url: "http://www.baidu.com/"
-            })
-        }
+        })
+    }
 
 
     render(){
     render(){
         return(
         return(

+ 10 - 0
src/components/dashboard/dashboardShareView.jsx

@@ -0,0 +1,10 @@
+import React from 'react'
+import Layout from '../dashboardDesigner/layout'
+
+class DashboardShareView extends React.Component {
+    render() {
+        return <Layout { ...this.props } isShareView={true} ></Layout>
+    }
+}
+
+export default DashboardShareView

+ 14 - 4
src/components/dashboardDesigner/configSider.jsx

@@ -1,9 +1,10 @@
 import React from 'react'
 import React from 'react'
 import { connect } from 'dva'
 import { connect } from 'dva'
-import { Form, Divider, Icon, Tooltip, Button } from 'antd'
+import { Form, Input, Divider, Icon, Tooltip, Button } from 'antd'
 import ChooseChartBox from './chooseChartBox'
 import ChooseChartBox from './chooseChartBox'
 import CusFilterBox from './cusFilterBox'
 import CusFilterBox from './cusFilterBox'
 import './configSider.less'
 import './configSider.less'
+const FormItem = Form.Item
 
 
 class ConfigSider extends React.Component {
 class ConfigSider extends React.Component {
 
 
@@ -63,17 +64,26 @@ class ConfigSider extends React.Component {
     }
     }
 
 
     render() {
     render() {
+        const { dashboardDesigner, dispatch } = this.props;
         const { visibleCusFilterBox } = this.state;
         const { visibleCusFilterBox } = this.state;
 
 
-        return <Form className='config-sider'>
-            <Divider>图表添加</Divider>
+        return <Form className='config-sider' layout={'vertical'}>
+            <Divider>报表制作</Divider>
             {this.generateViewTypes()}
             {this.generateViewTypes()}
-            <Divider>属性设置</Divider>
+            <Divider>字段过滤</Divider>
             <Button className="cus-filter-button" onClick={this.showCusFilterBox}>
             <Button className="cus-filter-button" onClick={this.showCusFilterBox}>
                 <Icon type='bulb' theme='outlined' />自定义过滤字段
                 <Icon type='bulb' theme='outlined' />自定义过滤字段
             </Button>
             </Button>
             {visibleCusFilterBox && <CusFilterBox visibleBox={visibleCusFilterBox} hideBox={this.hideCusFilterBox} />}
             {visibleCusFilterBox && <CusFilterBox visibleBox={visibleCusFilterBox} hideBox={this.hideCusFilterBox} />}
             <Divider>其他设置</Divider>
             <Divider>其他设置</Divider>
+            <FormItem label='分享码'>
+                <Input
+                    value={dashboardDesigner.shareCode}
+                    onChange={(e) => {
+                        dispatch({ type: 'dashboardDesigner/setField', name: 'shareCode', value: e.target.value });
+                    }}
+                />
+            </FormItem>
         </Form>
         </Form>
     }
     }
 }
 }

+ 5 - 5
src/components/dashboardDesigner/content.jsx

@@ -53,7 +53,7 @@ class DashboardDesignerContent extends React.Component {
     }
     }
 
 
     getContentSize = () => {
     getContentSize = () => {
-        const { dashboardDesigner, isOwner } = this.props;
+        const { dashboardDesigner, isOwner, isShareView } = this.props;
         const { editMode } = dashboardDesigner;
         const { editMode } = dashboardDesigner;
         let contentEl = document.getElementsByClassName('viewlayout')[0];
         let contentEl = document.getElementsByClassName('viewlayout')[0];
         if(!contentEl) {
         if(!contentEl) {
@@ -65,7 +65,7 @@ class DashboardDesignerContent extends React.Component {
         let _scroll = contentEl.scrollHeight > contentEl.clientHeight;
         let _scroll = contentEl.scrollHeight > contentEl.clientHeight;
 
 
         return {
         return {
-            width: document.body.offsetWidth - 20 - (isOwner && editMode ? 200 : 0) - 10 - (_scroll ? 17 : 2), // 有滚动条时需要减去滚动条的宽度
+            width: document.body.offsetWidth - 20 - ((isOwner && editMode && !isShareView) ? 200 : 0) - 10 - (_scroll ? 17 : 2), // 有滚动条时需要减去滚动条的宽度
             height: contentEl.clientHeight
             height: contentEl.clientHeight
         }
         }
     }
     }
@@ -143,7 +143,7 @@ class DashboardDesignerContent extends React.Component {
     }
     }
 
 
     render() {
     render() {
-        const { dashboardDesigner, isOwner } = this.props;
+        const { dashboardDesigner, isOwner, isShareView } = this.props;
         const { code, editMode, filters } = dashboardDesigner;
         const { code, editMode, filters } = dashboardDesigner;
         const { visibleFilterBox } = this.state;
         const { visibleFilterBox } = this.state;
 
 
@@ -182,11 +182,11 @@ class DashboardDesignerContent extends React.Component {
             </Header>
             </Header>
             <Content className='dashboard-content'>
             <Content className='dashboard-content'>
                 <Layout className='content-layout'>
                 <Layout className='content-layout'>
-                    <Sider className={`config-sider${ (isOwner && editMode) ? '' : ' config-sider-closed' }`} width={(isOwner && editMode) ? 200 : 0}>
+                    <Sider className={`config-sider${ (isOwner && editMode) ? '' : ' config-sider-closed' }`} width={(isOwner && editMode && !isShareView) ? 200 : 0}>
                         <ConfigSider/>
                         <ConfigSider/>
                     </Sider>
                     </Sider>
                     <Content className='viewlayout'>
                     <Content className='viewlayout'>
-                        <ViewLayout isOwner={isOwner} contentSize={contentSize} editMode={editMode}/>
+                        <ViewLayout isOwner={isOwner} isShareView={isShareView} contentSize={contentSize} editMode={editMode}/>
                     </Content>
                     </Content>
                 </Layout>
                 </Layout>
             </Content>
             </Content>

+ 8 - 6
src/components/dashboardDesigner/layout.jsx

@@ -17,11 +17,13 @@ class DashboardDesigner extends React.Component {
     }
     }
 
 
     componentDidMount() {
     componentDidMount() {
-        const { dispatch } = this.props;
+        const { dispatch, isShareView } = this.props;
         const { code } = this.props.match.params;
         const { code } = this.props.match.params;
+        let url;
         if (code !== 'create') {
         if (code !== 'create') {
-            dispatch({ type: 'dashboard/remoteDetail', code: code });
+            url = isShareView ? 'dashboard/remoteShareDetail' : 'dashboard/remoteDetail';
         }
         }
+        dispatch({ type: url, code: code });
     }
     }
 
 
 
 
@@ -47,14 +49,14 @@ class DashboardDesigner extends React.Component {
     }
     }
 
 
     render() {
     render() {
-        const { dashboardDesigner } = this.props;
+        const { dashboardDesigner, isShareView } = this.props;
         const { loading } = dashboardDesigner;
         const { loading } = dashboardDesigner;
         return <Layout className='dashboarddesigner-layout'>
         return <Layout className='dashboarddesigner-layout'>
-            <Header>
+            {!isShareView && <Header>
                 <DashboardDesignerHeader updateThumbnail={this.updateThumbnail} />
                 <DashboardDesignerHeader updateThumbnail={this.updateThumbnail} />
-            </Header>
+            </Header>}
             <Content style={{ height: 0 }}>
             <Content style={{ height: 0 }}>
-                <DashboardDesignerContent isOwner={this.isOwner()} />
+                <DashboardDesignerContent isOwner={this.isOwner()} isShareView={isShareView}/>
             </Content>
             </Content>
             <div style={{ display: loading ? 'block' : 'none', position: 'absolute', height: '100%', width: '100%', zIndex: '4', background: 'rgba(51,51,51,.1)' }}>
             <div style={{ display: loading ? 'block' : 'none', position: 'absolute', height: '100%', width: '100%', zIndex: '4', background: 'rgba(51,51,51,.1)' }}>
                 <Spin style={{ display: 'inline-block', position: 'absolute', top: '50%', left: '50%', margin: '-10px' }} indicator={<Icon type="loading" style={{ fontSize: 24 }} spin />} />
                 <Spin style={{ display: 'inline-block', position: 'absolute', top: '50%', left: '50%', margin: '-10px' }} indicator={<Icon type="loading" style={{ fontSize: 24 }} spin />} />

+ 2 - 2
src/components/dashboardDesigner/viewLayout.jsx

@@ -83,7 +83,7 @@ class ViewLayout extends React.PureComponent {
     }
     }
 
 
     render() {
     render() {
-        const { isOwner, dashboardDesigner, contentSize } = this.props;
+        const { isOwner, isShareView, dashboardDesigner, contentSize } = this.props;
         const { editMode } = dashboardDesigner;
         const { editMode } = dashboardDesigner;
         const { visiblePreviewBox, previewItem } = this.state;
         const { visiblePreviewBox, previewItem } = this.state;
         const children = dashboardDesigner.items.map((item) => this.createElement(item, false, !item.chartOption));
         const children = dashboardDesigner.items.map((item) => this.createElement(item, false, !item.chartOption));
@@ -105,7 +105,7 @@ class ViewLayout extends React.PureComponent {
                 {(children.length === 0) ? <div key='default-chartview' className='default-chartview' data-grid={{ x: 0, y: 0, w: 12, h: 2, minW: 12, maxW: 12, minH: 2, maxH: 2, static: true }}>
                 {(children.length === 0) ? <div key='default-chartview' className='default-chartview' data-grid={{ x: 0, y: 0, w: 12, h: 2, minW: 12, maxW: 12, minH: 2, maxH: 2, static: true }}>
                     <div className='tip'>
                     <div className='tip'>
                         <Icon type="message" theme="outlined" />
                         <Icon type="message" theme="outlined" />
-                        {isOwner ? <span>请从左侧【图表添加】栏目中选择图表添加到看板</span> : <span>无图表元素</span>}
+                        {(isOwner && !isShareView) ? <span>请从左侧【图表添加】栏目中选择图表添加到看板</span> : <span>无图表元素</span>}
                     </div>
                     </div>
                 </div> : children}
                 </div> : children}
             </ReactGridLayout>
             </ReactGridLayout>

+ 10 - 3
src/components/dataSourceDetail/dataConnectBox.jsx

@@ -16,9 +16,13 @@ class DataConnectBox extends React.Component {
         const { dispatch, dataConnect} = this.props;
         const { dispatch, dataConnect} = this.props;
         const operation = dataConnect.newOne.boxOperation;
         const operation = dataConnect.newOne.boxOperation;
         if(operation === 'create') {
         if(operation === 'create') {
-            dispatch({ type: 'dataConnect/remoteAdd' });
+            dispatch({ type: 'dataConnect/remoteAdd' }).then(() => {
+                this.hideBox()
+            });
         }else if(operation === 'modify') {
         }else if(operation === 'modify') {
-            dispatch({ type: 'dataConnect/remoteModify', code: dataConnect.newOne.code });
+            dispatch({ type: 'dataConnect/remoteModify', code: dataConnect.newOne.code }).then(() => {
+                this.hideBox();
+            });
         }
         }
     }
     }
 
 
@@ -58,7 +62,10 @@ class DataConnectBox extends React.Component {
                                 </Button>
                                 </Button>
                                 <Button onClick={() => dispatch({ type:'dataConnect/resetNewModel'})}>清空</Button>
                                 <Button onClick={() => dispatch({ type:'dataConnect/resetNewModel'})}>清空</Button>
                                 {/* <Button onClick={() => {this.hideBox()}}>取 消</Button> */}
                                 {/* <Button onClick={() => {this.hideBox()}}>取 消</Button> */}
-                                <Button className={dataConnect.newOne.validating ? 'ant-btn-loading' : ''} type="primary" disabled={dataConnect.newOne.validating} onClick={() => {this.okHandler()}}>保存</Button>
+                                <Button className={dataConnect.newOne.validating ? 'ant-btn-loading' : ''} type="primary" disabled={dataConnect.newOne.validating} onClick={() => {this.okHandler()}}>
+                                    {dataConnect.newOne.validating ? (<Icon type='loading' />) : ''}
+                                    {dataConnect.newOne.validating ? '校验中' : '保存'}
+                                </Button>
                             </Col>
                             </Col>
                         </Row>
                         </Row>
                     )
                     )

+ 3 - 2
src/constants/url.js

@@ -1,6 +1,5 @@
-// const BASE_URL = 'http://192.168.253.189:81/BI';
-// const BASE_URL = 'http://192.168.253.129:8011';
 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 URLS = {
 const URLS = {
@@ -169,6 +168,8 @@ const URLS = {
 
 
     DASHBOARD_TRANSFER: BASE_URL + '/changeDashOrder', // 看板移交
     DASHBOARD_TRANSFER: BASE_URL + '/changeDashOrder', // 看板移交
 
 
+    DASHBOARD_SHARE_DETAIL: BASE_URL + '/XXXX', // 获得看板分享数据
+
     /***************************************浏览记录***************************************/
     /***************************************浏览记录***************************************/
     
     
     HISTORY_ADD: BASE_URL + '/addRecord', // 添加图表、看板浏览记录 0 - 图表  1 - 看板
     HISTORY_ADD: BASE_URL + '/addRecord', // 添加图表、看板浏览记录 0 - 图表  1 - 看板

+ 9 - 3
src/models/chart.js

@@ -129,6 +129,7 @@ export default {
                 }
                 }
                 const res = yield call(service.fetch, {
                 const res = yield call(service.fetch, {
                     url: URLS.CHART_LIST,
                     url: URLS.CHART_LIST,
+                    method: 'GET',
                     body
                     body
                 });
                 });
                 console.log('请求图表列表', body, res);
                 console.log('请求图表列表', body, res);
@@ -148,7 +149,8 @@ export default {
                             createTime: d.createDate,
                             createTime: d.createDate,
                             description: d.describes || '',
                             description: d.describes || '',
                             groupCode: d.chartsGroup + '',
                             groupCode: d.chartsGroup + '',
-                            chartOption: chartOption
+                            chartOption: chartOption,
+                            demo: d.demo
                         }
                         }
                     })
                     })
                     yield put({ type: 'list', list: list });
                     yield put({ type: 'list', list: list });
@@ -168,7 +170,10 @@ export default {
             try {
             try {
                 const res = yield call(service.fetch, {
                 const res = yield call(service.fetch, {
                     url: URLS.CHART_DETAIL,
                     url: URLS.CHART_DETAIL,
-                    body: code
+                    method: 'GET',
+                    body: {
+                        id: code
+                    }
                 });
                 });
                 console.log('解析图表数据', code, res);
                 console.log('解析图表数据', code, res);
                 if(!res.err && res.data.code > 0) {
                 if(!res.err && res.data.code > 0) {
@@ -199,7 +204,8 @@ export default {
                         description: resData.describes,
                         description: resData.describes,
                         group: resData.chartsGroup+'',
                         group: resData.chartsGroup+'',
                         filters: filters,
                         filters: filters,
-                        chartOption: chartOption
+                        chartOption: chartOption,
+                        demo: resData.demo
                     }
                     }
 
 
                     if(viewType === 'bar') {
                     if(viewType === 'bar') {

+ 2 - 1
src/models/chartDesigner.js

@@ -53,7 +53,8 @@ export default {
             filters: [],
             filters: [],
             chartOption: {},
             chartOption: {},
             dirty: false,
             dirty: false,
-            fetchConfig: {}
+            fetchConfig: {},
+            demo: false
         },
         },
     },
     },
     reducers: {
     reducers: {

+ 99 - 8
src/models/dashboard.js

@@ -48,6 +48,7 @@ export default {
                 }
                 }
                 const res = yield call(service.fetch, {
                 const res = yield call(service.fetch, {
                     url: URLS.DASHBOARD_LIST,
                     url: URLS.DASHBOARD_LIST,
+                    method: 'GET',
                     body
                     body
                 });
                 });
                 console.log('请求看板列表', body, res);
                 console.log('请求看板列表', body, res);
@@ -64,6 +65,8 @@ export default {
                             creatorCode: d.createId + '',
                             creatorCode: d.createId + '',
                             creatorName: d.createBy,
                             creatorName: d.createBy,
                             createTime: d.createDate,
                             createTime: d.createDate,
+                            shareCode: d.shareCode,
+                            demo: d.demo
                         }
                         }
                     })
                     })
                     yield put({ type: 'list', list: list });
                     yield put({ type: 'list', list: list });
@@ -84,13 +87,17 @@ export default {
                 yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
                 yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
                 const res = yield call(service.fetch, {
                 const res = yield call(service.fetch, {
                     url: URLS.DASHBOARD_DETAIL,
                     url: URLS.DASHBOARD_DETAIL,
-                    body: code
+                    method: 'GET',
+                    body: {
+                        id: code
+                    }
                 });
                 });
                 console.log('解析看板数据', code, res);
                 console.log('解析看板数据', code, res);
                 if(!res.err && res.data.code > 0) {
                 if(!res.err && res.data.code > 0) {
                     const resData = res.data.data;
                     const resData = res.data.data;
                     let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
                     let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
                     let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
                     let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
+                    let chartCodes = resData.chartCodes ? resData.chartCodes.split(',') : [];
                     const main = yield select(state => state.present.main);
                     const main = yield select(state => state.present.main);
                     const { currentUser } = main;
                     const { currentUser } = main;
 
 
@@ -124,7 +131,10 @@ export default {
                         dataSources: dataSources,
                         dataSources: dataSources,
                         relationColumns: relationColumns,
                         relationColumns: relationColumns,
                         editMode: currentUser.code === resData.createId + '',
                         editMode: currentUser.code === resData.createId + '',
-                        filters: JSON.parse((resData.filters|| "[]")) 
+                        filters: JSON.parse((resData.filters|| "[]")),
+                        shareCode: resData.shareCode,
+                        chartCodes: chartCodes,
+                        demo: resData.demo
                     }
                     }
 
 
                     let fields = [];
                     let fields = [];
@@ -148,14 +158,16 @@ export default {
         *remoteAdd(action, { select, call, put }) {
         *remoteAdd(action, { select, call, put }) {
             try {
             try {
                 const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
                 const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
-                const { name, items, thumbnail, relationColumns, filters } = dashboardDesigner;
+                const { name, items, thumbnail, relationColumns, filters, shareCode } = dashboardDesigner;
                 let body = {
                 let body = {
                     bdName: name,
                     bdName: name,
                     bdNote: '',
                     bdNote: '',
                     bdConfiguration: JSON.stringify(items),
                     bdConfiguration: JSON.stringify(items),
                     thumbnail: thumbnail,
                     thumbnail: thumbnail,
                     relationColumns: JSON.stringify(relationColumns),
                     relationColumns: JSON.stringify(relationColumns),
-                    filters: JSON.stringify(filters) || ''
+                    filters: JSON.stringify(filters) || '',
+                    shareCode: shareCode,
+                    chartCodes: []
                 }
                 }
                 console.log('新增看板', body);
                 console.log('新增看板', body);
                 const res = yield call(service.fetch, {
                 const res = yield call(service.fetch, {
@@ -177,14 +189,16 @@ export default {
         *remoteQucikAdd(action, { select, call, put }) {
         *remoteQucikAdd(action, { select, call, put }) {
             try {
             try {
                 const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
                 const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
-                const { name, items, thumbnail, description, relationColumns, filters } = dashboardDesigner;
+                const { name, items, thumbnail, description, relationColumns, filters, shareCode } = dashboardDesigner;
                 let body = {
                 let body = {
                     bdName: name,
                     bdName: name,
                     bdNote: description,
                     bdNote: description,
                     bdConfiguration: JSON.stringify(items),
                     bdConfiguration: JSON.stringify(items),
                     thumbnail: thumbnail,
                     thumbnail: thumbnail,
                     relationColumns: JSON.stringify(relationColumns),
                     relationColumns: JSON.stringify(relationColumns),
-                    filters: JSON.stringify(filters) || ""
+                    filters: JSON.stringify(filters) || "",
+                    shareCode: shareCode,
+                    chartCodes: []
                 }
                 }
                 console.log('快速新增看板', body);
                 console.log('快速新增看板', body);
                 const res = yield call(service.fetch, {
                 const res = yield call(service.fetch, {
@@ -206,7 +220,7 @@ export default {
         *remoteModify(action, { select, call, put }) {
         *remoteModify(action, { select, call, put }) {
             try {
             try {
                 const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
                 const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
-                const { code, name, items, thumbnail, description, relationColumns, filters } = dashboardDesigner;
+                const { code, name, items, thumbnail, description, relationColumns, filters, chartCodes, shareCode } = dashboardDesigner;
                 let body = {
                 let body = {
                     id: code,
                     id: code,
                     bdName: name,
                     bdName: name,
@@ -214,7 +228,9 @@ export default {
                     bdConfiguration: JSON.stringify(items.map(item => ({ ...item, chartOption: null }))),
                     bdConfiguration: JSON.stringify(items.map(item => ({ ...item, chartOption: null }))),
                     thumbnail: thumbnail,
                     thumbnail: thumbnail,
                     relationColumns: JSON.stringify(relationColumns),
                     relationColumns: JSON.stringify(relationColumns),
-                    filters: JSON.stringify(filters) || ""
+                    filters: JSON.stringify(filters) || "",
+                    chartCodes: chartCodes.join(','),
+                    shareCode: shareCode
                 }
                 }
                 const res = yield call(service.fetch, {
                 const res = yield call(service.fetch, {
                     url: URLS.DASHBOARD_UPDATE,
                     url: URLS.DASHBOARD_UPDATE,
@@ -328,6 +344,81 @@ export default {
                 message.error('移交失败: ' + e);
                 message.error('移交失败: ' + e);
             }
             }
         },
         },
+        *remoteShareDetail(action, { select, call, put }) {
+            const code = action.code;
+            if(!code){
+                return
+            }
+            try {
+                yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
+                const res = yield call(service.fetch, {
+                    url: URLS.DASHBOARD_SHARE_DETAIL,
+                    method: 'GET',
+                    body: {
+                        id: code
+                    }
+                });
+                if(!res.err && res.data.code > 0) {
+                    const resData = res.data.data;
+                    let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
+                    let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
+                    let chartCodes = resData.chartCodes ? resData.chartCodes.split(',') : [];
+                    const main = yield select(state => state.present.main);
+                    const { currentUser } = main;
+
+                    const allDataSources = items.map(item => {
+                        if(item.viewType === 'chart') {
+                            return {
+                                code: item.dataSourceCode,
+                                name: item.dataSourceName
+                            }
+                        }else {
+                            return null
+                        }
+                    }).filter(item => !!item);
+
+                    const dataSources = [];
+                    allDataSources.forEach(ad => {
+                        if(!dataSources.find(d => d.code === ad.code)) {
+                            dataSources.push(ad);
+                        }
+                    });
+
+                    let data = {
+                        code:  resData.id+'',
+                        name: resData.bdName,
+                        items: items,
+                        description: resData.bdNote || '',
+                        thumbnail: resData.thumbnail,
+                        creatorCode: resData.createId + '',
+                        creatorName: resData.createBy,
+                        createTime: resData.createDate,
+                        dataSources: dataSources,
+                        relationColumns: relationColumns,
+                        editMode: currentUser.code === resData.createId + '',
+                        filters: JSON.parse((resData.filters|| "[]")),
+                        shareCode: resData.shareCode,
+                        chartCodes: chartCodes,
+                        demo: resData.demo
+                    }
+
+                    let fields = [];
+                    for(let key in data) {
+                        fields.push({
+                            name: key,
+                            value: data[key]
+                        })
+                    }
+                    yield put({ type: 'dashboardDesigner/silentSetFields', fields: fields });
+                }else {
+                    message.error('解析看板错误: ' + (res.err || res.data.msg));
+                }
+            }catch(e) {
+                message.error('解析看板错误: ' + e);
+            }finally {
+                yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
+            }
+        },
     },
     },
     subscriptions: {
     subscriptions: {
         setup({ dispatch, history}) {
         setup({ dispatch, history}) {

+ 12 - 6
src/models/dashboardDesigner.js

@@ -67,6 +67,7 @@ export default {
             name: '无标题',
             name: '无标题',
             defaultLayout: { x: 0, y: 50, w: 12, h: 6, minW: 2, maxW: 12, minH: 1 },
             defaultLayout: { x: 0, y: 50, w: 12, h: 6, minW: 2, maxW: 12, minH: 1 },
             items: [],
             items: [],
+            chartCodes: [], // 报表包含的所有图表
             description: '',
             description: '',
             thumbnail: '',
             thumbnail: '',
             dirty: false,
             dirty: false,
@@ -77,6 +78,8 @@ export default {
             relationColumns: [], // 自定义的列
             relationColumns: [], // 自定义的列
             columnFetching: false,
             columnFetching: false,
             loading: false,
             loading: false,
+            shareCode: '', // 分享码
+            demo: false
         },
         },
     },
     },
     
     
@@ -110,7 +113,7 @@ export default {
             return Object.assign({}, newState, {dirty: true});
             return Object.assign({}, newState, {dirty: true});
         },
         },
         addChart(state, action) {
         addChart(state, action) {
-            let { items, dataSources, defaultLayout } = state;
+            let { items, dataSources, chartCodes, defaultLayout } = state;
             const { chart } = action;
             const { chart } = action;
 
 
             items = items.concat([{
             items = items.concat([{
@@ -126,14 +129,15 @@ export default {
                 filters: chart.filters,
                 filters: chart.filters,
                 layout: defaultLayout,
                 layout: defaultLayout,
             }]);
             }]);
+            chartCodes.push(chart.code);
             dataSources.findIndex(d => d.code === chart.dataSourceCode+'') === -1 && dataSources.push({
             dataSources.findIndex(d => d.code === chart.dataSourceCode+'') === -1 && dataSources.push({
                 code: chart.dataSourceCode+'',
                 code: chart.dataSourceCode+'',
                 name: chart.dataSourceName
                 name: chart.dataSourceName
             });
             });
-            return Object.assign({}, state, {items, dataSources, dirty: true});
+            return Object.assign({}, state, {items, chartCodes, dataSources, dirty: true});
         },
         },
         addCharts(state, action) {
         addCharts(state, action) {
-            let { items, dataSources, defaultLayout } = state;
+            let { items, chartCodes, dataSources, defaultLayout } = state;
             const { charts } = action;
             const { charts } = action;
 
 
             items = items.concat(charts.map(c => {
             items = items.concat(charts.map(c => {
@@ -141,6 +145,7 @@ export default {
                     code: c.dataSourceCode+'',
                     code: c.dataSourceCode+'',
                     name: c.dataSourceName
                     name: c.dataSourceName
                 });
                 });
+                chartCodes.push(c.code);
                 return {
                 return {
                     code: c.code,
                     code: c.code,
                     chartCode: c.code,
                     chartCode: c.code,
@@ -155,10 +160,10 @@ export default {
                     layout: defaultLayout,
                     layout: defaultLayout,
                 }
                 }
             }));
             }));
-            return Object.assign({}, state, {items, dataSources, dirty: true});
+            return Object.assign({}, state, {items, chartCodes, dataSources, dirty: true});
         },
         },
         deleteItem(state, action) {
         deleteItem(state, action) {
-            let { items, dataSources, relationColumns, dirty } = state;
+            let { items, chartCodes, dataSources, relationColumns, dirty } = state;
             const { item } = action;
             const { item } = action;
 
 
             let count = 0;
             let count = 0;
@@ -174,9 +179,10 @@ export default {
             }
             }
 
 
             if(count === 1) {
             if(count === 1) {
-                // 找到只有被删除的item使用的数据源并删除
                 let idx = dataSources.findIndex(d => d.code === item.dataSourceCode);
                 let idx = dataSources.findIndex(d => d.code === item.dataSourceCode);
+                let idx2 = chartCodes.findIndex(c => c === item.chartCode);
                 dataSources.splice(idx, 1);
                 dataSources.splice(idx, 1);
+                chartCodes.splice(idx2, 1);
                 // 同时删除已定义的关联字段
                 // 同时删除已定义的关联字段
                 relationColumns.forEach(rc => {
                 relationColumns.forEach(rc => {
                     rc.relations.forEach((r, x) => {
                     rc.relations.forEach((r, x) => {

+ 4 - 1
src/models/dataConnect.js

@@ -91,6 +91,7 @@ export default {
             delete newOne.userName;
             delete newOne.userName;
             delete newOne.password;
             delete newOne.password;
             delete newOne.description;
             delete newOne.description;
+            delete newOne.demo;
             return Object.assign({}, state, {newOne});
             return Object.assign({}, state, {newOne});
         },
         },
         setNewModelInvalid(state, action) {
         setNewModelInvalid(state, action) {
@@ -118,6 +119,7 @@ export default {
                 }
                 }
                 const res = yield call(service.fetch, {
                 const res = yield call(service.fetch, {
                     url: URLS.DATACONNECT_LIST,
                     url: URLS.DATACONNECT_LIST,
+                    method: 'GET',
                     body
                     body
                 });
                 });
                 console.log('请求数据连接配置列表', body,  res);
                 console.log('请求数据连接配置列表', body,  res);
@@ -133,7 +135,8 @@ export default {
                             port: r.port,
                             port: r.port,
                             userName: r.userName,
                             userName: r.userName,
                             password: r.passWord,
                             password: r.passWord,
-                            description: r.note
+                            description: r.note,
+                            demo: r.demo
                         }
                         }
                     });
                     });
                     yield put({ type: 'list', data });
                     yield put({ type: 'list', data });

+ 4 - 2
src/models/dataSource.js

@@ -152,7 +152,8 @@ export default {
                             createTime: new Date(r.createDate),
                             createTime: new Date(r.createDate),
                             tags: tags,
                             tags: tags,
                             description: r.note,
                             description: r.note,
-                            groupCode: r.connectorGroup+''
+                            groupCode: r.connectorGroup+'',
+                            demo: r.demo
                         }
                         }
                     });
                     });
                     yield put({ type: 'list', list });
                     yield put({ type: 'list', list });
@@ -258,7 +259,8 @@ export default {
                                 bucketizable: c.isSubsection==='1'?true:false,
                                 bucketizable: c.isSubsection==='1'?true:false,
                                 description: c.remarks
                                 description: c.remarks
                             }
                             }
-                        })
+                        }),
+                        demo: resData.demo
                     }
                     }
                     let fields = [];
                     let fields = [];
                     for(let key in data) {
                     for(let key in data) {

+ 2 - 0
src/models/dataSourceDetail.js

@@ -25,6 +25,7 @@ export default {
             group: '-1',
             group: '-1',
             notice: '',
             notice: '',
             columns: [],
             columns: [],
+            demo: false
         },
         },
         code: null,
         code: null,
         name: '未命名',
         name: '未命名',
@@ -44,6 +45,7 @@ export default {
         group: '-1',
         group: '-1',
         notice: '',
         notice: '',
         columns: [],
         columns: [],
+        demo: false
     },
     },
     reducers: {
     reducers: {
         setField(state, action) {
         setField(state, action) {

+ 4 - 0
src/routes/router.js

@@ -8,10 +8,12 @@ import MainLayout from './mainLayout'
 import DataSourceDetail from '../components/dataSourceDetail/layout'
 import DataSourceDetail from '../components/dataSourceDetail/layout'
 import ChartDesigner from '../components/chartDesigner/layout'
 import ChartDesigner from '../components/chartDesigner/layout'
 import DashboardDesigner from '../components/dashboardDesigner/layout'
 import DashboardDesigner from '../components/dashboardDesigner/layout'
+import DashboardShareView from '../components/dashboard/dashboardShareView'
 // 由于 antd 组件的默认文案是英文,所以需要修改为中文
 // 由于 antd 组件的默认文案是英文,所以需要修改为中文
 import zhCN from 'antd/lib/locale-provider/zh_CN'
 import zhCN from 'antd/lib/locale-provider/zh_CN'
 import Demo from '../demo';
 import Demo from '../demo';
 import Xiaomi from '../xiaomi'
 import Xiaomi from '../xiaomi'
+import ShareQR from '../components/common/shareQR/shareQR'
 
 
 
 
 function RouterConfig({ history }) {
 function RouterConfig({ history }) {
@@ -23,6 +25,8 @@ function RouterConfig({ history }) {
                     <Route sensitive path='/register' component={Register} />
                     <Route sensitive path='/register' component={Register} />
                     <Route sensitive path='/demo' component={Demo} />
                     <Route sensitive path='/demo' component={Demo} />
                     <Route sensitive path='/xiaomi' component={Xiaomi} />
                     <Route sensitive path='/xiaomi' component={Xiaomi} />
+                    <Route sensitive path='/sqr' component={ShareQR} />
+                    <Route sensitive path='/dashboard/share/:code' component={DashboardShareView} />
                     <PrivateRoute sensitive path='/datasource/:type/:code/:tab' component={DataSourceDetail}/>
                     <PrivateRoute sensitive path='/datasource/:type/:code/:tab' component={DataSourceDetail}/>
                     <PrivateRoute sensitive path='/chart/:code' component={ChartDesigner} />
                     <PrivateRoute sensitive path='/chart/:code' component={ChartDesigner} />
                     <PrivateRoute sensitive path='/dashboard/:code/' component={DashboardDesigner} />
                     <PrivateRoute sensitive path='/dashboard/:code/' component={DashboardDesigner} />

+ 2 - 2
src/services/index.js

@@ -4,8 +4,8 @@ import URLS from '../constants/url'
 export function fetch(option) {
 export function fetch(option) {
     let { url, method, body, timeout } = option;
     let { url, method, body, timeout } = option;
     const token = window.sessionStorage.getItem("token");
     const token = window.sessionStorage.getItem("token");
-    // 除登录请求外,Token不存在时不发送请求
-    if(token || ([URLS.LOGIN].indexOf(url) !== -1)) {
+    // 白名单外,Token不存在时不发送请求
+    if(token || ([URLS.LOGIN, URLS.DASHBOARD_SHARE_DETAIL].indexOf(url) !== -1)) {
         let opt = {
         let opt = {
             method: method || 'POST',
             method: method || 'POST',
         };
         };