From 24f0ce147c8daef39ec437d5def9d089ea5b1839 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 05 六月 2020 17:23:53 +0800
Subject: [PATCH] 2020-06-05

---
 public/options.txt                                           |    2 
 src/assets/mobimg/mobile.png                                 |    0 
 src/index.js                                                 |    4 
 src/tabviews/treepage/index.jsx                              |    6 
 src/mob/header/index.jsx                                     |   79 ++++++++
 src/views/mobile/index.jsx                                   |   95 +--------
 src/locales/zh-CN/mob.js                                     |    6 
 src/components/header/index.jsx                              |    2 
 src/templates/sharecomponent/tabscomponent/tabform/index.jsx |    4 
 src/templates/comtableconfig/index.jsx                       |    9 +
 src/templates/subtableconfig/index.jsx                       |    9 +
 src/mob/home/index.scss                                      |   45 +++++
 src/views/mobile/index.scss                                  |   88 +++++++++
 src/mob/header/index.scss                                    |   45 +++++
 src/tabviews/subtable/index.jsx                              |    5 
 src/locales/en-US/mob.js                                     |    6 
 src/mob/home/index.jsx                                       |  127 ++++++++++++++
 17 files changed, 442 insertions(+), 90 deletions(-)

diff --git a/public/options.txt b/public/options.txt
index c3248c7..38bc713 100644
--- a/public/options.txt
+++ b/public/options.txt
@@ -1,6 +1,6 @@
 appId         -- 浜戠鐢熸垚鐨勫簲鐢↖D
 appkey        -- 浜戠鐢熸垚鐨勫簲鐢ㄥ瘑閽�
 mainSystemApi -- sso绯荤粺鐨勬帴鍙h矾寰勶紝娉細涓氬姟绯荤粺闇�瑕佸~鍐欙紝涓斿�间负閫氱敤鎺ュ彛鐨勫畬鏁磋矾寰�
-systemType    -- 涓氬姟绯荤粺浣跨敤姝ゅ弬鏁帮紝鍒ゆ柇绯荤粺涓烘祴璇曟垨姝e紡锛坥fficial锛夛紝姝e紡绯荤粺寮�鍙戞潈闄愬彧鍚湁绯荤粺鍗囩骇绛夐檺瀹氬姛鑳�
+systemType    -- 鍒ゆ柇涓氬姟绯荤粺涓烘祴璇曪紙绌猴級鎴栨寮忥紙 official 锛夛紝姝e紡绯荤粺寮�鍙戞潈闄愬彧鍚湁绯荤粺鍗囩骇绛夐檺瀹氬姛鑳�
 lineColor     -- 鍒嗗壊绾块鑹�
 filter        -- 椤甸潰婊ら暅锛屽�间负'true'鏃讹紝椤甸潰鏄剧ず涓洪粦鐧借壊
\ No newline at end of file
diff --git a/src/assets/mobimg/mobile.png b/src/assets/mobimg/mobile.png
new file mode 100644
index 0000000..c17bc0b
--- /dev/null
+++ b/src/assets/mobimg/mobile.png
Binary files differ
diff --git a/src/components/header/index.jsx b/src/components/header/index.jsx
index 1654fe2..5c8e6ac 100644
--- a/src/components/header/index.jsx
+++ b/src/components/header/index.jsx
@@ -678,7 +678,7 @@
         {this.props.editLevel === 'level4' ? <Button className="level4-close" type="primary" onClick={this.exitManage}>閫�鍑�</Button> : null}
         {/* 杩涘叆缂栬緫鎸夐挳 */}
         {this.props.editState && !this.props.editLevel ? <Icon onClick={this.enterEdit} className="edit-check" type="edit" /> : null}
-        {/* {this.props.editState && !this.props.editLevel ? <a href="#/mobile" target="blank" className="mobile" type="edit"> 绉诲姩绔�</a> : null} */}
+        {this.props.editState && !this.props.editLevel ? <a href="#/mobile" target="blank" className="mobile" type="edit"> 绉诲姩绔� <Icon type="arrow-right" /></a> : null}
         {/* 缂栬緫鑿滃崟 */}
         {this.props.editLevel === 'level1' ? <EditMenu menulist={this.state.menulist} reload={this.reload} exitEdit={this.exitEdit}/> : null}
         {/* 澶村儚銆佺敤鎴峰悕 */}
diff --git a/src/index.js b/src/index.js
index 9b58aac..e8e335e 100644
--- a/src/index.js
+++ b/src/index.js
@@ -26,7 +26,7 @@
 window.GLOB = window.GLOB || {}
 
 if (!(options.systemType === 'local' && window.GLOB.systemType === 'official')) { // 鍙湁涓氬姟绯荤粺鎵嶅彲浠ヨ缃负姝e紡绯荤粺
-  window.GLOB.systemType = 'test'
+  window.GLOB.systemType = ''
 }
 if (options.systemType !== 'local') { // sso,cloud涓嶅彲璁剧疆鍗曠偣鏈嶅姟鍣ㄥ湴鍧�
   window.GLOB.mainSystemApi = ''
@@ -94,7 +94,7 @@
 }
 
 if (process.env.NODE_ENV === 'production') { // 鐢ㄤ簬鏍¢獙鏄惁瀛樺湪寮�鍙戞潈闄�
-  let _service = window.location.href.split('/index.html')[0].replace(new RegExp(document.location.origin + '/?', 'ig'), '')
+  let _service = window.location.href.replace(/\/index.html(.*)/ig, '').replace(new RegExp(document.location.origin + '/?', 'ig'), '')
   window.GLOB.linkurl = window.location.href.split('#')[0]
   window.GLOB.service = _service ? _service + '/' : ''
 } else {
diff --git a/src/locales/en-US/mob.js b/src/locales/en-US/mob.js
new file mode 100644
index 0000000..15f67ba
--- /dev/null
+++ b/src/locales/en-US/mob.js
@@ -0,0 +1,6 @@
+export default {
+  'mob.confirm': '纭畾',
+  'mob.cancel': '鍙栨秷',
+  'mob.header.logout': '閫�鍑�',
+  'mob.header.logout.hint': '鎮ㄧ‘瀹氳閫�鍑哄悧?',
+}
\ No newline at end of file
diff --git a/src/locales/zh-CN/mob.js b/src/locales/zh-CN/mob.js
new file mode 100644
index 0000000..15f67ba
--- /dev/null
+++ b/src/locales/zh-CN/mob.js
@@ -0,0 +1,6 @@
+export default {
+  'mob.confirm': '纭畾',
+  'mob.cancel': '鍙栨秷',
+  'mob.header.logout': '閫�鍑�',
+  'mob.header.logout.hint': '鎮ㄧ‘瀹氳閫�鍑哄悧?',
+}
\ No newline at end of file
diff --git a/src/mob/header/index.jsx b/src/mob/header/index.jsx
new file mode 100644
index 0000000..da88082
--- /dev/null
+++ b/src/mob/header/index.jsx
@@ -0,0 +1,79 @@
+import React, {Component} from 'react'
+// import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { connect } from 'react-redux'
+import { withRouter } from 'react-router-dom'
+import {Dropdown, Menu, Icon, Modal } from 'antd'
+
+import { logout } from '@/store/action'
+import zhCN from '@/locales/zh-CN/mob.js'
+import enUS from '@/locales/en-US/mob.js'
+import avatar from '@/assets/img/avatar.jpg'
+import './index.scss'
+
+const { confirm } = Modal
+
+class MobHeader extends Component {
+  // static propTpyes = {
+  //   collapse: PropTypes.bool,
+  // }
+  state = {
+    dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
+    logourl: window.GLOB.mainlogo,
+    avatar: sessionStorage.getItem('CloudAvatar') || avatar,
+    userName: sessionStorage.getItem('CloudUserName')
+  }
+
+  logout = () => {
+    // 閫�鍑虹櫥褰�
+    let _this = this
+    confirm({
+      title: this.state.dict['mob.header.logout.hint'],
+      content: '',
+      okText: this.state.dict['mob.confirm'],
+      cancelText: this.state.dict['mob.cancel'],
+      onOk() {
+        sessionStorage.clear()
+        _this.props.logout()
+        _this.props.history.replace('/login')
+      },
+      onCancel() {}
+    })
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  render () {
+    return (
+      <header className="mob-header-container">
+        <div className="header-logo"><img src={this.state.logourl} alt=""/></div>
+        <Dropdown className="header-setting" overlay={
+          <Menu>
+            <Menu.Item key="2" onClick={this.logout}>{this.state.dict['mob.header.logout']}</Menu.Item>
+          </Menu>
+        }>
+          <div>
+            <img src={this.state.avatar} alt=""/>
+            <span>
+              <span className="username">{this.state.userName}</span> <Icon type="down" />
+            </span>
+          </div>
+        </Dropdown>
+      </header>
+    )
+  }
+}
+
+const mapStateToProps = () => {
+  return {}
+}
+
+const mapDispatchToProps = (dispatch) => {
+  return {
+    logout: () => dispatch(logout())
+  }
+}
+
+export default withRouter(connect(mapStateToProps, mapDispatchToProps)(MobHeader))
\ No newline at end of file
diff --git a/src/mob/header/index.scss b/src/mob/header/index.scss
new file mode 100644
index 0000000..b6b01d7
--- /dev/null
+++ b/src/mob/header/index.scss
@@ -0,0 +1,45 @@
+.mob-header-container {
+  width: 100%;
+  height: 48px;
+  color: rgba(255, 255, 255, 0.65);
+  
+  background: #001529;
+  border-bottom: 1px solid #000;
+
+  .header-logo {
+    float: left;
+    width: 180px;
+    line-height: 48px;
+    text-align: center;
+    padding-left: 5px;
+    box-sizing: border-box;
+    opacity: 1;
+    img {
+      max-width: 100%;
+      max-height: 40px;
+    }
+  }
+  .header-setting {
+    float: right;
+    line-height: 48px;
+    margin-right: 10px;
+    img {
+      width: 29px;
+      height: 29px;
+      border-radius: 30px;
+      margin-right: 7px;
+    }
+    span {
+      color: #ffffff;
+      font-size: 0.95rem;
+      .username {
+        display: inline-block;
+        height: 30px;
+        max-width: 95px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/mob/home/index.jsx b/src/mob/home/index.jsx
new file mode 100644
index 0000000..b09bc15
--- /dev/null
+++ b/src/mob/home/index.jsx
@@ -0,0 +1,127 @@
+import React, {Component} from 'react'
+// import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { Flex, WhiteSpace, Tabs } from 'antd-mobile'
+
+import zhCN from '@/locales/zh-CN/mob.js'
+import enUS from '@/locales/en-US/mob.js'
+import './index.scss'
+
+const PlaceHolder = ({ className = '', children = ''}) => (
+  <div className={`${className} placeholder`}>{children ? children : 'Block'}</div>
+)
+
+const tabs2 = [
+  { title: '绠�浠�', sub: '1' },
+  { title: '宸ヤ綔鍙�', sub: '2' },
+  { title: '涓汉涓績', sub: '3' },
+]
+
+class MobHome extends Component {
+  // static propTpyes = {
+  //   collapse: PropTypes.bool,
+  // }
+  state = {
+    dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  render () {
+
+    return (
+      <div className="mob-home">
+        <Tabs tabs={tabs2}
+          initialPage={1}
+          className="home"
+          tabBarPosition="bottom"
+          renderTab={tab => <span>{tab.title}</span>}
+        >
+          <div className="home-tab">
+            <div className="flex-container">
+              <div className="sub-title">Basic</div>
+              <Flex>
+                <Flex.Item><PlaceHolder ><span> test</span></PlaceHolder></Flex.Item>
+                <Flex.Item><PlaceHolder /></Flex.Item>
+              </Flex>
+              <WhiteSpace size="lg" />
+              <Flex>
+                <Flex.Item><PlaceHolder /></Flex.Item>
+                <Flex.Item><PlaceHolder /></Flex.Item>
+                <Flex.Item><PlaceHolder /></Flex.Item>
+              </Flex>
+              <WhiteSpace size="lg" />
+              <Flex>
+                <Flex.Item><PlaceHolder /></Flex.Item>
+                <Flex.Item><PlaceHolder /></Flex.Item>
+                <Flex.Item><PlaceHolder /></Flex.Item>
+                <Flex.Item><PlaceHolder /></Flex.Item>
+              </Flex>
+              <WhiteSpace size="lg" />
+
+              <div className="sub-title">Wrap</div>
+              <Flex wrap="wrap">
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+              </Flex>
+              <WhiteSpace size="lg" />
+
+              <div className="sub-title">Align</div>
+              <Flex justify="center">
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+              </Flex>
+              <WhiteSpace />
+              <Flex justify="end">
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+              </Flex>
+              <WhiteSpace />
+              <Flex justify="between">
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline" />
+              </Flex>
+
+              <WhiteSpace />
+              <Flex align="start">
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline small" />
+                <PlaceHolder className="inline" />
+              </Flex>
+              <WhiteSpace />
+              <Flex align="end">
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline small" />
+                <PlaceHolder className="inline" />
+              </Flex>
+              <WhiteSpace />
+              <Flex align="baseline">
+                <PlaceHolder className="inline" />
+                <PlaceHolder className="inline small" />
+                <PlaceHolder className="inline" />
+              </Flex>
+            </div>
+          </div>
+          <div className="home-tab">
+            Content of second tab
+          </div>
+          <div className="home-tab">
+            Content of third tab
+          </div>
+        </Tabs>
+      </div>
+    )
+  }
+}
+
+export default MobHome
\ No newline at end of file
diff --git a/src/mob/home/index.scss b/src/mob/home/index.scss
new file mode 100644
index 0000000..b6b01d7
--- /dev/null
+++ b/src/mob/home/index.scss
@@ -0,0 +1,45 @@
+.mob-header-container {
+  width: 100%;
+  height: 48px;
+  color: rgba(255, 255, 255, 0.65);
+  
+  background: #001529;
+  border-bottom: 1px solid #000;
+
+  .header-logo {
+    float: left;
+    width: 180px;
+    line-height: 48px;
+    text-align: center;
+    padding-left: 5px;
+    box-sizing: border-box;
+    opacity: 1;
+    img {
+      max-width: 100%;
+      max-height: 40px;
+    }
+  }
+  .header-setting {
+    float: right;
+    line-height: 48px;
+    margin-right: 10px;
+    img {
+      width: 29px;
+      height: 29px;
+      border-radius: 30px;
+      margin-right: 7px;
+    }
+    span {
+      color: #ffffff;
+      font-size: 0.95rem;
+      .username {
+        display: inline-block;
+        height: 30px;
+        max-width: 95px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/tabviews/subtable/index.jsx b/src/tabviews/subtable/index.jsx
index d15bd1c..a5c0f11 100644
--- a/src/tabviews/subtable/index.jsx
+++ b/src/tabviews/subtable/index.jsx
@@ -777,6 +777,8 @@
    * @description 鎸夐挳鎿嶄綔瀹屾垚鍚庯紙鎴愬姛鎴栧け璐ワ級锛岄〉闈㈠埛鏂帮紝閲嶇疆椤电爜鍙婇�夋嫨椤�
    */
   refreshbyaction = (btn, type) => {
+    const { Tab } = this.props
+
     if (btn.execSuccess === 'grid' && type === 'success') {
       this.reloadtable()
     } else if (btn.execError === 'grid' && type === 'error') {
@@ -795,6 +797,9 @@
       this.reloadtable()
       this.props.handleMainTable('equaltab')
     } else if (btn.execSuccess === 'maingrid' && type === 'success') {
+      if (Tab.isTreeNode) {
+        this.reloadtable()
+      }
       this.props.handleMainTable('maingrid')
     } else if (btn.execSuccess === 'equaltab' && type === 'success') {
       this.reloadtable()
diff --git a/src/tabviews/treepage/index.jsx b/src/tabviews/treepage/index.jsx
index b25f051..243fe32 100644
--- a/src/tabviews/treepage/index.jsx
+++ b/src/tabviews/treepage/index.jsx
@@ -113,7 +113,7 @@
       // 鏉冮檺杩囨护
       config.tabgroups.forEach(group => {
         group.sublist = group.sublist.filter(tab => {
-          if (tab.supMenu === 'mainTable') {
+          if (tab.supMenu === 'mainTable' || (!tab.supMenu && tab.level === 0)) {
             tab.isTreeNode = true
           }
           return permAction[tab.linkTab]}
@@ -554,9 +554,9 @@
    * @description 瀛愯〃鎿嶄綔瀹屾垚鍚庡埛鏂颁富琛�
    */
   handleMainTable = (type, tab) => {
-    if (type === 'maingrid' && tab.supMenu === 'mainTable') {
+    if (type === 'maingrid' && (tab.supMenu === 'mainTable' || (!tab.supMenu && tab.level === 0))) {
       this.loadmaindata()
-    } else if (type === 'mainline' && tab.supMenu === 'mainTable') {
+    } else if (type === 'mainline' && (tab.supMenu === 'mainTable' || (!tab.supMenu && tab.level === 0))) {
       this.loadmaindata()
     } else if ((type === 'maingrid' || type === 'mainline') && tab.supMenu) {
       this.setState({
diff --git a/src/templates/comtableconfig/index.jsx b/src/templates/comtableconfig/index.jsx
index a9f7bb8..34481c6 100644
--- a/src/templates/comtableconfig/index.jsx
+++ b/src/templates/comtableconfig/index.jsx
@@ -1125,10 +1125,19 @@
       }
     })
 
+    let hasKey = false
+    config.columns.forEach(col => {
+      if (config.setting.primaryKey === col.field) {
+        hasKey = true
+      }
+    })
+
     if (config.setting.interType === 'inner' && !config.setting.innerFunc && config.setting.default !== 'false' && !config.setting.dataresource) {
       return '鑿滃崟灏氭湭璁剧疆鏁版嵁婧愶紝涓嶅彲鍚敤锛�'
     } else if (!config.setting.primaryKey) {
       return '鑿滃崟灏氭湭璁剧疆涓婚敭锛屼笉鍙惎鐢紒'
+    } else if (!hasKey) {
+      return '鏄剧ず鍒椾腑涓嶅瓨鍦ㄤ富閿瓧娈碉紝涓嶅彲鍚敤锛�'
     } else if (!tabinvalid) {
       return '鑿滃崟鏍囩椤佃缃敊璇紙瀛樺湪澶氳鏍囩鏃讹紝琛屾爣绛句笉鍙负绌猴級锛�'
     } else if (charterr) {
diff --git a/src/templates/sharecomponent/tabscomponent/tabform/index.jsx b/src/templates/sharecomponent/tabscomponent/tabform/index.jsx
index cb93c5b..a3e9a01 100644
--- a/src/templates/sharecomponent/tabscomponent/tabform/index.jsx
+++ b/src/templates/sharecomponent/tabscomponent/tabform/index.jsx
@@ -272,10 +272,10 @@
           }
           if (values.level === undefined) {
             values.level = ''
-          } else if (values.supMenu && values.level === 0) {
+          } else if (values.supMenu && values.supMenu === 'mainTable' && values.level === 0) {
             notification.warning({
               top: 92,
-              message: '瀛樺湪涓婄骇鏍囩锛屼笖璁剧疆鏄剧ず绾у埆涓�0鏃讹紝浼氶�犳垚瀛愯〃涓寜閽笉鍙敤锛�',
+              message: '涓婄骇鏍囩涓轰富琛紝涓旇缃樉绀虹骇鍒负0鏃讹紝浼氶�犳垚瀛愯〃涓寜閽笉鍙敤锛�',
               duration: 5
             })
           }
diff --git a/src/templates/subtableconfig/index.jsx b/src/templates/subtableconfig/index.jsx
index 217740f..76e676f 100644
--- a/src/templates/subtableconfig/index.jsx
+++ b/src/templates/subtableconfig/index.jsx
@@ -922,10 +922,19 @@
       }
     })
 
+    let hasKey = false
+    config.columns.forEach(col => {
+      if (config.setting.primaryKey === col.field) {
+        hasKey = true
+      }
+    })
+
     if (config.setting.interType === 'inner' && !config.setting.innerFunc && config.setting.default !== 'false' && !config.setting.dataresource) {
       return '鑿滃崟灏氭湭璁剧疆鏁版嵁婧愶紝涓嶅彲鍚敤锛�'
     } else if (!config.setting.primaryKey) {
       return '鑿滃崟灏氭湭璁剧疆涓婚敭锛屼笉鍙惎鐢紒'
+    } else if (!hasKey) {
+      return '鏄剧ず鍒椾腑涓嶅瓨鍦ㄤ富閿瓧娈碉紝涓嶅彲鍚敤锛�'
     } else if (charterr) {
       return charterr
     } else {
diff --git a/src/views/mobile/index.jsx b/src/views/mobile/index.jsx
index db6243f..22534e3 100644
--- a/src/views/mobile/index.jsx
+++ b/src/views/mobile/index.jsx
@@ -1,19 +1,16 @@
 import React, {Component} from 'react'
 import {connect} from 'react-redux'
 // import { message, Modal } from 'antd'
-import { Flex, WhiteSpace } from 'antd-mobile'
 
 // import Api from '@/api'
 import zhCN from '@/locales/zh-CN/login.js'
 import enUS from '@/locales/en-US/login.js'
-// import asyncComponent from '@/utils/asyncComponent'
-// import asyncLoadComponent from '@/utils/asyncLoadComponent'
+import asyncComponent from '@/utils/asyncComponent'
+
 import './index.scss'
 
-
-const PlaceHolder = ({ className = '', ...restProps }) => (
-  <div className={`${className} placeholder`} {...restProps}>Block</div>
-)
+const Header = asyncComponent(() => import('@/mob/header'))
+const Home = asyncComponent(() => import('@/mob/home'))
 
 class Mobile extends Component {
   state = {
@@ -30,80 +27,18 @@
   }
 
   render () {
-    // const {  } = this.state
-
     return (
-      <div className="mobile-container">
-        <div className="flex-container">
-          <div className="sub-title">Basic</div>
-          <Flex>
-            <Flex.Item><PlaceHolder /></Flex.Item>
-            <Flex.Item><PlaceHolder /></Flex.Item>
-          </Flex>
-          <WhiteSpace size="lg" />
-          <Flex>
-            <Flex.Item><PlaceHolder /></Flex.Item>
-            <Flex.Item><PlaceHolder /></Flex.Item>
-            <Flex.Item><PlaceHolder /></Flex.Item>
-          </Flex>
-          <WhiteSpace size="lg" />
-          <Flex>
-            <Flex.Item><PlaceHolder /></Flex.Item>
-            <Flex.Item><PlaceHolder /></Flex.Item>
-            <Flex.Item><PlaceHolder /></Flex.Item>
-            <Flex.Item><PlaceHolder /></Flex.Item>
-          </Flex>
-          <WhiteSpace size="lg" />
-
-          <div className="sub-title">Wrap</div>
-          <Flex wrap="wrap">
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-          </Flex>
-          <WhiteSpace size="lg" />
-
-          <div className="sub-title">Align</div>
-          <Flex justify="center">
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-          </Flex>
-          <WhiteSpace />
-          <Flex justify="end">
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-          </Flex>
-          <WhiteSpace />
-          <Flex justify="between">
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline" />
-          </Flex>
-
-          <WhiteSpace />
-          <Flex align="start">
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline small" />
-            <PlaceHolder className="inline" />
-          </Flex>
-          <WhiteSpace />
-          <Flex align="end">
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline small" />
-            <PlaceHolder className="inline" />
-          </Flex>
-          <WhiteSpace />
-          <Flex align="baseline">
-            <PlaceHolder className="inline" />
-            <PlaceHolder className="inline small" />
-            <PlaceHolder className="inline" />
-          </Flex>
+      <div className="mobile-view">
+        <Header />
+        <div className="mob-body">
+          <div className="mob-tool">
+          
+          </div>
+          <div className="mob-shell">
+            <div className="mob-shell-inner">
+              <Home />
+            </div>
+          </div>
         </div>
       </div>
     )
diff --git a/src/views/mobile/index.scss b/src/views/mobile/index.scss
index 10d6527..2e28ef6 100644
--- a/src/views/mobile/index.scss
+++ b/src/views/mobile/index.scss
@@ -1,4 +1,90 @@
-.mobile-container {
+.mobile-view {
+  background: #000;
+  .mob-body {
+    width: 100vw;
+    height: calc(100vh - 50px);
+    overflow: hidden;
+    position: relative;
+    background: #262626;
+
+    .mob-tool {
+      position: absolute;
+      left: 0;
+      top: 0;
+      height: 100%;
+      width: 40px;
+      background: #262626;
+      box-shadow: 2px 0px 2px #000;
+    }
+
+    .mob-shell {
+      width: 375px;
+      height: calc(100vh - 70px);
+      margin: 0 auto;
+      background: #ffffff url('../../assets/mobimg/mobile.png');
+      background-size: 100% 100%;
+      padding: 5vh 13px 6vh;
+      border-radius: 30px;
+
+      .mob-shell-inner {
+        width: 100%;
+        height: 100%;
+        overflow-y: auto;
+        overflow-x: hidden;
+        background-color: #f5f5f9;
+      }
+      .mob-shell-inner::-webkit-scrollbar {
+        width: 4px;
+      }
+      .mob-shell-inner::-webkit-scrollbar-thumb {
+        box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
+        background: rgba(0, 0, 0, 0.23);
+        border-radius: 5px;
+      }
+      .mob-shell-inner::-webkit-scrollbar-track {
+        box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
+        border: 1px solid rgba(0, 0, 0, 0.07);
+        background: rgba(0, 0, 0, 0);
+        border-radius: 3px;
+      }
+    }
+  }
+
+  .mob-home {
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+    > .am-tabs {
+      > .am-tabs-tab-bar-wrap {
+        .am-tabs-default-bar-underline {
+          display: none;
+        }
+      }
+      > .am-tabs-content-wrap {
+        > .am-tabs-pane-wrap {
+          .home-tab {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+          }
+        }
+        > .am-tabs-pane-wrap::-webkit-scrollbar {
+          width: 4px;
+        }
+        > .am-tabs-pane-wrap::-webkit-scrollbar-thumb {
+          box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
+          background: rgba(0, 0, 0, 0.13);
+          border-radius: 5px;
+        }
+        > .am-tabs-pane-wrap::-webkit-scrollbar-track {
+          box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
+          border: 1px solid rgba(0, 0, 0, 0.07);
+          background: rgba(0, 0, 0, 0);
+          border-radius: 3px;
+        }
+      }
+    }
+  }
   .flex-container {
     margin: 0 15px;
   }

--
Gitblit v1.8.0