king
2021-12-16 b5364600d98c8749caba625ec813d4fe670d0a19
2021-12-16
19个文件已修改
6个文件已添加
416 ■■■■■ 已修改文件
src/menu/components/card/cardcellcomponent/index.jsx 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/data-card/index.jsx 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/data-card/node-wrap/index.jsx 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/data-card/node-wrap/index.scss 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/data-card/node-wrap/menus/columnform/index.jsx 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/data-card/node-wrap/menus/columnform/index.scss 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/data-card/node-wrap/menus/index.jsx 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/data-card/node-wrap/menus/index.scss 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/data-card/options.jsx 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/index.jsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/verifycard/index.jsx 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/verifycard/settingform/index.jsx 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/components/formdragelement/index.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/searchconfig/groupdragelement/index.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/searchconfig/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/searchconfig/settingform/index.jsx 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/searchconfig/settingform/index.scss 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/card/data-card/index.jsx 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/index.jsx 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/appmanage/index.jsx 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/appmanage/submutilform/index.jsx 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/appmanage/submutilform/index.scss 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/menudesign/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mobdesign/index.jsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/pcdesign/index.jsx 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/cardcellcomponent/index.jsx
@@ -167,11 +167,11 @@
    if (comIds.length !== 3 || comIds[0] !== cards.uuid || comIds[1] !== cardCell.uuid || !card) return
    if (card.eleType === 'button') {
      if ((style.paddingLeft || style.paddingRight) && !style.width) {
        style.width = 'auto'
      }
    }
    // if (card.eleType === 'button') {
    //   if ((style.paddingLeft || style.paddingRight) && !style.width) {
    //     style.width = 'auto'
    //   }
    // }
    let _card = this.resetCardStyle(card, style)
src/menu/components/card/data-card/index.jsx
@@ -14,6 +14,7 @@
const SettingComponent = asyncIconComponent(() => import('@/menu/datasource'))
const NormalForm = asyncIconComponent(() => import('@/components/normalform'))
const CardComponent = asyncComponent(() => import('../cardcomponent'))
const Nodes = asyncComponent(() => import('./node-wrap'))
const MobPagination = asyncIconComponent(() => import('@/menu/components/share/mobPagination'))
const LogComponent = asyncIconComponent(() => import('@/menu/components/share/logcomponent'))
const CopyComponent = asyncIconComponent(() => import('@/menu/components/share/copycomponent'))
@@ -599,6 +600,16 @@
    }
  }
  updateSupNodes = (res) => {
    const { card } = this.state
    this.setState({
      card: {...card, supNodes: res}
    })
    this.updateComponent({...card, supNodes: res})
  }
  render() {
    const { card, appType } = this.state
@@ -626,6 +637,7 @@
            <NormalForm title="数据卡设置" width={800} update={this.updateWrap} getForms={this.getWrapForms}>
              <Icon type="edit" style={{color: '#1890ff'}} title="编辑"/>
            </NormalForm>
            {card.wrap.supType === 'multi' && appType !== 'mob' ? <Nodes card={card} updateMenus={this.updateSupNodes}/> : null}
            <CopyComponent type="datacard" card={card}/>
            <PasteComponent options={['action', 'search', 'form', 'cardcell']} updateConfig={this.pasteComponent} />
            <Icon className="style" title="调整样式" onClick={this.changeStyle} type="font-colors" />
src/menu/components/card/data-card/node-wrap/index.jsx
New file
@@ -0,0 +1,68 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Modal, Icon } from 'antd'
import MenusForm from './menus'
import './index.scss'
class NodesWrap extends Component {
  static propTpyes = {
    card: PropTypes.object,
    updateMenus: PropTypes.func
  }
  state = {
    visible: false,
    supNodes: [],
  }
  shouldComponentUpdate (nextProps, nextState) {
    return !is(fromJS(this.state), fromJS(nextState))
  }
  trigger = () => {
    const { card } = this.props
    this.setState({
      visible: true,
      supNodes: card.supNodes || []
    })
  }
  submit = () => {
    this.setState({
      visible: false
    })
    this.props.updateMenus(this.state.supNodes)
  }
  update = (supNodes) => {
    this.setState({supNodes})
  }
  render() {
    const { card } = this.props
    const { visible, supNodes } = this.state
    return (
      <>
        <Icon type="fork" title="上级组件" style={{color: 'orange'}} onClick={this.trigger}/>
        <Modal
          title="上级组件"
          wrapClassName="menus-field-modal"
          visible={visible}
          width={700}
          maskClosable={false}
          onOk={this.submit}
          onCancel={() => { this.setState({ visible: false })}}
          destroyOnClose
        >
          <MenusForm supNodes={supNodes} card={card} update={this.update}/>
        </Modal>
      </>
    )
  }
}
export default NodesWrap
src/menu/components/card/data-card/node-wrap/index.scss
New file
@@ -0,0 +1,9 @@
.menus-field-modal {
  .ant-modal {
    top: 70px;
  }
  .ant-modal-body {
    min-height: 150px;
    padding-top: 40px;
  }
}
src/menu/components/card/data-card/node-wrap/menus/columnform/index.jsx
New file
@@ -0,0 +1,82 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Row, Col, Button, Cascader, notification } from 'antd'
// import './index.scss'
class MenusColumn extends Component {
  static propTpyes = {
    supNodes: PropTypes.array,
    modules: PropTypes.array,
    columnChange: PropTypes.func
  }
  state = {options: []}
  handleConfirm = () => {
    const { supNodes } = this.props
    // 表单提交时检查输入值是否正确
    this.props.form.validateFieldsAndScroll((err, values) => {
      if (!err) {
        values.componentId = values.nodes[values.nodes.length - 1]
        if (supNodes.filter(item => item.componentId === values.componentId).length > 0) {
          notification.warning({
            top: 92,
            message: '组件已添加!',
            duration: 2
          })
          return
        }
        values.label = this.state.options.map(item => item.label).join(' / ')
        this.props.columnChange(values)
      }
    })
  }
  onChange = (values, options) => {
    this.setState({options: options})
  }
  render() {
    const { modules } = this.props
    const { getFieldDecorator } = this.props.form
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 8 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 }
      }
    }
    return (
      <Form {...formItemLayout}>
        <Row gutter={24}>
          <Col span={16}>
            <Form.Item label="组件">
              {getFieldDecorator('nodes', {
                initialValue: [],
                rules: [
                  {
                    required: true,
                    message: '请选择组件!'
                  }
                ]
              })(<Cascader options={modules} onChange={this.onChange} placeholder=""/>)}
            </Form.Item>
          </Col>
          <Col span={6} offset={2} style={{paddingTop: '4px'}}>
            <Button onClick={this.handleConfirm} type="primary" className="mk-green">
              添加
            </Button>
          </Col>
        </Row>
      </Form>
    )
  }
}
export default Form.create()(MenusColumn)
src/menu/components/card/data-card/node-wrap/menus/columnform/index.scss
src/menu/components/card/data-card/node-wrap/menus/index.jsx
New file
@@ -0,0 +1,69 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { fromJS } from 'immutable'
import Utils from '@/utils/utils.js'
import ColumnForm from './columnform'
import asyncComponent from '@/utils/asyncComponent'
import MenuUtils from '@/utils/utils-custom.js'
// import './index.scss'
const EditTable = asyncComponent(() => import('@/templates/zshare/editTable'))
class SupNodes extends Component {
  static propTpyes = {
    card: PropTypes.object,
    supNodes: PropTypes.array,
    update: PropTypes.func
  }
  state = {
    modules: [],
    columns: [
      {
        title: '组件',
        dataIndex: 'label',
        editable: false,
        width: '60%'
      }
    ]
  }
  UNSAFE_componentWillMount() {
    const { supNodes, card } = this.props
    let modules = MenuUtils.getSupModules(window.GLOB.customMenu.components, card.uuid) || []
    this.setState({
      modules,
      supNodes: fromJS(supNodes).toJS()
    })
  }
  columnChange = (values) => {
    const { supNodes } = this.state
    values.uuid = Utils.getuuid()
    let _nodes = [...supNodes, values]
    this.setState({supNodes: _nodes})
    this.props.update(_nodes)
  }
  changeColumns = (columns) => {
    this.setState({supNodes: columns})
    this.props.update(columns)
  }
  render() {
    const { supNodes, columns, modules } = this.state
    return (
      <div style={{minHeight: '250px'}}>
        <ColumnForm supNodes={supNodes} modules={modules} columnChange={this.columnChange}/>
        <EditTable actions={['del']} data={supNodes} columns={columns} onChange={this.changeColumns}/>
      </div>
    )
  }
}
export default SupNodes
src/menu/components/card/data-card/node-wrap/menus/index.scss
src/menu/components/card/data-card/options.jsx
@@ -118,6 +118,19 @@
      ]
    },
    {
      type: 'radio',
      field: 'supType',
      label: '上级类型',
      initval: wrap.supType || 'single',
      tooltip: '上级组件为单一组件或多个组件。',
      required: false,
      forbid: subtype !== 'datacard' || appType === 'mob',
      options: [
        {value: 'single', label: '单组件'},
        {value: 'multi', label: '多组件'},
      ]
    },
    {
      type: subtype === 'propcard' ? 'select' : 'radio',
      field: 'selStyle',
      label: '选中风格',
src/menu/datasource/index.jsx
@@ -241,7 +241,6 @@
        >
          <VerifyCard
            dict={dict}
            menu={window.GLOB.customMenu}
            mainSearch={mainSearch}
            config={config}
            wrappedComponentRef={(inst) => this.verifyRef = inst}
src/menu/datasource/verifycard/index.jsx
@@ -24,7 +24,6 @@
class VerifyCard extends Component {
  static propTpyes = {
    dict: PropTypes.object,          // 字典项
    menu: PropTypes.object,          // 菜单配置信息
    config: PropTypes.object,        // 组件配置信息
  }
@@ -161,7 +160,7 @@
    }
    let _setting = fromJS(config.setting).toJS()
    let scripts = fromJS(config.scripts).toJS()
    let scripts = config.scripts ? fromJS(config.scripts).toJS() : []
    if (window.GLOB.funcs && window.GLOB.funcs.length > 0) {
      window.GLOB.funcs.forEach(m => {
@@ -183,7 +182,7 @@
    this.setState({
      scripts,
      columns: fromJS(config.columns).toJS(),
      columns: config.columns ? fromJS(config.columns).toJS() : [],
      setting: _setting,
      searches: search,
      defaultSearch: _search
@@ -646,7 +645,7 @@
  }
  render() {
    const { menu, config } = this.props
    const { config } = this.props
    const { columns, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches, defaultsql } = this.state
    return (
@@ -655,7 +654,6 @@
        <Tabs activeKey={activeKey} className="data-source-card-box" onChange={this.changeTab}>
          <TabPane tab="数据源" key="setting">
            <SettingForm
              menu={menu}
              dict={this.props.dict}
              config={config}
              columns={columns}
src/menu/datasource/verifycard/settingform/index.jsx
@@ -14,7 +14,6 @@
class SettingForm extends Component {
  static propTpyes = {
    dict: PropTypes.object,       // 字典项
    menu: PropTypes.any,          // 菜单配置信息
    config: PropTypes.object,     // 组件配置
    setting: PropTypes.object,    // 数据源配置
    modules: PropTypes.array,     // 可绑定的上级组件
@@ -32,9 +31,9 @@
  }
  UNSAFE_componentWillMount () {
    const { menu, config } = this.props
    const { config } = this.props
    let modules = MenuUtils.getSupModules(menu.components, config.uuid) || []
    let modules = MenuUtils.getSupModules(window.GLOB.customMenu.components, config.uuid) || []
    modules.unshift({
      value: 'empty',
@@ -349,7 +348,7 @@
                </Radio.Group>)}
              </Form.Item>
            </Col> : null}
            {!['navbar', 'balcony', 'menubar'].includes(config.type) ? <Col span={8}>
            {!['navbar', 'balcony', 'menubar'].includes(config.type) && (!config.wrap || config.wrap.supType !== 'multi') ? <Col span={8}>
              <Form.Item label={
                <Tooltip placement="topLeft" title={'该组件如果受其他组件控制,请选项相应的组件,没有时选“无”。'}>
                  <QuestionCircleOutlined className="mk-form-tip" />
src/mob/components/formdragelement/index.scss
@@ -93,6 +93,9 @@
      .check-card-edit-box {
        margin-top: 0!important;
      }
      .am-input-label {
        width: auto;
      }
    }
  }
  .am-list-item.hint {
src/mob/searchconfig/groupdragelement/index.scss
@@ -6,7 +6,7 @@
  margin-bottom: 15px;
  .page-card {
    float: left;
    width: 13.333%;
    width: 16.666%;
    text-align: center;
    padding: 5px;
    .icon {
src/mob/searchconfig/index.jsx
@@ -495,7 +495,7 @@
          </div>
          <div className="setting">
            <div className="mob-shell" style={{width: window.GLOB.shellWidth, height: window.GLOB.shellHeight}}>
              <div className="mob-shell-inner">
              <div className="mob-shell-inner" style={{backgroundColor: group.setting.backgroundColor || '#ffffff'}}>
                <Icon className="setting-group" onClick={this.changeSetting} type="setting" />
                {group.setting.type === 'title' ? <div className="am-navbar">
                  <Icon type="left" />
src/mob/searchconfig/settingform/index.jsx
@@ -2,8 +2,12 @@
import PropTypes from 'prop-types'
import { Form, Row, Col, Input, Radio, Select, Tooltip } from 'antd'
import { QuestionCircleOutlined } from '@ant-design/icons'
import asyncComponent from '@/utils/asyncComponent'
import { formRule } from '@/utils/option.js'
import './index.scss'
const ColorSketch = asyncComponent(() => import('@/mob/colorsketch'))
class SettingForm extends Component {
  static propTpyes = {
@@ -208,6 +212,15 @@
              )}
            </Form.Item>
          </Col> : null}
          <Col span={12}>
            <Form.Item className="sys-bgcolor" label="背景色">
              {getFieldDecorator('backgroundColor', {
                initialValue: config.setting.backgroundColor || '#ffffff'
              })(
                <ColorSketch value={config.setting.backgroundColor || '#ffffff'}/>
              )}
            </Form.Item>
          </Col>
          {type === 'search' ? <Col span={12}>
            <Form.Item label="黑名单">
              {getFieldDecorator('blacklist', {
src/mob/searchconfig/settingform/index.scss
@@ -12,4 +12,9 @@
    float: none;
    vertical-align: top;
  }
  .sys-bgcolor {
    .ant-form-item-children {
      padding-top: 7px;
    }
  }
}
src/tabviews/custom/components/card/data-card/index.jsx
@@ -41,7 +41,9 @@
    total: null,
    precards: [],
    nextcards: [],
    selected: 'false'
    selected: 'false',
    supNodes: [],
    supComs: null
  }
  UNSAFE_componentWillMount () {
@@ -144,7 +146,13 @@
      return item
    })
    let supComs = null
    if (_config.wrap.supType === 'multi') {
      supComs = _config.supNodes.map(item => item.componentId)
    }
    this.setState({
      supComs,
      selected,
      precards,
      nextcards,
@@ -227,7 +235,7 @@
   * @param {*} btn        // 执行的按钮
   */
  refreshByButtonResult = (menuId, position, btn, id, lines) => {
    const { config, BID } = this.state
    const { config, BID, supComs, supNodes } = this.state
    if (config.uuid !== menuId) return
@@ -243,6 +251,28 @@
      this.loadData()
    }
    if (supComs) {
      if (btn.syncComponentId && btn.syncComponentId !== config.uuid && !supComs.includes(btn.syncComponentId)) {
        MKEmitter.emit('reloadData', btn.syncComponentId)                        // 同级标签刷新
      }
      if (position === 'mainline' || position === 'popclose') {                 // 主表行刷新
        let supNode = supNodes[supNodes.length - 1]
        supComs.forEach((item, i) => {
          setTimeout(() => {
            if (supNode && supNode.key === item) {
              MKEmitter.emit('reloadData', item, supNode.value)
            } else {
              MKEmitter.emit('reloadData', item)
            }
          }, i * 10)
        })
        if (position === 'popclose') {                                      // 标签关闭刷新
          btn.$tabId && MKEmitter.emit('refreshPopButton', btn.$tabId)
        }
      }
    } else {
    if (btn.syncComponentId && btn.syncComponentId !== config.uuid && btn.syncComponentId !== config.setting.supModule) {
      MKEmitter.emit('reloadData', btn.syncComponentId)                        // 同级标签刷新
    }
@@ -252,6 +282,7 @@
    } else if (position === 'popclose') {                                      // 标签关闭刷新
      config.setting.supModule && MKEmitter.emit('reloadData', config.setting.supModule, (BID || 'empty'))
      btn.$tabId && MKEmitter.emit('refreshPopButton', btn.$tabId)
      }
    }
  }
@@ -327,8 +358,29 @@
  }
  resetParentParam = (MenuID, id, data) => {
    const { config } = this.state
    const { config, supComs } = this.state
    if (supComs) {
      if (!supComs.includes(MenuID)) return
      let supNodes = this.state.supNodes.filter(item => item.key !== MenuID)
      let bid = ''
      let _data = null
      if (id) {
        supNodes.push({key: MenuID, value: id, data})
      }
      if (supNodes.length > 0) {
        bid = supNodes[supNodes.length - 1].value
        _data = supNodes[supNodes.length - 1].data
      }
      if (bid !== this.state.BID || bid !== '') {
        this.setState({ BID: bid, BData: _data, pageIndex: 1 }, () => {
          this.loadData()
        })
      }
    } else {
    if (!config.setting.supModule || config.setting.supModule !== MenuID) return
    if (id !== this.state.BID || id !== '') {
      this.setState({ BID: id, BData: data, pageIndex: 1 }, () => {
@@ -336,6 +388,7 @@
      })
    }
  }
  }
  /**
   * @description 导出Excel时,获取页面搜索排序等参数
src/tabviews/custom/index.jsx
@@ -737,7 +737,15 @@
        }
      } 
      if (item.setting && item.setting.supModule) {
      if (item.wrap && item.wrap.supType === 'multi') { // 数据卡多上级组件
        if (item.supNodes && item.supNodes[0]) {
          item.setting.supModule = item.supNodes[0].componentId
        } else {
          item.wrap.supType = 'single'
          item.supNodes = null
          item.setting.supModule = ''
        }
      } else if (item.setting && item.setting.supModule) {
        let pid = item.setting.supModule.pop()
        if (pid && pid !== 'empty') {
          item.setting.supModule = pid
@@ -745,6 +753,7 @@
          item.setting.supModule = ''
        }
      }
      if (item.wrap && item.wrap.doubleClick) {
        let index = item.action.findIndex((btn) => btn.uuid === item.wrap.doubleClick)
        if (index === -1) {
src/views/appmanage/index.jsx
@@ -472,6 +472,7 @@
              cell.apptype = _param.apptype || ''
              cell.delay = _param.delay || 0
              cell.statusBarColor = _param.statusBarColor || 'black'
              cell.sysBgColor = _param.sysBgColor || '#ffffff'
              cell.adapter = _param.adapter || ''
              if (cell.adapter && (cell.adapter === 'true' || cell.adapter === 'false')) {
                cell.adapter = ''
@@ -612,7 +613,7 @@
    sublist = sublist.filter(item => item.ID !== record.ID)
    // param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','${item.login_types || 'true'}','${item.link_type || 'true'}','${item.role_type || 'true'}','${item.lang || 'zh-CN'}'`)
    param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', adapter: item.adapter || ''})))}'`)
    param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', sysBgColor: item.sysBgColor || '#ffffff', adapter: item.adapter || ''})))}'`)
    param.LText = param.LText.join(' union all ')
    param.LText = Utils.formatOptions(param.LText)
    
@@ -836,7 +837,7 @@
      if (visible === 'edit') {
        // param.LText = selectApp.sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','${item.login_types || 'true'}','${item.link_type || 'true'}','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}'`)
        param.LText = selectApp.sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', adapter: item.adapter || ''})))}'`)
        param.LText = selectApp.sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', sysBgColor: item.sysBgColor || '#ffffff', adapter: item.adapter || ''})))}'`)
        param.LText = param.LText.join(' union all ')
        param.LText = Utils.formatOptions(param.LText)
      }
@@ -922,7 +923,7 @@
      }
      // param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','${item.login_types || 'true'}','${item.link_type || 'true'}','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}'`)
      param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', adapter: item.adapter || ''})))}'`)
      param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', sysBgColor: item.sysBgColor || '#ffffff', adapter: item.adapter || ''})))}'`)
      param.LText = param.LText.join(' union all ')
      param.LText = Utils.formatOptions(param.LText)
src/views/appmanage/submutilform/index.jsx
@@ -6,6 +6,7 @@
import asyncComponent from '@/utils/asyncComponent'
import './index.scss'
const ColorSketch = asyncComponent(() => import('@/mob/colorsketch'))
const SourceComponent = asyncComponent(() => import('@/menu/components/share/sourcecomponent'))
class MainSearch extends Component {
@@ -293,6 +294,20 @@
              )}
            </Form.Item>
          </Col> : null}
          <Col span={12}>
            <Form.Item className="sys-bgcolor" label={
              <Tooltip placement="topLeft" title="子应用通用的背景色,子应用页面创建时会默认添加此背景色。">
                <QuestionCircleOutlined className="mk-form-tip" />
                背景色
              </Tooltip>
            }>
              {getFieldDecorator('sysBgColor', {
                initialValue: card ? card.sysBgColor || '#ffffff' : '#ffffff'
              })(
                <ColorSketch value={card ? card.sysBgColor || '#ffffff' : '#ffffff'}/>
              )}
            </Form.Item>
          </Col>
        </Row>
      </Form>
    )
src/views/appmanage/submutilform/index.scss
@@ -15,4 +15,9 @@
  .ant-form-item-with-help {
    margin-bottom: 24px;
  }
  .sys-bgcolor {
    .ant-form-item-children {
      padding-top: 7px;
    }
  }
}
src/views/menudesign/index.jsx
@@ -864,7 +864,7 @@
            error = `组件《${item.name}》未设置数据源!`
          } else if (!item.setting.primaryKey) {
            error = `组件《${item.name}》未设置主键!`
          } else if (!item.setting.supModule && item.type !== 'balcony') {
          } else if (!item.setting.supModule && item.type !== 'balcony' && (!item.wrap || item.wrap.supType !== 'multi')) {
            error = `组件《${item.name}》未设置上级组件!`
          }
        }
src/views/mobdesign/index.jsx
@@ -87,6 +87,7 @@
        sessionStorage.setItem('login_types', param.login_types || 'false')
        sessionStorage.setItem('typename', param.typename || 'mob')
        sessionStorage.setItem('adapter', param.adapter || '')
        sessionStorage.setItem('sysBgColor', param.sysBgColor || '#ffffff')
        this.setState({
          localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS,
@@ -466,8 +467,9 @@
            tables: [],
            components: [],
            viewType: 'menu',
            statusBarbgColor: sessionStorage.getItem('sysBgColor') || '#ffffff',
            style: {
              backgroundColor: '#ffffff', backgroundImage: ''
              backgroundColor: sessionStorage.getItem('sysBgColor') || '#ffffff', backgroundImage: ''
            }
          }
        }
@@ -1034,7 +1036,7 @@
                Typename: sessionStorage.getItem('typename'),
                MenuName: item.name || '',
                PageParam: JSON.stringify({Template: item.type}),
                open_edition: _item.open_edition || '',
                open_edition: _item ? (_item.open_edition || '') : '',
                menus_rolelist: window.btoa(window.encodeURIComponent(JSON.stringify(roles))),
                LText: '',
                LTexttb: ''
src/views/pcdesign/index.jsx
@@ -88,6 +88,7 @@
        sessionStorage.setItem('kei_no', param.kei_no || '')
        sessionStorage.setItem('role_type', param.role_type || 'true')
        sessionStorage.setItem('login_types', param.login_types || 'false')
        sessionStorage.setItem('sysBgColor', param.sysBgColor || '#ffffff')
        this.setState({
          localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS,
@@ -529,7 +530,7 @@
            components: [],
            viewType: 'menu',
            style: {
              backgroundColor: '#ffffff', backgroundImage: '', paddingLeft: '20px', paddingRight: '20px'
              backgroundColor: sessionStorage.getItem('sysBgColor') || '#ffffff', backgroundImage: '', paddingLeft: '20px', paddingRight: '20px'
            }
          }
        }
@@ -647,7 +648,7 @@
          components: [],
          viewType: 'menu',
          style: {
            backgroundColor: '#ffffff', backgroundImage: '', paddingLeft: '20px', paddingRight: '20px'
            backgroundColor: sessionStorage.getItem('sysBgColor') || '#ffffff', backgroundImage: '', paddingLeft: '20px', paddingRight: '20px'
          }
        }
      } else {
@@ -1407,7 +1408,7 @@
            error = `组件《${item.name}》未设置数据源!`
          } else if (!item.setting.primaryKey) {
            error = `组件《${item.name}》未设置主键!`
          } else if (!item.setting.supModule && item.type !== 'balcony') {
          } else if (!item.setting.supModule && item.type !== 'balcony' && (!item.wrap || item.wrap.supType !== 'multi')) {
            error = `组件《${item.name}》未设置上级组件!`
          }
        }