From 233709a44a2f5cfff9b8fb955ebcdc6889c0d40b Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期二, 19 十一月 2019 09:12:28 +0800
Subject: [PATCH] 2019-11-19

---
 src/locales/en-US/header.js                                  |   57 --
 src/components/sidemenu/comtableconfig/dragelement/index.jsx |   66 ++
 src/components/sidemenu/comtableconfig/editcard/index.scss   |   33 +
 src/components/sidemenu/comtableconfig/index.scss            |   72 ++
 src/components/sidemenu/editthdmenu/index.jsx                |    3 
 src/locales/zh-CN/header.js                                  |   57 --
 src/api/index.js                                             |   13 
 src/components/sidemenu/comtableconfig/editable/index.jsx    |    6 
 src/components/sidemenu/comtableconfig/editcard/index.jsx    |   87 +++
 src/components/sidemenu/comtableconfig/editable/index.scss   |    4 
 src/components/sidemenu/comtableconfig/index.jsx             |  761 ++++++++++++++++++++++++--------
 src/components/sidemenu/comtableconfig/dragelement/card.jsx  |    8 
 src/locales/zh-CN/comtable.js                                |   83 +++
 src/components/sidemenu/comtableconfig/actionform/index.jsx  |   18 
 src/locales/en-US/comtable.js                                |   83 +++
 src/components/sidemenu/comtableconfig/columnform/index.jsx  |    1 
 16 files changed, 1,008 insertions(+), 344 deletions(-)

diff --git a/src/api/index.js b/src/api/index.js
index 1f4de91..7e2ef7d 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -21,8 +21,19 @@
   return Promise.reject(error)
 })
 
+const setCurrentUrl = () => {
+  if (!!(window.history && window.history.pushState)) {
+    window.history.replaceState(null, null, window.location.href.split('#')[0] + '#/login')
+    window.location.reload()
+  }
+}
+
 axios.interceptors.response.use((response) => {
-  return Promise.resolve(response.data)
+  if (response.data.ErrCode === 'LoginError') {
+    setCurrentUrl()
+  } else {
+    return Promise.resolve(response.data)
+  }
 }, (error) => {
   return Promise.reject(error)
 })
diff --git a/src/components/sidemenu/comtableconfig/actionform/index.jsx b/src/components/sidemenu/comtableconfig/actionform/index.jsx
index 4beb9ba..45308f8 100644
--- a/src/components/sidemenu/comtableconfig/actionform/index.jsx
+++ b/src/components/sidemenu/comtableconfig/actionform/index.jsx
@@ -4,6 +4,9 @@
 import './index.scss'
 
 const btnIcons = [{
+  MenuID: '',
+  text: 'unset'
+}, {
   MenuID: 'plus',
   text: 'plus'
 }, {
@@ -72,9 +75,9 @@
         _options = ['label', 'Ot', 'OpenType', 'pageTemplate', 'icon', 'class']
       } else {
         if (this.state.interType === 'outer') {
-          _options = ['label', 'OpenType', 'intertype', 'interface', 'func', 'callbackFunc', 'Ot', 'icon', 'class']
+          _options = ['label', 'OpenType', 'intertype', 'innerFunc', 'interface', 'outerFunc', 'callbackFunc', 'Ot', 'icon', 'class']
         } else {
-          _options = ['label', 'OpenType', 'intertype', 'func', 'Ot', 'icon', 'class']
+          _options = ['label', 'OpenType', 'intertype', 'innerFunc', 'Ot', 'icon', 'class']
         }
       }
       this.setState({
@@ -92,9 +95,9 @@
     if (key === 'intertype') {
       let _options = null
       if (value === 'outer') {
-        _options = ['label', 'OpenType', 'intertype', 'interface', 'func', 'callbackFunc', 'Ot', 'icon', 'class']
+        _options = ['label', 'OpenType', 'intertype', 'innerFunc', 'interface', 'outerFunc', 'callbackFunc', 'Ot', 'icon', 'class']
       } else {
-        _options = ['label', 'OpenType', 'intertype', 'func', 'Ot', 'icon', 'class']
+        _options = ['label', 'OpenType', 'intertype', 'innerFunc', 'Ot', 'icon', 'class']
       }
       this.setState({
         interType: value,
@@ -109,7 +112,6 @@
   getFields() {
     const { getFieldDecorator } = this.props.form
     const fields = []
-    console.log(this.state.formlist)
     this.state.formlist.forEach((item, index) => {
       if (item.hidden) return
 
@@ -150,7 +152,7 @@
                 >
                   {item.options.map(option =>
                     <Select.Option id={option.MenuID} title={option.text} key={option.MenuID} value={option.MenuID}>
-                      {item.key === 'icon' && <Icon type={option.MenuID} />} {option.text}
+                      {item.key === 'icon' && option.MenuID && <Icon type={option.MenuID} />} {option.text}
                     </Select.Option>
                   )}
                 </Select>
@@ -216,9 +218,9 @@
       _options = ['label', 'Ot', 'OpenType', 'pageTemplate', 'icon', 'class']
     } else {
       if (_intertype === 'outer') {
-        _options = ['label', 'OpenType', 'intertype', 'interface', 'func', 'callbackFunc', 'Ot', 'icon', 'class']
+        _options = ['label', 'OpenType', 'intertype', 'innerFunc', 'interface', 'outerFunc', 'callbackFunc', 'Ot', 'icon', 'class']
       } else {
-        _options = ['label', 'OpenType', 'intertype', 'func', 'Ot', 'icon', 'class']
+        _options = ['label', 'OpenType', 'intertype', 'innerFunc', 'Ot', 'icon', 'class']
       }
     }
     this.setState({
diff --git a/src/components/sidemenu/comtableconfig/columnform/index.jsx b/src/components/sidemenu/comtableconfig/columnform/index.jsx
index 438c092..e356c62 100644
--- a/src/components/sidemenu/comtableconfig/columnform/index.jsx
+++ b/src/components/sidemenu/comtableconfig/columnform/index.jsx
@@ -104,7 +104,6 @@
             </Form.Item>
           </Col>
         )
-        
       }
     })
     return fields
diff --git a/src/components/sidemenu/comtableconfig/dragelement/card.jsx b/src/components/sidemenu/comtableconfig/dragelement/card.jsx
index cb1c735..5cedf7f 100644
--- a/src/components/sidemenu/comtableconfig/dragelement/card.jsx
+++ b/src/components/sidemenu/comtableconfig/dragelement/card.jsx
@@ -5,7 +5,7 @@
 import ItemTypes from './itemtypes'
 import './index.scss'
 
-const Card = ({ id, type, card, moveCard, findCard, editCard, hasDrop }) => {
+const Card = ({ id, type, card, moveCard, findCard, editCard, copyCard, hasDrop }) => {
   const originalIndex = findCard(id).index
   const [{ isDragging }, drag] = useDrag({
     item: { type: ItemTypes[type], id, originalIndex },
@@ -34,6 +34,11 @@
   const edit = () => {
     editCard(id)
   }
+
+  const copy = () => {
+    copyCard(id)
+  }
+
   return (
     <div className="page-card" style={type === 'columns' ? { flex: card.Width, opacity: opacity} : { opacity: opacity}}>
       <div ref={node => drag(drop(node))}>
@@ -77,6 +82,7 @@
         }
       </div>
       <Icon className="edit" type="edit" onClick={edit} />
+      {type === 'action' && <Icon className="edit copy" type="copy" onClick={copy} />}
     </div>
   )
 }
diff --git a/src/components/sidemenu/comtableconfig/dragelement/index.jsx b/src/components/sidemenu/comtableconfig/dragelement/index.jsx
index c89134c..9a8425d 100644
--- a/src/components/sidemenu/comtableconfig/dragelement/index.jsx
+++ b/src/components/sidemenu/comtableconfig/dragelement/index.jsx
@@ -30,6 +30,36 @@
     handleMenu(card)
   }
 
+  const copyCard = id => {
+    const { card } = findCard(id)
+    let copycard = JSON.parse(JSON.stringify(card))
+    copycard.uuid = Utils.getuuid()
+    copycard.origin = false
+    let names = cards.map(car => { return car.label })
+    let index = 1
+    let origin = copycard.label.split('(copy')[0] || 'button'
+    let label = origin + '(copy)'
+    while (names.includes(label)) {
+      label = origin + `(copy${index})`
+      index++
+    }
+
+    copycard.label = label
+    
+    let indexes = cards.map(car => { return car.id })
+    let newid = 0
+    while (indexes.includes(newid)) {
+      newid++
+    }
+    copycard.id = newid
+
+    const { index: overIndex } = findCard(`${card.id}`)
+
+    const _cards = update(cards, { $splice: [[overIndex + 1, 0, copycard]] })
+    setCards(_cards)
+    handleList({action: _cards})
+  }
+
   const hasDrop = (item) => {
     target = item
   }
@@ -40,31 +70,42 @@
       if (item.hasOwnProperty('originalIndex')) {
         return
       }
+
       let newcard = {}
       if (item.type === 'search') {
         newcard.uuid = Utils.getuuid()
         newcard.label = 'fieldName'
-        newcard.field = 'field'
+        newcard.field = ''
         newcard.initval = ''
         newcard.type = item.subType
-        if (item.subType === 'select') {
-          newcard.resourceType = 0
-          newcard.options = []
-          newcard.dataSource = ''
-        }
+        newcard.resourceType = '0'
+        newcard.options = []
+        newcard.dataSource = ''
+        newcard.setAll = 'false'
+        newcard.linkField = ''
+        newcard.valueField = ''
+        newcard.valueText = ''
+        newcard.orderBy = ''
+        newcard.orderType = 'asc'
+        newcard.display = 'dropdown'
       } else if (item.type === 'action') {
         newcard.uuid = Utils.getuuid()
         newcard.label = 'button'
-        newcard.func = ''
-        newcard.Ot = 'notRequired'
+        newcard.innerFunc = ''
+        newcard.outerFunc = ''
+        newcard.Ot = 'requiredSgl'
         newcard.OpenType = item.subType
-        newcard.icon = 'plus'
+        newcard.icon = ''
         newcard.class = 'green'
+        newcard.intertype = 'inner'
+        newcard.interface = ''
+        newcard.callbackFunc = ''
+        newcard.pageTemplate = ''
       } else if (item.type === 'columns') {
         newcard.uuid = Utils.getuuid()
         newcard.Align = 'left'
         newcard.label = 'fieldName'
-        newcard.field = 'field'
+        newcard.field = ''
         newcard.Hide = 'false'
         newcard.IsSort = item.subType
         newcard.Width = 120
@@ -98,8 +139,8 @@
     }
   })
   let columns = []
-  if (type === 'columns' && cards.length > 12) {
-    let number = Math.ceil(cards.length / Math.ceil(cards.length / 12))
+  if (type === 'columns' && cards.length > 10) {
+    let number = Math.ceil(cards.length / Math.ceil(cards.length / 10))
     for (let i = 0, len = cards.length; i < len; i += number) {
       columns.push(cards.slice(i, i + number))
     }
@@ -117,6 +158,7 @@
           card={card}
           moveCard={moveCard}
           editCard={editCard}
+          copyCard={copyCard}
           findCard={findCard}
           hasDrop={hasDrop}
         />
diff --git a/src/components/sidemenu/comtableconfig/editable/index.jsx b/src/components/sidemenu/comtableconfig/editable/index.jsx
index 65a30fd..4f10603 100644
--- a/src/components/sidemenu/comtableconfig/editable/index.jsx
+++ b/src/components/sidemenu/comtableconfig/editable/index.jsx
@@ -9,13 +9,13 @@
   <EditableContext.Provider value={form}>
     <tr {...props} />
   </EditableContext.Provider>
-);
+)
 
 const EditableFormRow = Form.create()(EditableRow)
 
 class EditableCell extends Component {
   state = {
-    editing: false,
+    editing: false
   }
 
   toggleEdit = () => {
@@ -41,7 +41,6 @@
 
   renderCell = form => {
     this.form = form
-    // const { children, dataIndex, record, title } = this.props
     const { children, dataIndex, record } = this.props
     const { editing } = this.state
     return editing ? (
@@ -50,7 +49,6 @@
           rules: [
             {
               required: true,
-              // message: `${title} is required.`,
               message: 'NOT NULL.',
             },
           ],
diff --git a/src/components/sidemenu/comtableconfig/editable/index.scss b/src/components/sidemenu/comtableconfig/editable/index.scss
index d486ae6..f8f0942 100644
--- a/src/components/sidemenu/comtableconfig/editable/index.scss
+++ b/src/components/sidemenu/comtableconfig/editable/index.scss
@@ -33,8 +33,4 @@
       margin: 0;
     }
   }
-  
-  // .editable-cell-value-wrap:hover {
-  //   padding: 0px;
-  // }
 }
diff --git a/src/components/sidemenu/comtableconfig/editcard/index.jsx b/src/components/sidemenu/comtableconfig/editcard/index.jsx
new file mode 100644
index 0000000..304fe7a
--- /dev/null
+++ b/src/components/sidemenu/comtableconfig/editcard/index.jsx
@@ -0,0 +1,87 @@
+import React, {Component} from 'react'
+import { Row, Col, Icon, Radio } from 'antd'
+import './index.scss'
+
+class EditCardCell extends Component {
+  constructor(props) {
+    super(props)
+
+    this.state = {
+      selected: false,
+      card: props.card
+    }
+  }
+
+  changeSelect = () => {
+    this.setState({
+      selected: !this.state.selected
+    })
+  }
+
+  changeType = (e) => {
+    console.log(e.target.value)
+    const { card } = this.state
+    this.setState({
+      card: {...card, type: e.target.value}
+    })
+  }
+
+  render() {
+    const { card } = this.state
+    return (
+      <div className={'ant-card ant-card-bordered ' + (this.state.selected ? 'selected' : '')} >
+        <div className="base" onClick={this.changeSelect}>
+          <Icon type="check" />
+          <p>瀛楁鍚�: {card.label}</p>
+          <p>鎻愮ず鏂囧瓧: {card.field}</p>
+        </div>
+        <label>绫诲瀷:</label>
+        <Radio.Group onChange={this.changeType} value={this.state.card.type} disabled={!this.state.selected}>
+          <Radio value="text">text</Radio>
+          <Radio value="select">select</Radio>
+          <Radio value="date">date</Radio>
+        </Radio.Group>
+      </div>
+    )
+  }
+}
+
+class EditCard extends Component {
+  constructor(props) {
+    super(props)
+
+    this.state = {
+      dataSource: props.data,
+      title: props.title
+    }
+  }
+
+  getSelectedCard = () => {
+    let box = []
+    this.state.dataSource.forEach((item, index) => {
+      if (this.refs['cellCard' + index].state.selected) {
+        box.push(this.refs['cellCard' + index].state.card)
+      }
+    })
+    return box
+  }
+
+  render() {
+    const { dataSource, title } = this.state
+
+    return (
+      <div className="common-modal-edit-card">
+        {title && <h4>{title}</h4>}
+        <Row>
+          {dataSource.map((item, index) => (
+            <Col key={index} span={8}>
+              <EditCardCell ref={'cellCard' + index} card={item} />
+            </Col>
+          ))}
+        </Row>
+      </div>
+    )
+  }
+}
+
+export default EditCard
\ No newline at end of file
diff --git a/src/components/sidemenu/comtableconfig/editcard/index.scss b/src/components/sidemenu/comtableconfig/editcard/index.scss
new file mode 100644
index 0000000..fe6cdd3
--- /dev/null
+++ b/src/components/sidemenu/comtableconfig/editcard/index.scss
@@ -0,0 +1,33 @@
+.common-modal-edit-card {
+  margin-left: -10px;
+  margin-right: -10px;
+  .ant-col {
+    padding: 10px;
+    .ant-card {
+      padding: 10px;
+      p {
+        margin-bottom: 5px;
+      }
+      label {
+        margin-right: 10px;
+      }
+      .anticon {
+        position: absolute;
+        top: 10px;
+        right: 10px;
+        opacity: 0.4;
+      }
+      .base {
+        cursor: pointer;
+      }
+    }
+    .ant-card.selected {
+      border-color: #1890ff;
+      box-shadow: 0px 0px 4px #1890ff;
+      .anticon {
+        opacity: 1;
+        color: #1890ff;
+      }
+    }
+  }
+}
diff --git a/src/components/sidemenu/comtableconfig/index.jsx b/src/components/sidemenu/comtableconfig/index.jsx
index 830cc59..1beb384 100644
--- a/src/components/sidemenu/comtableconfig/index.jsx
+++ b/src/components/sidemenu/comtableconfig/index.jsx
@@ -3,25 +3,27 @@
 // import { is, fromJS } from 'immutable'
 import { DndProvider } from 'react-dnd'
 import HTML5Backend from 'react-dnd-html5-backend'
-import { Button, Card, Modal, Collapse, Input, notification } from 'antd'
+import { Button, Card, Modal, Collapse, notification, Spin, Row, Col, Select, List, Icon } from 'antd'
 import DragElement from './dragelement'
 import SourceElement from './dragelement/source'
 import Api from '@/api'
 import SearchForm from './searchform'
 import ActionForm from './actionform'
 import ColumnForm from './columnform'
+import EditCard from './editcard'
 import MenuForm from './menuform'
-import zhCN from '@/locales/zh-CN/header.js'
-import enUS from '@/locales/en-US/header.js'
+import zhCN from '@/locales/zh-CN/comtable.js'
+import enUS from '@/locales/en-US/comtable.js'
 import Utils from '@/utils/utils.js'
 import './index.scss'
 
 const { Panel } = Collapse
-const { Search } = Input
+const { Option } = Select
 const HeaderDict = (!localStorage.getItem('lang') || localStorage.getItem('lang') === 'zh-CN') ? zhCN : enUS
 
 class ComTableConfig extends Component {
   static propTpyes = {
+    type: PropTypes.string,
     menu: PropTypes.any,
     handleConfig: PropTypes.func,
     supMenuList: PropTypes.array,
@@ -29,162 +31,200 @@
   }
 
   state = {
-    dict: HeaderDict,
-    config: null,
-    visible: false,
-    tableVisible: false,
-    addType: '',
-    menuformlist: null,
-    formlist: null,
-    formtemp: '',
-    card: null,
-    searchloading: false,
-    actionloading: false,
-    columnsloading: false,
+    dict: HeaderDict, // 瀛楀吀
+    config: null, // 椤甸潰閰嶇疆
+    visible: false, // 鎼滅储鏉′欢銆佹寜閽�佹樉绀哄垪锛屾ā鎬佹鏄剧ず鎺у埗
+    tableVisible: false, // 鏁版嵁琛ㄥ瓧娈垫ā鎬佹
+    addType: '', // 娣诲姞绫诲瀷-鎼滅储鏉′欢鎴栨樉绀哄垪
+    tableColumns: [], // 琛ㄦ牸鏄剧ず鍒�
+    option: {}, // 鎼滅储鏉′欢鍙婃樉绀哄垪锛屽彲閫夋潯浠跺寘鎷琻ormal銆乷thers
+    loading: false, // 鍔犺浇涓紙鑾峰彇琛ㄦ暟鎹級
+    menuformlist: null, // 鍩烘湰淇℃伅琛ㄥ崟瀛楁
+    formlist: null, // 鎼滅储鏉′欢銆佹寜閽�佹樉绀哄垪琛ㄥ崟瀛楁
+    formtemp: '', // 琛ㄥ崟绫诲瀷锛屾樉绀哄垪銆佹寜閽�佹悳绱㈡潯浠�
+    card: null, // 缂栬緫鍏冪礌
+    searchloading: false, // 鎼滅储鏉′欢鍔犺浇涓�
+    actionloading: false, // 鎸夐挳鍔犺浇涓�
+    columnsloading: false, // 鏄剧ず鍒楀姞杞戒腑
+    tables: [{
+      name: 'SUsers',
+      label: '鐢ㄦ埛琛�'
+    }, {
+      name: 'SMenus',
+      label: '鑿滃崟琛�'
+    }, {
+      name: 'SColumns',
+      label: '鏄剧ず鍒楄〃'
+    }, {
+      name: 'SActions',
+      label: '鎸夐挳琛�'
+    }],
+    selectedTables: [], // 宸查�夎〃鍚�
     baseconfig: {
       type: 'system',
-      search: [{
-        id: 0,
-        uuid: Utils.getuuid(),
-        label: 'text',
-        field: 'field',
-        initval: '',
-        type: 'text',
-        resourceType: '0',
-        setAll: 'false',
-        options: [],
-        dataSource: '',
-        linkField: '',
-        valueField: '',
-        valueText: '',
-        orderBy: '',
-        orderType: 'asc',
-        display: 'dropdown'
-      }, {
-        id: 1,
-        uuid: Utils.getuuid(),
-        label: 'select',
-        field: 'field',
-        initval: '',
-        type: 'select',
-        resourceType: '0',
-        setAll: 'false',
-        options: [],
-        dataSource: '',
-        linkField: '',
-        valueField: '',
-        valueText: '',
-        orderBy: '',
-        orderType: 'asc',
-        display: 'dropdown'
-      }, {
-        id: 2,
-        uuid: Utils.getuuid(),
-        label: 'date',
-        field: 'field',
-        initval: '',
-        type: 'dateday',
-        resourceType: '0',
-        setAll: 'false',
-        options: [],
-        dataSource: '',
-        linkField: '',
-        valueField: '',
-        valueText: '',
-        orderBy: '',
-        orderType: 'asc',
-        display: 'dropdown'
-      }],
-      action: [{
-        id: 0,
-        uuid: Utils.getuuid(),
-        label: 'add',
-        intertype: 'inner',
-        interface: '',
-        func: '',
-        callbackFunc: '',
-        Ot: 'notRequired',
-        OpenType: 'pop',
-        pageTemplate: '',
-        icon: 'plus',
-        class: 'green'
-      }, {
-        id: 1,
-        uuid: Utils.getuuid(),
-        label: 'update',
-        intertype: 'inner',
-        interface: '',
-        func: '',
-        callbackFunc: '',
-        Ot: 'requiredSgl',
-        OpenType: 'pop',
-        pageTemplate: '',
-        icon: 'form',
-        class: 'purple'
-      }, {
-        id: 2,
-        uuid: Utils.getuuid(),
-        label: 'delete',
-        intertype: 'inner',
-        interface: '',
-        func: '',
-        callbackFunc: '',
-        Ot: 'required',
-        OpenType: 'prompt',
-        pageTemplate: '',
-        icon: 'delete',
-        class: 'red'
-      }, {
-        id: 3,
-        uuid: Utils.getuuid(),
-        label: 'freeze',
-        intertype: 'inner',
-        interface: '',
-        func: '',
-        callbackFunc: '',
-        Ot: 'requiredOnce',
-        OpenType: 'exec',
-        pageTemplate: '',
-        icon: '',
-        class: 'default'
-      }],
-      columns: [{
-        id: 0,
-        uuid: Utils.getuuid(),
-        Align: 'left',
-        label: 'fieldName1',
-        field: 'field1',
-        Hide: 'false',
-        IsSort: 'true',
-        Width: 120
-      }, {
-        id: 1,
-        uuid: Utils.getuuid(),
-        Align: 'left',
-        label: 'fieldName2',
-        field: 'field2',
-        Hide: 'false',
-        IsSort: 'true',
-        Width: 120
-      }, {
-        id: 2,
-        uuid: Utils.getuuid(),
-        Align: 'left',
-        label: 'fieldName3',
-        field: 'field3',
-        Hide: 'false',
-        IsSort: 'true',
-        Width: 120
-      }, {
-        id: 3,
-        uuid: Utils.getuuid(),
-        Align: 'left',
-        label: 'fieldName4',
-        field: 'field4',
-        Hide: 'false',
-        IsSort: 'true',
-        Width: 120
-      }]
+      search: [
+        {
+          origin: true,
+          id: 0,
+          uuid: Utils.getuuid(),
+          label: 'text',
+          field: '',
+          initval: '',
+          type: 'text',
+          resourceType: '0',
+          setAll: 'false',
+          options: [],
+          dataSource: '',
+          linkField: '',
+          valueField: '',
+          valueText: '',
+          orderBy: '',
+          orderType: 'asc',
+          display: 'dropdown'
+        }, {
+          origin: true,
+          id: 1,
+          uuid: Utils.getuuid(),
+          label: 'select',
+          field: '',
+          initval: '',
+          type: 'select',
+          resourceType: '0',
+          setAll: 'false',
+          options: [],
+          dataSource: '',
+          linkField: '',
+          valueField: '',
+          valueText: '',
+          orderBy: '',
+          orderType: 'asc',
+          display: 'dropdown'
+        }, {
+          origin: true,
+          id: 2,
+          uuid: Utils.getuuid(),
+          label: 'date',
+          field: '',
+          initval: '',
+          type: 'dateday',
+          resourceType: '0',
+          setAll: 'false',
+          options: [],
+          dataSource: '',
+          linkField: '',
+          valueField: '',
+          valueText: '',
+          orderBy: '',
+          orderType: 'asc',
+          display: 'dropdown'
+        }
+      ],
+      action: [
+        {
+          origin: true,
+          id: 0,
+          uuid: Utils.getuuid(),
+          label: 'add',
+          intertype: 'inner',
+          innerFunc: '',
+          interface: '',
+          outerFunc: '',
+          callbackFunc: '',
+          Ot: 'notRequired',
+          OpenType: 'pop',
+          pageTemplate: '',
+          icon: 'plus',
+          class: 'green'
+        }, {
+          origin: true,
+          id: 1,
+          uuid: Utils.getuuid(),
+          label: 'update',
+          intertype: 'inner',
+          innerFunc: '',
+          interface: '',
+          outerFunc: '',
+          callbackFunc: '',
+          Ot: 'requiredSgl',
+          OpenType: 'pop',
+          pageTemplate: '',
+          icon: 'form',
+          class: 'purple'
+        }, {
+          origin: true,
+          id: 2,
+          uuid: Utils.getuuid(),
+          label: 'delete',
+          intertype: 'inner',
+          innerFunc: '',
+          interface: '',
+          outerFunc: '',
+          callbackFunc: '',
+          Ot: 'required',
+          OpenType: 'prompt',
+          pageTemplate: '',
+          icon: 'delete',
+          class: 'red'
+        }, {
+          origin: true,
+          id: 3,
+          uuid: Utils.getuuid(),
+          label: 'freeze',
+          intertype: 'inner',
+          innerFunc: '',
+          interface: '',
+          outerFunc: '',
+          callbackFunc: '',
+          Ot: 'requiredOnce',
+          OpenType: 'exec',
+          pageTemplate: '',
+          icon: '',
+          class: 'default'
+        }
+      ],
+      columns: [
+        {
+          origin: true,
+          id: 0,
+          uuid: Utils.getuuid(),
+          Align: 'left',
+          label: 'fieldName1',
+          field: '',
+          Hide: 'false',
+          IsSort: 'true',
+          Width: 120
+        }, {
+          origin: true,
+          id: 1,
+          uuid: Utils.getuuid(),
+          Align: 'left',
+          label: 'fieldName2',
+          field: '',
+          Hide: 'false',
+          IsSort: 'true',
+          Width: 120
+        }, {
+          origin: true,
+          id: 2,
+          uuid: Utils.getuuid(),
+          Align: 'left',
+          label: 'fieldName3',
+          field: '',
+          Hide: 'false',
+          IsSort: 'true',
+          Width: 120
+        }, {
+          origin: true,
+          id: 3,
+          uuid: Utils.getuuid(),
+          Align: 'left',
+          label: 'fieldName4',
+          field: '',
+          Hide: 'false',
+          IsSort: 'true',
+          Width: 120
+        }
+      ]
     },
     searchItems: [
       {
@@ -266,9 +306,30 @@
     ]
   }
 
-  handleList = (list) => {
+  handleList = (listObj) => {
     let config = this.state.config
-    this.setState({config: {...config, ...list}})
+    if (this.props.type === 'add') {
+      let key = Object.keys(listObj)[0]
+      let newlength = listObj[key].length
+      if (newlength > config[key].length) {
+        listObj[key] = listObj[key].filter(item => !item.origin)
+      }
+      if (newlength > listObj[key].length) {
+        this.setState({
+          [key + 'loading']: true,
+          config: {...config, ...listObj}
+        })
+        setTimeout(() => {
+          this.setState({
+            [key + 'loading']: false
+          })
+        }, 100)
+      } else {
+        this.setState({config: {...config, ...listObj}})
+      }
+    } else {
+      this.setState({config: {...config, ...listObj}})
+    }
   }
 
   handleSearch = (card) => {
@@ -493,6 +554,14 @@
         },
         {
           type: 'text',
+          key: 'innerFunc',
+          label: this.state.dict['header.form.innerFunc'],
+          initVal: card.innerFunc,
+          required: false,
+          readonly: false
+        },
+        {
+          type: 'text',
           key: 'interface',
           label: this.state.dict['header.form.interface'],
           initVal: card.interface,
@@ -501,10 +570,10 @@
         },
         {
           type: 'text',
-          key: 'func',
-          label: this.state.dict['header.form.func'],
-          initVal: card.func,
-          required: true,
+          key: 'outerFunc',
+          label: this.state.dict['header.form.outerFunc'],
+          initVal: card.outerFunc,
+          required: false,
           readonly: false
         },
         {
@@ -634,15 +703,27 @@
 
   handleSubmit = () => {
     this.formRef.handleConfirm().then(res => {
-      console.log(res)
       let _config = this.state.config
-      _config[res.type] = _config[res.type].map(item => {
-        if (item.uuid === res.values.uuid) {
-          return res.values
-        } else {
-          return item
-        }
-      })
+
+      if (this.props.type === 'add') {
+        _config[res.type] = _config[res.type].map(item => {
+          if (item.uuid === res.values.uuid) {
+            return res.values
+          } else {
+            return item
+          }
+        })
+        _config[res.type] = _config[res.type].filter(item => !item.origin)
+      } else {
+        _config[res.type] = _config[res.type].map(item => {
+          if (item.uuid === res.values.uuid) {
+            return res.values
+          } else {
+            return item
+          }
+        })
+      }
+
       this.setState({
         config: _config,
         [res.type + 'loading']: true,
@@ -703,35 +784,52 @@
     this.props.handleConfig('')
   }
 
-  queryField = (type, name) => {
-    if (!name) {
+  queryField = (type) => {
+    const {selectedTables, tableColumns, config} = this.state
+    if (selectedTables.length === 0) {
       notification.warning({
         top: 92,
-        message: '璇疯緭鍏ヨ〃鍚嶏紒',
+        message: '璇烽�夋嫨琛ㄥ悕锛�',
         duration: 10
       })
       return
     }
+
+    let columns = new Map()
+    tableColumns.forEach(table => {
+      table.columns.forEach(column => {
+        columns.set(column.field, column)
+      })
+    })
+
     if (type === 'search') {
-      Api.getSystemConfig({func: 'sPC_Get_MainMenu'}).then(res => {
-        if (res.status) {
-          this.setState({
-            tableVisible: true,
-            addType: type
-          })
-        } else {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 10
-          })
+      let others = []
+      config.search.forEach(item => {
+        if (columns.has(item.field)) {
+          columns.set(item.field, item)
+        } else if (item.field) {
+          others.push(item)
         }
       })
+      this.setState({
+        addType: type,
+        tableVisible: true,
+        option: {
+          normal: [...columns.values()],
+          others: others
+        }
+      }, () => {
+        console.log(this.state.option)
+      })
     }
+    // console.log(tableColumns)
+    // console.log(columns)
+    // console.log(config)
   }
 
   addFieldSubmit = () => {
-    console.log(13)
+    let cards = this.refs.searchcard.getSelectedCard()
+    console.log(cards)
   }
 
   cancelFieldSubmit = () => {
@@ -743,7 +841,7 @@
 
   UNSAFE_componentWillMount () {
     let _config = ''
-    if (!this.props.menu.LongParam) {
+    if (this.props.type === 'add') {
       _config = JSON.parse(JSON.stringify((this.state.baseconfig)))
     } else {
       _config = this.props.menu.LongParam
@@ -794,26 +892,287 @@
     })
   }
 
+  onTableChange = (value) => {
+    const {tables, selectedTables, tableColumns} = this.state
+
+    let _table = tables.filter(item => item.name === value)[0]
+    let isSelected = !!selectedTables.filter(cell => cell.name === value)[0]
+    if (!isSelected) {
+      this.setState({
+        selectedTables: [...selectedTables, _table]
+      })
+      let SUsers = [
+        {
+          field: 'UID',
+          label: 'UID',
+          type: 'text'
+        },
+        {
+          field: 'UserCode',
+          label: 'UserCode',
+          type: 'text'
+        },
+        {
+          field: 'UserName',
+          label: 'UserName',
+          type: 'text'
+        },
+        {
+          field: 'PassWord',
+          label: 'PassWord',
+          type: 'text'
+        },
+        {
+          field: 'FullName',
+          label: 'FullName',
+          type: 'text'
+        },
+        {
+          field: 'RoleID',
+          label: 'RoleID',
+          type: 'text'
+        },
+        {
+          field: 'RoleName',
+          label: 'RoleName',
+          type: 'text'
+        }
+      ]
+      let SMenus = [
+        {
+          field: 'RoleID',
+          label: 'RoleID',
+          type: 'text'
+        },
+        {
+          field: 'RoleName',
+          label: 'RoleName',
+          type: 'text'
+        },
+        {
+          field: 'DepartmentCode',
+          label: 'DepartmentCode',
+          type: 'text'
+        },
+        {
+          field: 'Organization',
+          label: 'Organization',
+          type: 'text'
+        },
+        {
+          field: 'CSS',
+          label: 'CSS',
+          type: 'text'
+        },
+        {
+          field: 'HeadImage',
+          label: 'HeadImage',
+          type: 'text'
+        },
+        {
+          field: 'StaffID',
+          label: 'StaffID',
+          type: 'text'
+        },
+        {
+          field: 'Remark',
+          label: 'Remark',
+          type: 'text'
+        },
+        {
+          field: 'Deleted',
+          label: 'Deleted',
+          type: 'text'
+        },
+        {
+          field: 'APICode',
+          label: 'APICode',
+          type: 'text'
+        },
+        {
+          field: 'Status',
+          label: 'Status',
+          type: 'text'
+        },
+        {
+          field: 'Type',
+          label: 'Type',
+          type: 'text'
+        },
+        {
+          field: 'CreateDate',
+          label: 'CreateDate',
+          type: 'date'
+        }
+      ]
+      let SColumns = [
+        {
+          field: 'Type',
+          label: 'Type',
+          type: 'text'
+        },
+        {
+          field: 'CreateDate',
+          label: 'CreateDate',
+          type: 'date'
+        },
+        {
+          field: 'CreateUserID',
+          label: 'CreateUserID',
+          type: 'text'
+        },
+        {
+          field: 'CreateUser',
+          label: 'CreateUser',
+          type: 'text'
+        },
+        {
+          field: 'CreateStaff',
+          label: 'CreateStaff',
+          type: 'text'
+        },
+        {
+          field: 'CreateDepartCode',
+          label: 'CreateDepartCode',
+          type: 'text'
+        },
+        {
+          field: 'ModifyDate',
+          label: 'ModifyDate',
+          type: 'date'
+        },
+        {
+          field: 'ModifyUserID',
+          label: 'ModifyUserID',
+          type: 'text'
+        },
+        {
+          field: 'ModifyUser',
+          label: 'ModifyUser',
+          type: 'text'
+        },
+        {
+          field: 'ModifyDepartCode',
+          label: 'ModifyDepartCode',
+          type: 'text'
+        },
+        {
+          field: 'ModifyOrganCode',
+          label: 'ModifyOrganCode',
+          type: 'text'
+        }
+      ]
+      let SActions = [
+        {
+          field: 'ModifyDepartCode',
+          label: 'ModifyDepartCode',
+          type: 'text'
+        },
+        {
+          field: 'ModifyOrganCode',
+          label: 'ModifyOrganCode',
+          type: 'text'
+        },
+        {
+          field: 'SubmitDate',
+          label: 'SubmitDate',
+          type: 'date'
+        },
+        {
+          field: 'SubmitUserID',
+          label: 'SubmitUserID',
+          type: 'text'
+        },
+        {
+          field: 'SubmitUser',
+          label: 'SubmitUser',
+          type: 'text'
+        }
+      ]
+      Api.getSystemConfig({func: 'sPC_Get_MainMenu'}).then(res => {
+        if (res.status) {
+          let _change = {
+            SUsers: SUsers,
+            SMenus: SMenus,
+            SColumns: SColumns,
+            SActions: SActions
+          }
+          this.setState({
+            tableColumns: tableColumns.concat([{
+              tableName: _table.name,
+              columns: _change[_table.name]
+            }])
+          })
+        } else {
+          notification.warning({
+            top: 92,
+            message: res.message,
+            duration: 10
+          })
+        }
+      })
+    }
+  }
+
+  deleteTable = (table) => {
+    const {selectedTables, tableColumns} = this.state
+
+    this.setState({
+      selectedTables: selectedTables.filter(item => item.name !== table.name),
+      tableColumns: tableColumns.filter(item => item.tableName !== table.name)
+    })
+  }
+
   render () {
+    console.log(this.state.option)
     return (
       <div className="common-table-board">
         <DndProvider backend={HTML5Backend}>
           <div className="tools">
             <Collapse accordion defaultActiveKey="0" bordered={false}>
-              <Panel header="鍩烘湰淇℃伅" key="0">
+              <Panel header="鍩烘湰淇℃伅" key="0" id="common-basedata">
                 <MenuForm
                   dict={this.state.dict}
                   formlist={this.state.menuformlist}
                   wrappedComponentRef={(inst) => this.menuformRef = inst}
                 />
+                <div className="ant-col ant-form-item-label">
+                  <label title="娣诲姞琛ㄥ悕">娣诲姞琛ㄥ悕</label>
+                </div>
+                <Select
+                  showSearch
+                  className="tables"
+                  style={{ width: '100%' }}
+                  optionFilterProp="children"
+                  value={'璇烽�夋嫨琛ㄥ悕'}
+                  onChange={this.onTableChange}
+                  showArrow={false}
+                  getPopupContainer={() => document.getElementById('common-basedata')}
+                  filterOption={(input, option) =>
+                    option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                  }
+                > 
+                  {this.state.tables.map((table, index) => (
+                    <Option key={index} value={table.name}>{table.label}</Option>
+                  ))}
+                </Select>
+                {this.state.selectedTables.length > 0 && <List
+                  size="small"
+                  bordered
+                  dataSource={this.state.selectedTables}
+                  renderItem={(item, index) => <List.Item key={index} title={item.name + '--' + item.label}>
+                    {item.name + '--' + item.label}
+                    <Icon type="close" onClick={() => this.deleteTable(item)}/>
+                  </List.Item>}
+                />}
               </Panel>
               <Panel header="鎼滅储" key="1">
-                <Search placeholder="input table name." onSearch={value => this.queryField('search', value)} enterButton />
                 <div className="search-element">
                   {this.state.searchItems.map((item, index) => {
                     return (<SourceElement key={index} content={item}/>)
                   })}
                 </div>
+                <Button type="primary" block onClick={() => this.queryField('search')}>娣诲姞鎼滅储鏉′欢</Button>
               </Panel>
               <Panel header="鎸夐挳" key="2">
                 <div className="search-element">
@@ -823,12 +1182,12 @@
                 </div>
               </Panel>
               <Panel header="鏄剧ず鍒�" key="3">
-                <Search placeholder="input table name." onSearch={value => this.queryField('column', value)} enterButton />
                 <div className="search-element">
                   {this.state.columnItems.map((item, index) => {
                     return (<SourceElement key={index} content={item}/>)
                   })}
                 </div>
+                <Button type="primary" block onClick={() => this.queryField('column')}>娣诲姞鏄剧ず鍒�</Button>
               </Panel>
             </Collapse>
           </div>
@@ -914,8 +1273,24 @@
           onCancel={this.cancelFieldSubmit}
           destroyOnClose
         >
-          {this.state.addType === 'search' && <div>djfiafadf</div>}
+          {this.state.addType === 'search' &&
+            <div>
+              {this.state.option.normal.length > 0 && <EditCard data={this.state.option.normal} ref="searchcard" title="" />}
+              {this.state.option.others.length > 0 && <Row style={{marginLeft: '-10px', marginRight: '-10px'}}>
+                <p style={{margin: '10px 0px 0px 10px', color: '#1890ff'}}>鑷畾涔夊瓧娈�</p>
+                {this.state.option.others.map((item, index) => (
+                  <Col key={index} span={8} style={{padding: '10px'}}>
+                    <div className="ant-card ant-card-bordered" style={{padding: '10px'}}>
+                      <p>{item.label}</p>
+                      <p>{item.field}</p>
+                    </div>
+                  </Col>
+                ))}
+              </Row>}
+            </div>
+          }
         </Modal>
+        {this.state.loading && <Spin size="large" style={{position: 'fixed', left: '49vw', top: '230px'}} />}
       </div>
     )
   }
diff --git a/src/components/sidemenu/comtableconfig/index.scss b/src/components/sidemenu/comtableconfig/index.scss
index 5f6e425..1de9418 100644
--- a/src/components/sidemenu/comtableconfig/index.scss
+++ b/src/components/sidemenu/comtableconfig/index.scss
@@ -12,6 +12,9 @@
     flex: 1;
     background: #ffffff;
     border-right: 1px solid #d9d9d9;
+    height: 100%;
+    overflow-y: hidden;
+    padding-bottom: 30px;
     .ant-collapse-item {
       border: 0;
     }
@@ -44,12 +47,52 @@
         }
       }
     }
+    .tables {
+      .ant-select-selection-selected-value {
+        opacity: 0.4!important;
+      }
+    }
+    .ant-list {
+      margin-top: 20px;
+      .ant-list-item {
+        position: relative;
+        padding-left: 5px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        width: 100%;
+        .anticon {
+          position: absolute;
+          top: 0px;
+          right: 0px;
+          padding: 3px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .tools:hover {
+    overflow-y: auto;
+  }
+  .tools::-webkit-scrollbar {
+    width: 7px;
+  }
+  .tools::-webkit-scrollbar-thumb {
+    border-radius: 5px;
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
+    background: rgba(0, 0, 0, 0.13);
+  }
+  .tools::-webkit-scrollbar-track {
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
+    border-radius: 3px;
+    border: 1px solid rgba(0, 0, 0, 0.07);
+    background: rgba(0, 0, 0, 0);
   }
   .setting {
     position: relative;
     width: calc(100vw - 235px);
     height: 100%;
-    overflow-y: auto;
+    overflow-y: hidden;
     background: #ffffff;
     .ant-card-head {
       min-height: 44px;
@@ -148,13 +191,13 @@
       }
       .action-list {
         padding: 0px 20px 15px;
-        min-height: 72px;
+        min-height: 82px;
         > .ant-row {
           min-height: 67px;
         }
         .page-card {
           display: inline-block;
-          margin: 0px 0px 20px 0px;
+          margin: 0px 0px 0px 0px;
           padding: 15px 10px 0 0;
           position: relative;
           div {
@@ -166,6 +209,9 @@
             top: 0px;
             cursor: pointer;
             display: none;
+          }
+          .edit.copy {
+            left: 20px;
           }
           button {
             cursor: move;
@@ -245,7 +291,21 @@
       }
     }
   }
+  .setting:hover {
+    overflow-y: auto;
+  }
+  .setting::-webkit-scrollbar {
+    width: 7px;
+  }
+  .setting::-webkit-scrollbar-thumb {
+    border-radius: 5px;
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
+    background: rgba(0, 0, 0, 0.13);
+  }
+  .setting::-webkit-scrollbar-track {
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
+    border-radius: 3px;
+    border: 1px solid rgba(0, 0, 0, 0.07);
+    background: rgba(0, 0, 0, 0);
+  }
 }
-// .commontable-edit-modal {
-//   width: 650px!important;
-// }
diff --git a/src/components/sidemenu/editthdmenu/index.jsx b/src/components/sidemenu/editthdmenu/index.jsx
index 3e1e65d..e566c2c 100644
--- a/src/components/sidemenu/editthdmenu/index.jsx
+++ b/src/components/sidemenu/editthdmenu/index.jsx
@@ -392,6 +392,7 @@
         editMenu: {...editMenu, ...{LongParam: template.baseconfig, PageParam: _PageParam, type: template.type}}
       })
     }
+    document.getElementById('root').style.overflowY = 'hidden'
   }
 
   // submitMenuConfig = () => {
@@ -525,6 +526,7 @@
 
   handleConfig = (type) => {
     this.setState({tabview: type})
+    document.getElementById('root').style.overflowY = 'unset'
   }
 
   UNSAFE_componentWillMount () {
@@ -610,6 +612,7 @@
         </div>}
         {this.state.tabview === 'CommonTable' &&
           <ComTableConfig
+            type={this.state.type}
             menu={this.state.editMenu}
             supMenu={this.props.supMenu}
             supMenuList={this.props.supMenuList}
diff --git a/src/locales/en-US/comtable.js b/src/locales/en-US/comtable.js
new file mode 100644
index 0000000..0a02cdb
--- /dev/null
+++ b/src/locales/en-US/comtable.js
@@ -0,0 +1,83 @@
+export default {
+  'header.confirm': 'Ok',
+  'header.submit': 'Submit',
+  'header.delete': 'Delete',
+  'header.cancel': 'Cancel',
+  'header.edit': 'Edit',
+  'header.return': 'Back',
+  'header.close': 'Close',
+  'header.menu.basemsg': '璇峰畬鍠勮彍鍗曞熀鏈俊鎭紒',
+  'header.menu.template.change': '鍒囨崲妯℃澘',
+  'header.menu.addtitle': 'The new menu',
+  'header.menu.editTitle': 'The edit menu',
+  'header.menu.menuID': 'Menu ID',
+  'header.menu.menuName': 'Menu Name',
+  'header.menu.menuNo': 'Menu Parameter',
+  'header.menu.supMenu': 'Superior Menu',
+  'header.menu.icon': 'Icon',
+  'header.menu.openType': 'Open With',
+  'header.menu.openType.menu': 'Menu',
+  'header.menu.openType.newWindow': 'A new window',
+  'header.menu.newpage.service': 'Customer Service',
+  'header.form.search.placeholder': '璇锋坊鍔犳悳绱㈡潯浠�',
+  'header.form.action.placeholder': '璇锋坊鍔犳寜閽�',
+  'header.form.column.placeholder': '璇锋坊鍔犳樉绀哄垪',
+  'header.form.name': 'Name',
+  'header.form.field': '瀛楁',
+  'header.form.func': '鍑芥暟鍚�',
+  'header.form.innerFunc': '鍐呴儴鍑芥暟',
+  'header.form.outerFunc': '澶栭儴鍑芥暟',
+  'header.form.callbackFunc': '鍥炶皟鍑芥暟',
+  'header.form.intertype': '鎺ュ彛绫诲瀷',
+  'header.form.interface': '鎺ュ彛鍦板潃',
+  'header.form.interface.inner': '鍐呴儴',
+  'header.form.interface.outer': '澶栭儴',
+  'header.form.pageTemplate': '椤甸潰妯℃澘',
+  'header.form.type': 'Type',
+  'header.form.text': 'Text',
+  'header.form.select': 'Select',
+  'header.form.link': '鍏宠仈鑿滃崟',
+  'header.form.dateday': 'Date(Day)',
+  'header.form.datetime': 'Date(Second)',
+  'header.form.initval': 'Initial Value',
+  'header.form.isRequired': '琛岃缃�',
+  'header.form.notRequired': '涓嶉�夋嫨琛�',
+  'header.form.requiredSgl': '閫夋嫨鍗曡',
+  'header.form.required': '閫夋嫨澶氳',
+  'header.form.requiredOnce': '澶氳鎷兼帴',
+  'header.form.openType': '鎵撳紑鏂瑰紡',
+  'header.form.pop': '寮圭獥',
+  'header.form.tab': '鏂版爣绛鹃〉',
+  'header.form.newpage': '鏂伴〉闈�',
+  'header.form.blank': '褰撳墠椤佃烦杞�',
+  'header.form.prompt': '鎻愮ず妗�',
+  'header.form.exec': '鐩存帴鎵ц',
+  'header.form.icon': '鍥炬爣',
+  'header.form.class': '棰滆壊',
+  'header.form.align': '瀵归綈鏂瑰紡',
+  'header.form.alignLeft': '宸﹀榻�',
+  'header.form.alignRight': '鍙冲榻�',
+  'header.form.alignCenter': '灞呬腑',
+  'header.form.Hide': '鏄惁闅愯棌',
+  'header.form.IsSort': '鏄惁鎺掑簭',
+  'header.form.columnWidth': '鍒楀',
+  'header.form.true': '鏄�',
+  'header.form.false': '鍚�',
+  'header.form.setAll': '璁剧疆鍏ㄩ儴椤�',
+  'header.form.resourceType': '閫夐」鏉ユ簮',
+  'header.form.custom': '鑷畾涔�',
+  'header.form.datasource': '鏁版嵁婧�',
+  'header.form.valueField': '鍊悸峰瓧娈�',
+  'header.form.valueText': '鏂囨湰路瀛楁',
+  'header.form.orderBy': '鎺掑簭路瀛楁',
+  'header.form.orderType': '鎺掑簭鏂瑰紡',
+  'header.form.asc': '姝e簭',
+  'header.form.desc': '鍊掑簭',
+  'header.form.linkField': '鍏宠仈瀛楁',
+  'header.form.display': '鏄剧ず鏂瑰紡',
+  'header.form.dropdown': '涓嬫媺鑿滃崟',
+  'header.form.button': '鎸夐挳',
+  'header.form.selectItem.error': '涓嬫媺閫夐」璁剧疆閿欒锛�',
+  'form.required.input': 'Please enter the ',
+  'form.required.select': '璇烽�夋嫨'
+}
\ No newline at end of file
diff --git a/src/locales/en-US/header.js b/src/locales/en-US/header.js
index a94e7c3..e428417 100644
--- a/src/locales/en-US/header.js
+++ b/src/locales/en-US/header.js
@@ -43,63 +43,6 @@
   'header.menu.thawmenu.target': 'Unfreeze',
   'header.menu.thawmenu.itemUnit': 'item',
   'header.menu.thawmenu.itemsUnit': 'items',
-  'header.form.search.placeholder': '璇锋坊鍔犳悳绱㈡潯浠�',
-  'header.form.action.placeholder': '璇锋坊鍔犳寜閽�',
-  'header.form.column.placeholder': '璇锋坊鍔犳樉绀哄垪',
-  'header.form.name': 'Name',
-  'header.form.field': '瀛楁',
-  'header.form.func': '鍑芥暟鍚�',
-  'header.form.callbackFunc': '鍥炶皟鍑芥暟',
-  'header.form.intertype': '鎺ュ彛绫诲瀷',
-  'header.form.interface': '鎺ュ彛鍦板潃',
-  'header.form.interface.inner': '鍐呴儴',
-  'header.form.interface.outer': '澶栭儴',
-  'header.form.pageTemplate': '椤甸潰妯℃澘',
-  'header.form.type': 'Type',
-  'header.form.text': 'Text',
-  'header.form.select': 'Select',
-  'header.form.link': '鍏宠仈鑿滃崟',
-  'header.form.dateday': 'Date(Day)',
-  'header.form.datetime': 'Date(Second)',
-  'header.form.initval': 'Initial Value',
-  'header.form.isRequired': '琛岃缃�',
-  'header.form.notRequired': '涓嶉�夋嫨琛�',
-  'header.form.requiredSgl': '閫夋嫨鍗曡',
-  'header.form.required': '閫夋嫨澶氳',
-  'header.form.requiredOnce': '澶氳鎷兼帴',
-  'header.form.openType': '鎵撳紑鏂瑰紡',
-  'header.form.pop': '寮圭獥',
-  'header.form.tab': '鏂版爣绛鹃〉',
-  'header.form.newpage': '鏂伴〉闈�',
-  'header.form.blank': '褰撳墠椤佃烦杞�',
-  'header.form.prompt': '鎻愮ず妗�',
-  'header.form.exec': '鐩存帴鎵ц',
-  'header.form.icon': '鍥炬爣',
-  'header.form.class': '棰滆壊',
-  'header.form.align': '瀵归綈鏂瑰紡',
-  'header.form.alignLeft': '宸﹀榻�',
-  'header.form.alignRight': '鍙冲榻�',
-  'header.form.alignCenter': '灞呬腑',
-  'header.form.Hide': '鏄惁闅愯棌',
-  'header.form.IsSort': '鏄惁鎺掑簭',
-  'header.form.columnWidth': '鍒楀',
-  'header.form.true': '鏄�',
-  'header.form.false': '鍚�',
-  'header.form.setAll': '璁剧疆鍏ㄩ儴椤�',
-  'header.form.resourceType': '閫夐」鏉ユ簮',
-  'header.form.custom': '鑷畾涔�',
-  'header.form.datasource': '鏁版嵁婧�',
-  'header.form.valueField': '鍊悸峰瓧娈�',
-  'header.form.valueText': '鏂囨湰路瀛楁',
-  'header.form.orderBy': '鎺掑簭路瀛楁',
-  'header.form.orderType': '鎺掑簭鏂瑰紡',
-  'header.form.asc': '姝e簭',
-  'header.form.desc': '鍊掑簭',
-  'header.form.linkField': '鍏宠仈瀛楁',
-  'header.form.display': '鏄剧ず鏂瑰紡',
-  'header.form.dropdown': '涓嬫媺鑿滃崟',
-  'header.form.button': '鎸夐挳',
-  'header.form.selectItem.error': '涓嬫媺閫夐」璁剧疆閿欒锛�',
   'form.required.input': 'Please enter the ',
   'form.required.select': '璇烽�夋嫨'
 }
\ No newline at end of file
diff --git a/src/locales/zh-CN/comtable.js b/src/locales/zh-CN/comtable.js
new file mode 100644
index 0000000..37d03e6
--- /dev/null
+++ b/src/locales/zh-CN/comtable.js
@@ -0,0 +1,83 @@
+export default {
+  'header.confirm': '纭畾',
+  'header.submit': '鎻愪氦',
+  'header.delete': '鍒犻櫎',
+  'header.cancel': '鍙栨秷',
+  'header.edit': '缂栬緫',
+  'header.return': '杩斿洖',
+  'header.close': '鍏抽棴',
+  'header.menu.basemsg': '璇峰畬鍠勮彍鍗曞熀鏈俊鎭紒',
+  'header.menu.template.change': '鍒囨崲妯℃澘',
+  'header.menu.addtitle': '鏂板缓鑿滃崟',
+  'header.menu.editTitle': '缂栬緫鑿滃崟',
+  'header.menu.menuID': '鑿滃崟ID',
+  'header.menu.menuName': '鑿滃崟鍚嶇О',
+  'header.menu.menuNo': '鑿滃崟鍙傛暟',
+  'header.menu.supMenu': '涓婄骇鑿滃崟',
+  'header.menu.icon': '鍥炬爣',
+  'header.menu.openType': '鎵撳紑鏂瑰紡',
+  'header.menu.openType.menu': '鑿滃崟',
+  'header.menu.openType.newWindow': '鏂扮獥鍙�',
+  'header.menu.newpage.service': '瀹㈡湇',
+  'header.form.search.placeholder': '璇锋坊鍔犳悳绱㈡潯浠�',
+  'header.form.action.placeholder': '璇锋坊鍔犳寜閽�',
+  'header.form.column.placeholder': '璇锋坊鍔犳樉绀哄垪',
+  'header.form.name': '鍚嶇О',
+  'header.form.field': '瀛楁',
+  'header.form.func': '鍑芥暟鍚�',
+  'header.form.innerFunc': '鍐呴儴鍑芥暟',
+  'header.form.outerFunc': '澶栭儴鍑芥暟',
+  'header.form.callbackFunc': '鍥炶皟鍑芥暟',
+  'header.form.intertype': '鎺ュ彛绫诲瀷',
+  'header.form.interface': '鎺ュ彛鍦板潃',
+  'header.form.interface.inner': '鍐呴儴',
+  'header.form.interface.outer': '澶栭儴',
+  'header.form.pageTemplate': '椤甸潰妯℃澘',
+  'header.form.type': '绫诲瀷',
+  'header.form.text': '鏂囨湰',
+  'header.form.select': '閫夋嫨',
+  'header.form.link': '鍏宠仈鑿滃崟',
+  'header.form.dateday': '鏃ユ湡锛堝ぉ锛�',
+  'header.form.datetime': '鏃ユ湡锛堢锛�',
+  'header.form.initval': '鍒濆鍊�',
+  'header.form.isRequired': '琛岃缃�',
+  'header.form.notRequired': '涓嶉�夋嫨琛�',
+  'header.form.requiredSgl': '閫夋嫨鍗曡',
+  'header.form.required': '閫夋嫨澶氳',
+  'header.form.requiredOnce': '澶氳鎷兼帴',
+  'header.form.openType': '鎵撳紑鏂瑰紡',
+  'header.form.pop': '寮圭獥',
+  'header.form.tab': '鏂版爣绛鹃〉',
+  'header.form.newpage': '鏂伴〉闈�',
+  'header.form.blank': '褰撳墠椤佃烦杞�',
+  'header.form.prompt': '鎻愮ず妗�',
+  'header.form.exec': '鐩存帴鎵ц',
+  'header.form.icon': '鍥炬爣',
+  'header.form.class': '棰滆壊',
+  'header.form.align': '瀵归綈鏂瑰紡',
+  'header.form.alignLeft': '宸﹀榻�',
+  'header.form.alignRight': '鍙冲榻�',
+  'header.form.alignCenter': '灞呬腑',
+  'header.form.Hide': '鏄惁闅愯棌',
+  'header.form.IsSort': '鏄惁鎺掑簭',
+  'header.form.columnWidth': '鍒楀',
+  'header.form.true': '鏄�',
+  'header.form.false': '鍚�',
+  'header.form.setAll': '璁剧疆鍏ㄩ儴',
+  'header.form.resourceType': '閫夐」鏉ユ簮',
+  'header.form.custom': '鑷畾涔�',
+  'header.form.datasource': '鏁版嵁婧�',
+  'header.form.valueField': '鍊悸峰瓧娈�',
+  'header.form.valueText': '鏂囨湰路瀛楁',
+  'header.form.orderBy': '鎺掑簭路瀛楁',
+  'header.form.orderType': '鎺掑簭鏂瑰紡',
+  'header.form.asc': '姝e簭',
+  'header.form.desc': '鍊掑簭',
+  'header.form.linkField': '鍏宠仈瀛楁',
+  'header.form.display': '鏄剧ず鏂瑰紡',
+  'header.form.dropdown': '涓嬫媺鑿滃崟',
+  'header.form.button': '鎸夐挳',
+  'header.form.selectItem.error': '涓嬫媺閫夐」璁剧疆閿欒锛�',
+  'form.required.input': '璇疯緭鍏�',
+  'form.required.select': '璇烽�夋嫨'
+}
\ No newline at end of file
diff --git a/src/locales/zh-CN/header.js b/src/locales/zh-CN/header.js
index e9b2a23..dc9ba98 100644
--- a/src/locales/zh-CN/header.js
+++ b/src/locales/zh-CN/header.js
@@ -43,63 +43,6 @@
   'header.menu.thawmenu.target': '瑙i櫎鍐荤粨',
   'header.menu.thawmenu.itemUnit': '椤�',
   'header.menu.thawmenu.itemsUnit': '椤�',
-  'header.form.search.placeholder': '璇锋坊鍔犳悳绱㈡潯浠�',
-  'header.form.action.placeholder': '璇锋坊鍔犳寜閽�',
-  'header.form.column.placeholder': '璇锋坊鍔犳樉绀哄垪',
-  'header.form.name': '鍚嶇О',
-  'header.form.field': '瀛楁',
-  'header.form.func': '鍑芥暟鍚�',
-  'header.form.callbackFunc': '鍥炶皟鍑芥暟',
-  'header.form.intertype': '鎺ュ彛绫诲瀷',
-  'header.form.interface': '鎺ュ彛鍦板潃',
-  'header.form.interface.inner': '鍐呴儴',
-  'header.form.interface.outer': '澶栭儴',
-  'header.form.pageTemplate': '椤甸潰妯℃澘',
-  'header.form.type': '绫诲瀷',
-  'header.form.text': '鏂囨湰',
-  'header.form.select': '閫夋嫨',
-  'header.form.link': '鍏宠仈鑿滃崟',
-  'header.form.dateday': '鏃ユ湡锛堝ぉ锛�',
-  'header.form.datetime': '鏃ユ湡锛堢锛�',
-  'header.form.initval': '鍒濆鍊�',
-  'header.form.isRequired': '琛岃缃�',
-  'header.form.notRequired': '涓嶉�夋嫨琛�',
-  'header.form.requiredSgl': '閫夋嫨鍗曡',
-  'header.form.required': '閫夋嫨澶氳',
-  'header.form.requiredOnce': '澶氳鎷兼帴',
-  'header.form.openType': '鎵撳紑鏂瑰紡',
-  'header.form.pop': '寮圭獥',
-  'header.form.tab': '鏂版爣绛鹃〉',
-  'header.form.newpage': '鏂伴〉闈�',
-  'header.form.blank': '褰撳墠椤佃烦杞�',
-  'header.form.prompt': '鎻愮ず妗�',
-  'header.form.exec': '鐩存帴鎵ц',
-  'header.form.icon': '鍥炬爣',
-  'header.form.class': '棰滆壊',
-  'header.form.align': '瀵归綈鏂瑰紡',
-  'header.form.alignLeft': '宸﹀榻�',
-  'header.form.alignRight': '鍙冲榻�',
-  'header.form.alignCenter': '灞呬腑',
-  'header.form.Hide': '鏄惁闅愯棌',
-  'header.form.IsSort': '鏄惁鎺掑簭',
-  'header.form.columnWidth': '鍒楀',
-  'header.form.true': '鏄�',
-  'header.form.false': '鍚�',
-  'header.form.setAll': '璁剧疆鍏ㄩ儴',
-  'header.form.resourceType': '閫夐」鏉ユ簮',
-  'header.form.custom': '鑷畾涔�',
-  'header.form.datasource': '鏁版嵁婧�',
-  'header.form.valueField': '鍊悸峰瓧娈�',
-  'header.form.valueText': '鏂囨湰路瀛楁',
-  'header.form.orderBy': '鎺掑簭路瀛楁',
-  'header.form.orderType': '鎺掑簭鏂瑰紡',
-  'header.form.asc': '姝e簭',
-  'header.form.desc': '鍊掑簭',
-  'header.form.linkField': '鍏宠仈瀛楁',
-  'header.form.display': '鏄剧ず鏂瑰紡',
-  'header.form.dropdown': '涓嬫媺鑿滃崟',
-  'header.form.button': '鎸夐挳',
-  'header.form.selectItem.error': '涓嬫媺閫夐」璁剧疆閿欒锛�',
   'form.required.input': '璇疯緭鍏�',
   'form.required.select': '璇烽�夋嫨'
 }
\ No newline at end of file

--
Gitblit v1.8.0