king
2020-07-31 5ae8e447c55f61508546e00559f54eb623a5c803
2020-07-31
28个文件已修改
321 ■■■■ 已修改文件
src/index.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/options.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.scss 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/secretKeyTable/actionList/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/secretKeyTable/actionList/index.scss 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/secretKeyTable/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/secretKeyTable/index.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/scriptmanage/actionList/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/scriptmanage/actionList/index.scss 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtable/index.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtable/index.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtabtable/index.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtabtable/index.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/verupmanage/actionList/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/verupmanage/actionList/index.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/verupmanage/index.scss 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/verupmanage/subtabtable/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/verupmanage/subtabtable/index.scss 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/index.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/actionList/printbutton/index.jsx 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/chartcomponent/index.jsx 136 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/chartcomponent/index.scss 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/normalTable/index.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/comtableconfig/index.jsx 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/chartgroupcomponent/chartform/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/subtableconfig/index.jsx 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/index.scss 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/index.js
@@ -73,6 +73,8 @@
      if (config.appkey === options.cakey) {
        window.GLOB.appkey = ''
        console.warn('单点系统appkey不可与云端相同')
      } else {
        window.GLOB.appkey = config.appkey
      }
    } else if (options.sysType === 'local') { // 业务系统
      if (config.appkey === options.cakey) {
src/store/options.js
@@ -4,4 +4,5 @@
  caId: 'MjAyMDAxMTYxMjMzMzU1MDd$mkGQzkyMzI1Rjk4MDY0QUNGQjQ2Mg==',
  cakey: 'MjAyMDAxMTYxMjQwMDQ2NDM$mk2N0QzODE2MjExNUI0MTc4OTVDMQ==',
  cdomain: 'aHR0cDovL2Nsb3V$mkkLm1rOWguY24=' // window.btoa('') 域名 不带 /
  // cdomain: 'aHR0cDovL2Nsb3VkLnBv$mkc2l0ZWNncm91cC5jb206ODA4MA==' // bao—shi-de
}
src/tabviews/commontable/index.jsx
@@ -2,7 +2,7 @@
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import { is, fromJS } from 'immutable'
import { notification, Spin, Tabs, Icon, Switch, Modal, Button, message, Tree, Typography, Col } from 'antd'
import { notification, Spin, Tabs, Icon, Switch, Modal, Button, message, Tree, Typography, Row, Col } from 'antd'
import moment from 'moment'
import Api from '@/api'
@@ -1045,7 +1045,7 @@
            refreshdata={this.refreshbysearch}
          /> : null
        }
        {setting && setting.onload !== 'false' ? <div className="chart-view">
        {setting && setting.onload !== 'false' ? <Row className="chart-view" gutter={16}>
          {/* 视图组 */}
          {!config.expand ? <Tabs activeKey={chartId} onChange={this.changeChart}>
            {config.charts.map(item => (
@@ -1145,7 +1145,7 @@
              )
            }
          })}
        </div> : null }
        </Row> : null }
        {setting && setting.onload !== 'false' &&
          config.tabgroups.map(group => (
            <Tabs activeKey={tabActive[group.uuid]} key={group.uuid} onChange={(key) => this.setState({tabActive: {...tabActive, [group.uuid]: key}})}>
src/tabviews/commontable/index.scss
@@ -53,14 +53,14 @@
    position: relative;
    .main-pickup {
      position: absolute;
      right: 55px;
      right: 35px;
      top: -22px;
      z-index: 1;
    }
    .custom-control {
      position: absolute;
      z-index: 1;
      right: 20px;
      right: 0px;
      top: -23px;
      font-size: 18px;
      padding: 3px;
@@ -94,6 +94,7 @@
  }
  > .chart-view {
    position: relative;
    padding: 0 20px;
    >.ant-tabs {
      .ant-tabs-bar {
        position: relative;
@@ -124,7 +125,7 @@
      text-overflow: ellipsis;
      white-space: nowrap;
      overflow: hidden;
      margin: 0px 0px 0px 20px;
      margin: 0px;
      padding: 5px 10px;
      float: left;
      max-width: 50%;
@@ -140,7 +141,7 @@
}
.commontable.pick-control {
  .button-list {
    padding-right: 140px;
    padding-right: 110px;
  }
}
.menu-tree-modal {
src/tabviews/commontable/secretKeyTable/actionList/index.jsx
@@ -335,7 +335,7 @@
  render() {
    return (
      <div className="button-list toolbar-button">
      <div className="secret-button-list secret-toolbar-button">
        {this.props.actions.map((item, index) => {
          return (
            <Button
src/tabviews/commontable/secretKeyTable/actionList/index.scss
@@ -1,6 +1,5 @@
.button-list.toolbar-button {
.secret-button-list.secret-toolbar-button {
  position: relative;
  padding: 10px 20px 5px;
  background: #ffffff;
  button {
    min-width: 65px;
src/tabviews/commontable/secretKeyTable/index.jsx
@@ -324,7 +324,7 @@
    const { setting, actions, columns, pickup, config, selectedData } = this.state
    return (
      <div className="subtable" id={'subtable' + this.props.MenuID}>
      <div className="secretKey-subtable" id={'subtable' + this.props.MenuID}>
        <div className="sub-action">
          <SubAction
            setting={setting}
src/tabviews/commontable/secretKeyTable/index.scss
@@ -1,4 +1,4 @@
.subtable {
.secretKey-subtable {
  position: relative;
  min-height: 200px;
src/tabviews/scriptmanage/actionList/index.jsx
@@ -297,7 +297,7 @@
  render() {
    return (
      <div className="button-list toolbar-button">
      <div className="script-button-list script-toolbar-button">
        {this.props.actions.map((item, index) => {
          return (
            <Button
src/tabviews/scriptmanage/actionList/index.scss
@@ -1,6 +1,6 @@
.button-list.toolbar-button {
.script-button-list.script-toolbar-button {
  position: relative;
  padding: 10px 20px 5px;
  padding: 15px 20px 5px;
  background: #ffffff;
  button {
    min-width: 65px;
src/tabviews/subtable/index.jsx
@@ -2,7 +2,7 @@
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import { is, fromJS } from 'immutable'
import { notification, Spin, Switch, Col, Icon, Tabs} from 'antd'
import { notification, Spin, Switch, Row, Col, Icon, Tabs} from 'antd'
import moment from 'moment'
import Api from '@/api'
@@ -810,7 +810,7 @@
            refreshdata={this.refreshbysearch}
          /> : null
        }
        {config ? <div className="chart-view">
        {config ? <Row className="chart-view" gutter={16}>
          {/* 视图组 */}
          {!config.expand ? <Tabs activeKey={chartId} onChange={this.changeChart}>
            {config.charts.map(item => (
@@ -901,7 +901,7 @@
              )
            }
          })}
        </div> : null }
        </Row> : null }
        {viewlost ? <NotFount msg={this.state.lostmsg} /> : null}
      </div>
    )
src/tabviews/subtable/index.scss
@@ -7,9 +7,6 @@
  }
  .sub-action {
    min-height: 25px;
    .button-list {
      padding: 10px 0px 5px;
    }
  }
  > .chart-view {
    position: relative;
src/tabviews/subtabtable/index.jsx
@@ -2,7 +2,7 @@
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import { is, fromJS } from 'immutable'
import { notification, Spin, Col, Icon, Tabs} from 'antd'
import { notification, Spin, Col, Row, Icon, Tabs} from 'antd'
import moment from 'moment'
import Api from '@/api'
@@ -642,7 +642,7 @@
            refreshdata={this.refreshbysearch}
          /> : null
        }
        {config ? <div className="chart-view">
        {config ? <Row className="chart-view" gutter={16}>
          {/* 视图组 */}
          {!config.expand ? <Tabs activeKey={chartId} onChange={this.changeChart}>
            {config.charts.map(item => (
@@ -721,7 +721,7 @@
              )
            }
          })}
        </div> : null }
        </Row> : null }
        {viewlost ? <NotFount msg={this.state.lostmsg} /> : null}
      </div>
    )
src/tabviews/subtabtable/index.scss
@@ -5,9 +5,6 @@
  > .top-search {
    padding: 0 0px 10px;
  }
  .button-list.toolbar-button {
    padding: 10px 0px 5px;
  }
  .normal-data-table {
    padding: 0 0 30px;
  }
src/tabviews/verupmanage/actionList/index.jsx
@@ -812,7 +812,7 @@
    const { loadingUuid, loadingNumber } = this.state
    return (
      <div className="button-list toolbar-button">
      <div className="verup-button-list verup-toolbar-button">
        {this.props.actions.map((item, index) => {
          let label = item.label
          if (loadingUuid === item.uuid && loadingNumber !== '') {
src/tabviews/verupmanage/actionList/index.scss
@@ -1,4 +1,4 @@
.button-list.toolbar-button {
.verup-button-list.verup-toolbar-button {
  position: relative;
  padding: 10px 20px 5px;
  background: #ffffff;
src/tabviews/verupmanage/index.scss
@@ -56,6 +56,7 @@
  }
  .main-table-box {
    position: relative;
    padding: 0 20px;
    .pickchange {
      position: absolute;
      right: 0px;
src/tabviews/verupmanage/subtabtable/index.jsx
@@ -437,7 +437,7 @@
    const { config, setting, searchlist, actions, columns, pickup, selectedData } = this.state
    return (
      <div className="subtable" id={'subtable' + this.props.MenuID}>
      <div className="verup-subtable" id={'subtable' + this.props.MenuID}>
        {searchlist && searchlist.length > 0 ?
          <SubSearch
            dict={this.state.dict}
src/tabviews/verupmanage/subtabtable/index.scss
@@ -1,4 +1,4 @@
.subtable {
.verup-subtable {
  position: relative;
  min-height: 200px;
@@ -7,7 +7,7 @@
  }
  >.sub-action {
    min-height: 25px;
    .button-list {
    .verup-button-list {
      padding: 10px 0px 5px;
    }
  }
src/tabviews/zshare/actionList/index.scss
@@ -1,6 +1,6 @@
.button-list.toolbar-button {
  position: relative;
  padding: 10px 20px 5px;
  padding: 15px 0px 5px;
  background: #ffffff;
  button {
    min-width: 65px;
src/tabviews/zshare/actionList/printbutton/index.jsx
@@ -826,9 +826,7 @@
        }
        socket.send(JSON.stringify(request))
      } else {
        printerList.forEach((cell, index) => {
          setTimeout(() => {socket.send(JSON.stringify(cell))}, 500 * index)
        })
        this.syncMessageSend(printerList)
        this.execSuccess({
          ErrCode: 'S',
@@ -849,9 +847,7 @@
        }
        socket.send(JSON.stringify(request))
      } else {
        printerList.forEach((cell, index) => {
          setTimeout(() => {socket.send(JSON.stringify(cell))}, 500 * index)
        })
        this.syncMessageSend(printerList)
        this.execSuccess({
          ErrCode: 'S',
@@ -881,12 +877,14 @@
      }
      if (data && data.cmd === 'getPrinters' && data.status) {
        printerList.forEach((cell, index) => {
        printerList = printerList.map(cell => {
          if (cell.task.printer === 'lackprinter') {
            cell.task.printer = data.defaultPrinter
          }
          setTimeout(() => {socket.send(JSON.stringify(cell))}, 500 * index)
          return cell
        })
        this.syncMessageSend(printerList)
        this.execSuccess({
          ErrCode: 'S',
@@ -913,6 +911,18 @@
      })
    }
  }
  syncMessageSend = (list) => {
    let param = list.shift()
    if (socket && param) {
      socket.send(JSON.stringify(param))
    }
    if (list && list.length > 0) {
      setTimeout(() => {this.syncMessageSend(list)}, 3000)
    }
  }
  /**
   * @description 操作成功后处理
   * 1、excel导出,成功后取消导出按钮加载中状态
src/tabviews/zshare/chartcomponent/index.jsx
@@ -7,8 +7,8 @@
import asyncComponent from './asyncButtonComponent'
import Utils from '@/utils/utils.js'
import zhCN from '@/locales/zh-CN/model.js'
import enUS from '@/locales/en-US/model.js'
import zhCN from '@/locales/zh-CN/main.js'
import enUS from '@/locales/en-US/main.js'
import './index.scss'
const ExcelOutButton = asyncComponent(() => import('@/tabviews/zshare/actionList/exceloutbutton'))
@@ -16,29 +16,35 @@
class LineChart extends Component {
  static propTpyes = {
    BID: PropTypes.any,
    Tab: PropTypes.any,
    plot: PropTypes.object,
    data: PropTypes.array,
    loading: PropTypes.bool,
    config: PropTypes.object,
    getexceloutparam: PropTypes.func
    BID: PropTypes.any,              // 父级Id
    Tab: PropTypes.any,              // 标签信息
    plot: PropTypes.object,          // 图标设置信息
    data: PropTypes.array,           // 图表传入数据
    loading: PropTypes.bool,         // 数据加载中
    config: PropTypes.object,        // 页面配置信息
    getexceloutparam: PropTypes.func // 获取excel导出参数
  }
  state = {
    dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
    empty: true,
    actions: [],
    chartId: Utils.getuuid(),
    chartData: [],
    chartFields: [],
    selectFields: []
    dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS, // 字典
    empty: true,               // 图表数据为空
    actions: [],               // 图表绑定的按钮组
    chartId: Utils.getuuid(),  // 图表Id
    chartData: [],             // 图表数据
    chartFields: [],           // 统计图表生成字段集
    selectFields: [],          // 统计图表选择字段
    percentFields: []          // 设置为百分比的字段,tooltip时增加%
  }
  /**
   * @description 校验图表的按钮组,如果为统计图表,计算图表字段
   */
  componentDidMount () {
    const { plot, data, config } = this.props
    let _state = {}
    let actions = []
    let percentFields = []
    config.action.forEach(item => {
      if (!plot.actions || plot.actions.length === 0) return
      if (!(item.OpenType === 'excelOut' || (item.OpenType === 'excelIn' && item.Ot === 'notRequired'))) return
@@ -54,15 +60,38 @@
      _state.selectFields = result.selectFields
      _state.actions = actions
      let _column = config.columns.filter(col => plot.InfoValue === col.field)[0]
      if (_column && _column.format === 'percent') {
        percentFields.push(plot.InfoValue)
        _state.percentFields = percentFields
      }
      this.setState(_state, () => {
        this.viewrender()
      })
    } else {
      this.setState({ actions })
      this.viewrender()
      if (plot.chartType === 'line' || plot.chartType === 'bar') {
        try {
          plot.Yaxis.forEach(yaxis => {
            let _column = config.columns.filter(col => yaxis === col.field)[0]
            if (_column && _column.format === 'percent') {
              percentFields.push(_column.label)
            }
          })
        } catch {
          console.warn('Incorrect percentage setting')
        }
      }
      this.setState({ actions, percentFields }, () => {
        this.viewrender()
      })
    }
  }
  /**
   * @description 图表数据更新,刷新内容
   */
  UNSAFE_componentWillReceiveProps (nextProps) {
    const { plot } = this.props
    if (!is(fromJS(this.props.data), fromJS(nextProps.data))) {
@@ -89,6 +118,12 @@
    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
  }
  /**
   * @description 图表数据预处理
   * 1、通过显示列进行数据类型转换
   * 2、重复数据:取平均值、累计、去重
   * 3、柱状图数据补齐
   */
  getdata = () => {
    const { data, plot, config } = this.props
    let vFields = plot.Yaxis && typeof(plot.Yaxis) === 'string' ? [plot.Yaxis] : plot.Yaxis
@@ -217,6 +252,9 @@
    return _data
  }
  /**
   * @description 统计数据预处理,动态生成统计字段并进行数据转换
   */
  getStaticMsg = (data) => {
    const { plot, config } = this.props
@@ -248,7 +286,7 @@
        item.$uuid = item[plot.InfoType] + item[plot.Xaxis]
        if (typeof(item[plot.InfoValue]) !== 'number') {
          item[plot.InfoValue] = parseFloat(plot.InfoValue)
          item[plot.InfoValue] = parseFloat(item[plot.InfoValue])
          if (isNaN(item[plot.InfoValue])) {
            item[plot.InfoValue] = 0
          }
@@ -285,7 +323,7 @@
        item.$uuid = item[plot.InfoType] + item[plot.Xaxis]
        if (typeof(item[plot.InfoValue]) !== 'number') {
          item[plot.InfoValue] = parseFloat(plot.InfoValue)
          item[plot.InfoValue] = parseFloat(item[plot.InfoValue])
          if (isNaN(item[plot.InfoValue])) {
            item[plot.InfoValue] = 0
          }
@@ -320,7 +358,7 @@
        if (!_mdata.has(item.$uuid)) {
          if (typeof(item[plot.InfoValue]) !== 'number') {
            item[plot.InfoValue] = parseFloat(plot.InfoValue)
            item[plot.InfoValue] = parseFloat(item[plot.InfoValue])
            if (isNaN(item[plot.InfoValue])) {
              item[plot.InfoValue] = 0
            }
@@ -350,6 +388,9 @@
    return {data: _data, chartFields: _chartFields, selectFields: _selectFields}
  }
  /**
   * @description 获取统计图表展示数据,通过选择类型筛选
   */
  getStaticData = () => {
    const { plot } = this.props
    const { chartData, chartFields, selectFields } = this.state
@@ -365,6 +406,9 @@
    return _data
  }
  /**
   * @description 图表渲染分组
   */
  viewrender = () => {
    const { plot } = this.props
@@ -377,8 +421,12 @@
    }
  }
  /**
   * @description 折线图渲染
   */
  linerender = () => {
    const { plot, config } = this.props
    const { percentFields } = this.state
    let _data = []
    let _valfield = 'value'
@@ -489,6 +537,12 @@
      .position(`${plot.Xaxis}*${_valfield}`)
      .color(_typefield)
      .shape(plot.shape || 'smooth')
      .tooltip(`${plot.Xaxis}*${_valfield}*${_typefield}`, (name, value, type) => {
        return {
          name: type,
          value: percentFields.includes(type) ? value + '%' : value
        }
      })
    if (plot.label === 'true') {
      _chart.label(_valfield)
@@ -506,8 +560,12 @@
    chart.render()
  }
  /**
   * @description 自定义渲染
   */
  customrender = (data, transfield) => {
    const { plot } = this.props
    const { percentFields } = this.state
    let barfields = []
    let fields = []
@@ -630,13 +688,19 @@
          label: null
        })
      }
      if (item.chartType === 'bar') {
        let _chart = chart
          .interval()
          .position(`${plot.Xaxis}*${item.name}`)
          .color(item.color)
          .shape(item.shape)
          .tooltip(`${item.name}`, (value) => {
            return {
              name: item.name,
              value: percentFields.includes(item.name) ? value + '%' : value
            }
          })
        if (item.label === 'true') {
          _chart.label(item.name)
@@ -647,6 +711,12 @@
          .position(`${plot.Xaxis}*${item.name}`)
          .color(item.color)
          .shape(item.shape)
          .tooltip(`${item.name}`, (value) => {
            return {
              name: item.name,
              value: percentFields.includes(item.name) ? value + '%' : value
            }
          })
        if (item.label === 'true') {
          _chart.label(item.name)
@@ -666,8 +736,12 @@
    chart.render()
  }
  /**
   * @description 柱状图渲染
   */
  barrender = () => {
    const { plot, config } = this.props
    const { percentFields } = this.state
    let _data = []
    let _valfield = 'value'
@@ -785,6 +859,12 @@
          }
        ])
        .shape(plot.shape || 'rect')
        .tooltip(`${plot.Xaxis}*${_valfield}*${_typefield}`, (name, value, type) => {
          return {
            name: type,
            value: percentFields.includes(type) ? value + '%' : value
          }
        })
      if (plot.label === 'true') {
        _chart.label(_valfield)
@@ -796,6 +876,12 @@
        .color(_typefield)
        .adjust('stack')
        .shape(plot.shape || 'rect')
        .tooltip(`${plot.Xaxis}*${_valfield}*${_typefield}`, (name, value, type) => {
          return {
            name: type,
            value: percentFields.includes(type) ? value + '%' : value
          }
        })
      if (plot.label === 'true') {
        _chart.label(_valfield)
@@ -805,6 +891,9 @@
    chart.render()
  }
  /**
   * @description 饼图渲染
   */
  pierender = () => {
    const { plot, config } = this.props
@@ -953,6 +1042,9 @@
    chart.render()
  }
  /**
   * @description 统计图表,统计类型切换
   */
  handleChange = (val) => {
    this.setState({selectFields: val}, () => {
      let _element = document.getElementById(this.state.chartId)
src/tabviews/zshare/chartcomponent/index.scss
@@ -2,7 +2,7 @@
  margin-bottom: 30px;
  
  .canvas-wrap {
    margin: 0 20px;
    margin: 0 0px;
    position: relative;
    border-top: 1px solid transparent;
    .chart-action {
@@ -61,6 +61,8 @@
  > .ant-select {
    width: 150px;
    float: right;
    position: relative;
    z-index: 1;
    .ant-select-selection {
      min-height: 24px;
      height: 28px;
src/tabviews/zshare/normalTable/index.scss
@@ -1,5 +1,5 @@
.normal-data-table {
  padding: 0 20px 30px;
  padding: 0 0px 30px;
  table {
    max-width: 100%;
    width: 100%;
src/templates/comtableconfig/index.jsx
@@ -1145,19 +1145,42 @@
      })
    }
    let charterr = ''
    config.charts.forEach(chart => {
      if (!charterr && ['line', 'bar', 'pie'].includes(chart.chartType) && !chart.Xaxis) {
        charterr = '图表' + (chart.title ? '《' + chart.title + '》' : '') + '坐标轴未设置,不可启用!'
      }
    })
    let hasKey = false
    let chartcols = []
    config.columns.forEach(col => {
      if (col.field) {
        chartcols.push(col.field)
      }
      if (config.setting.primaryKey === col.field) {
        hasKey = true
      }
    })
    let chartError = ''
    config.charts && config.charts.forEach((chart, index) => {
      if (chartError) return
      if (chart.Hide === 'true') return
      if (!['line', 'bar', 'pie'].includes(chart.chartType)) return
      if (!chart.Xaxis) {
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段尚未设置,不可启用!`
      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype !== 'statistics' && (!chart.Yaxis || chart.Yaxis.length === 0)) { // query 查询数据
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段尚未设置,不可启用!`
      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype === 'statistics' && (!chart.InfoType || !chart.InfoValue)) { // statistics 统计数据
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段尚未设置,不可启用!`
      } else if (chart.chartType === 'pie' && !chart.Yaxis) {
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段尚未设置,不可启用!`
      } else if (!chartcols.includes(chart.Xaxis)) {
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段在显示列中不存在,不可启用!`
      } else if (chart.chartType === 'pie' && !chartcols.includes(chart.Yaxis)) {
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段在显示列中不存在,不可启用!`
      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype === 'statistics' && (!chartcols.includes(chart.InfoType) || !chartcols.includes(chart.InfoValue))) { // statistics 统计数据
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段在显示列中不存在,不可启用!`
      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype !== 'statistics' && chart.Yaxis.filter(yaxis => !chartcols.includes(yaxis)).length > 0) {
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段在显示列中不存在,不可启用!`
      }
    })
    if (config.setting.interType === 'inner' && !config.setting.innerFunc && config.setting.default !== 'false' && !config.setting.dataresource) {
      return '菜单尚未设置数据源,不可启用!'
@@ -1167,8 +1190,8 @@
      return '显示列中不存在主键字段,不可启用!'
    } else if (!tabinvalid) {
      return '菜单标签页设置错误(存在多行标签时,行标签不可为空)!'
    } else if (charterr) {
      return charterr
    } else if (chartError) {
      return chartError
    } else {
      return true
    }
src/templates/sharecomponent/chartgroupcomponent/chartform/index.jsx
@@ -510,7 +510,7 @@
            card: 'credit-card'
          }
          if (result.chartType === 'line' || result.chartType === 'bar' || result.chartType === 'line') {
          if (result.chartType === 'line' || result.chartType === 'bar' || result.chartType === 'pie') {
            if (selectlegend && this.props.card.modelId !== selectlegend.uuid) {
              result = {...result, ...selectlegend.options}
            }
src/templates/subtableconfig/index.jsx
@@ -951,17 +951,39 @@
   * @description 校验配置信息的合法性
   */
  verifyconfig = (config) => {
    let charterr = ''
    config.charts.forEach(chart => {
      if (!charterr && ['line', 'bar', 'pie'].includes(chart.chartType) && !chart.Xaxis) {
        charterr = '图表' + (chart.title ? '《' + chart.title + '》' : '') + '坐标轴未设置,不可启用!'
    let hasKey = false
    let chartcols = []
    config.columns.forEach(col => {
      if (col.field) {
        chartcols.push(col.field)
      }
      if (config.setting.primaryKey === col.field) {
        hasKey = true
      }
    })
    let hasKey = false
    config.columns.forEach(col => {
      if (config.setting.primaryKey === col.field) {
        hasKey = true
    let chartError = ''
    config.charts && config.charts.forEach((chart, index) => {
      if (chartError) return
      if (chart.Hide === 'true') return
      if (!['line', 'bar', 'pie'].includes(chart.chartType)) return
      if (!chart.Xaxis) {
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段尚未设置,不可启用!`
      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype !== 'statistics' && (!chart.Yaxis || chart.Yaxis.length === 0)) { // query 查询数据
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段尚未设置,不可启用!`
      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype === 'statistics' && (!chart.InfoType || !chart.InfoValue)) { // statistics 统计数据
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段尚未设置,不可启用!`
      } else if (chart.chartType === 'pie' && !chart.Yaxis) {
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段尚未设置,不可启用!`
      } else if (!chartcols.includes(chart.Xaxis)) {
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段在显示列中不存在,不可启用!`
      } else if (chart.chartType === 'pie' && !chartcols.includes(chart.Yaxis)) {
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段在显示列中不存在,不可启用!`
      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype === 'statistics' && (!chartcols.includes(chart.InfoType) || !chartcols.includes(chart.InfoValue))) { // statistics 统计数据
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段在显示列中不存在,不可启用!`
      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype !== 'statistics' && chart.Yaxis.filter(yaxis => !chartcols.includes(yaxis)).length > 0) {
        chartError = `图表${chart.title ? '《' + chart.title + '》' : index + 1}坐标轴字段在显示列中不存在,不可启用!`
      }
    })
@@ -971,8 +993,8 @@
      return '菜单尚未设置主键,不可启用!'
    } else if (!hasKey) {
      return '显示列中不存在主键字段,不可启用!'
    } else if (charterr) {
      return charterr
    } else if (chartError) {
      return chartError
    } else {
      return true
    }
src/views/login/index.scss
@@ -42,6 +42,9 @@
        border-radius: 0;
        text-align: center;
        font-size: 18px;
        white-space: nowrap;
        text-overflow: ellipsis;
        overflow: hidden;
      }
      .ant-tabs-tab.ant-tabs-tab-active {
        cursor: default;
@@ -52,6 +55,7 @@
    .ant-tabs-tab {
      text-align: left!important;
      padding-left: 1.6vw!important;
      line-height: 60px!important;
    }
  }
  .login-middle {