From 269f0759a64927c2ea06a9d7de92ecfd0be7df5b Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期一, 13 七月 2020 10:00:04 +0800
Subject: [PATCH] 2020-07-13

---
 src/mob/components/login/mob-login-2/index.scss |  132 ++++++
 src/mob/modelsource/dragsource/index.scss       |    6 
 src/mob/controller/index.jsx                    |  169 ++++++++
 src/mob/modelsource/index.jsx                   |    4 
 src/assets/mobimg/mob-login2.png                |    0 
 src/templates/zshare/formconfig.jsx             |   14 
 src/mob/mobshell/index.jsx                      |   12 
 src/mob/components/login/mob-login-1/index.scss |   27 
 src/mob/controller/index.scss                   |   32 +
 src/mob/components/login/mob-login-1/index.jsx  |  225 +++++++++++
 src/locales/zh-CN/model.js                      |    1 
 /dev/null                                       |  187 ---------
 src/mob/components/login/mob-login-2/index.jsx  |  207 ++++++++++
 src/locales/en-US/model.js                      |    1 
 src/mob/modelsource/option.jsx                  |   15 
 src/views/mobdesign/index.scss                  |   24 
 src/views/mobmanage/index.scss                  |    6 
 src/mob/header/index.scss                       |    4 
 src/mob/contupdate/index.scss                   |    1 
 src/views/mobdesign/index.jsx                   |    9 
 src/mob/mobshell/card.jsx                       |    7 
 src/mob/mobshell/index.scss                     |    2 
 22 files changed, 828 insertions(+), 257 deletions(-)

diff --git a/src/assets/mobimg/mob-login2.png b/src/assets/mobimg/mob-login2.png
new file mode 100644
index 0000000..1ab9edf
--- /dev/null
+++ b/src/assets/mobimg/mob-login2.png
Binary files differ
diff --git a/src/locales/en-US/model.js b/src/locales/en-US/model.js
index ee775a7..61da219 100644
--- a/src/locales/en-US/model.js
+++ b/src/locales/en-US/model.js
@@ -131,6 +131,7 @@
   'model.form.multiselect': 'Multi-select',
   'model.form.href': 'Link',
   'model.form.link': 'Linkage menu',
+  'model.form.linkform': 'Linkage form',
   'model.form.dateday': 'Date(Day)',
   'model.form.datetime': 'Date(Second)',
   'model.form.dateweek': 'Date(Week)',
diff --git a/src/locales/zh-CN/model.js b/src/locales/zh-CN/model.js
index 953d2cd..f3fb78e 100644
--- a/src/locales/zh-CN/model.js
+++ b/src/locales/zh-CN/model.js
@@ -131,6 +131,7 @@
   'model.form.multiselect': '涓嬫媺澶氶��',
   'model.form.href': '閾炬帴',
   'model.form.link': '鑱斿姩鑿滃崟',
+  'model.form.linkform': '鍏宠仈琛ㄥ崟',
   'model.form.dateday': '鏃ユ湡锛堝ぉ锛�',
   'model.form.datetime': '鏃ユ湡锛堢锛�',
   'model.form.dateweek': '鏃ユ湡锛堝懆锛�',
diff --git a/src/mob/components/login/mob-login-1/index.jsx b/src/mob/components/login/mob-login-1/index.jsx
new file mode 100644
index 0000000..bc7aed8
--- /dev/null
+++ b/src/mob/components/login/mob-login-1/index.jsx
@@ -0,0 +1,225 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { InputItem, Icon, Checkbox, List, Button } from 'antd-mobile'
+import { createForm } from 'rc-form'
+
+import zhCN from '@/locales/zh-CN/mob.js'
+import enUS from '@/locales/en-US/mob.js'
+import Utils from '@/utils/utils.js'
+import ContentUpdate from '@/mob/contupdate'
+import mklogo from '@/assets/mobimg/mklogo.png'
+import './index.scss'
+
+const CheckboxItem = Checkbox.CheckboxItem
+
+class MobLogin extends Component {
+  static propTpyes = {
+    card: PropTypes.object,
+    editId: PropTypes.any,
+    triggerEdit: PropTypes.func,
+    updateConfig: PropTypes.func,
+    onDoubleClick: PropTypes.func
+  }
+
+  state = {
+    dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
+    rember: true,
+    param: {
+      type: 'login',
+      subtype: 'mob-login-1',
+      box: { uuid: Utils.getuuid(), eleType: 'box', style: {color: '#ffffff', backgroundImage: 'linear-gradient(#378DBE, #46C29E, #48A9D6)'}},
+      logo: { uuid: Utils.getuuid(), eleType: 'img', content: mklogo, style: {} },
+      title: { uuid: Utils.getuuid(), eleType: 'text', content: '鏄庣鍟嗕笟鏅鸿兘寮�鏀惧钩鍙�', style: {fontSize: '20px', fontWeight: 'bold', color: '#ffffff', textAlign: 'center', marginTop: '15px', marginBottom: '30px'}},
+      login: { uuid: Utils.getuuid(), eleType: 'button', content: '鐧诲綍', style: {fontSize: '18px', color: '#ffffff', textAlign: 'center', lineHeight: 2.4, borderRadius: '25px'}},
+      copyright: { uuid: Utils.getuuid(), eleType: 'textarea', content: 'Copyright漏2017  鎵�鏈夌浉鍏崇増鏉冨綊  鍖椾含鏄庣鏅崕淇℃伅鎶�鏈湁闄愬叕鍙�', style: {fontSize: '12px', color: '#ffffff', textAlign: 'center'} }
+    }
+  }
+
+  UNSAFE_componentWillMount () {
+    const { card } = this.props
+    const { param } = this.state
+
+    if (!card.box) {
+      this.props.updateConfig({...param, ...card})
+    }
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  onChange = (e) => {
+    const { rember } = this.state
+    e.stopPropagation()
+
+    this.setState({
+      rember: !rember
+    })
+  }
+
+  onChangeLang = (value) => {
+    this.setState({
+      lang: value
+    })
+  }
+
+  editLogo = (e) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      ...fromJS(card.logo.style).toJS(),
+      componentId: card.uuid,
+      uuid: card.logo.uuid,
+      items: ['margin']
+    }
+    this.props.triggerEdit(element)
+  }
+
+  editTitle = (e) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      ...fromJS(card.title.style).toJS(),
+      componentId: card.uuid,
+      uuid: card.title.uuid,
+      items: ['font', 'margin'],
+    }
+    this.props.triggerEdit(element)
+  }
+
+  editMsg = (e) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      ...fromJS(card.copyright.style).toJS(),
+      componentId: card.uuid,
+      uuid: card.copyright.uuid,
+      items: ['font'],
+    }
+    this.props.triggerEdit(element)
+  }
+
+  editLogin = (e) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      ...fromJS(card.login.style).toJS(),
+      componentId: card.uuid,
+      uuid: card.login.uuid,
+      items: ['font', 'background', 'border']
+    }
+    this.props.triggerEdit(element)
+  }
+
+  editBox = (e) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      ...fromJS(card.box.style).toJS(),
+      componentId: card.uuid,
+      uuid: card.box.uuid,
+      items: ['font', 'padding', 'background'],
+    }
+    this.props.triggerEdit(element)
+  }
+
+  updateContent = (card) => {
+    Object.keys(card).forEach(key => {
+      if (card[key] === null) {
+        delete card[key]
+      }
+    })
+    this.props.updateConfig(card)
+  }
+
+  render () {
+    const { card, editId } = this.props
+    const { getFieldProps } = this.props.form
+    const { rember } = this.state
+
+    if (!card.box) return null
+
+    let logoStyle = card.logo && card.logo.style ? fromJS(card.logo.style).toJS() : null
+    if (logoStyle && logoStyle.marginTop && /vh$/ig.test(logoStyle.marginTop)) {
+      let percent = parseInt(logoStyle.marginTop)
+      logoStyle.marginTop = `calc(${(percent / 100) * 615}px)`
+    }
+    if (logoStyle && logoStyle.marginBottom && /vh$/ig.test(logoStyle.marginBottom)) {
+      let percent = parseInt(logoStyle.marginBottom)
+      logoStyle.marginBottom = `calc(${(percent / 100) * 625}px)`
+    }
+
+    let titleStyle = card.title && card.title.style ? fromJS(card.title.style).toJS() : null
+    if (titleStyle && titleStyle.marginTop && /vh$/ig.test(titleStyle.marginTop)) {
+      let percent = parseInt(titleStyle.marginTop)
+      titleStyle.marginTop = `calc(${(percent / 100) * 615}px)`
+    }
+    if (titleStyle && titleStyle.marginBottom && /vh$/ig.test(titleStyle.marginBottom)) {
+      let percent = parseInt(titleStyle.marginBottom)
+      titleStyle.marginBottom = `calc(${(percent / 100) * 615}px)`
+    }
+
+    return (
+      <div className="mob-login-1" onClick={this.editBox} style={card.box.style}>
+        <div className="mob-login-body">
+          {card.logo ? <div className={'logo ' + (editId === card.logo.uuid ? 'editing' : '')} style={logoStyle} onClick={this.editLogo}>
+            <ContentUpdate element={card.logo} updateContent={(ele) => this.updateContent({...card, logo: ele})}/>
+            <img src={card.logo.content} alt=""/>
+          </div> : null}
+          {card.title ? <div className={'plat-name ' + (editId === card.title.uuid ? 'editing' : '')} style={titleStyle} onClick={this.editTitle}>
+            <ContentUpdate element={card.title} updateContent={(ele) => this.updateContent({...card, title: ele})}/>
+            {card.title.content}
+          </div> : null}
+          <InputItem
+            placeholder="UserName"
+            prefixListCls="mk-login-item am-list"
+            {...getFieldProps('userName', {
+              initialValue: 'admin',
+            })}
+            disabled={true}
+          >
+            <Icon type="check-circle-o" />
+          </InputItem>
+          <InputItem
+            placeholder="Password"
+            prefixListCls="mk-login-item am-list"
+            {...getFieldProps('password', {
+              initialValue: '123456',
+            })}
+            type={'password'}
+            disabled={true}
+          >
+            <Icon type="check-circle" />
+          </InputItem>
+          <div className="other-setting">
+            <CheckboxItem checked={rember} onChange={this.onChange}>
+              <span onClick={this.onChange}>璁颁綇瀵嗙爜</span>
+            </CheckboxItem>
+            {/* <Picker data={langs} value={lang} cols={1} onChange={this.onChangeLang} className="forss">
+              <List.Item>{lang}</List.Item>
+            </Picker> */}
+            <List.Item className="lang">涓枃绠�浣�</List.Item>
+            <div className="clear-both"></div>
+          </div>
+          <Button 
+            type="primary"
+            className={'login ' + (editId === card.login.uuid ? 'editing' : '')} 
+            onDoubleClick={() => this.props.doubleClickCard(card.login)}
+            style={card.login.style}
+            onClick={this.editLogin}
+          >
+            <ContentUpdate element={card.login} deletable={false} updateContent={(ele) => this.updateContent({...card, login: ele})}/>
+            {card.login.content}
+          </Button>
+        </div>
+        {card.copyright ? <div className={'company-msg ' + (editId === card.copyright.uuid ? 'editing' : '')} style={card.copyright.style} onClick={this.editMsg}>
+          <ContentUpdate element={card.copyright} updateContent={(ele) => this.updateContent({...card, copyright: ele})}/>
+          {card.copyright.content}
+        </div> : null}
+      </div>
+    )
+  }
+}
+
+export default createForm()(MobLogin)
\ No newline at end of file
diff --git a/src/mob/login/index.scss b/src/mob/components/login/mob-login-1/index.scss
similarity index 90%
rename from src/mob/login/index.scss
rename to src/mob/components/login/mob-login-1/index.scss
index 89b6cdd..1648d5e 100644
--- a/src/mob/login/index.scss
+++ b/src/mob/components/login/mob-login-1/index.scss
@@ -1,13 +1,17 @@
-.mob-login {
+.mob-login-1 {
   position: relative;
   width: 100%;
-  height: 100%;
-  overflow: hidden;
-  // background-image: linear-gradient(#378DBE, #46C29E, #48A9D6);
+  min-height: 100%;
+  overflow-x: hidden;
   background-repeat: no-repeat;
   background-size: cover;
   background-position: center center;
 
+  .mob-login-body {
+    min-height: calc((80 / 100) * 615px);
+    border-top: 1px solid transparent;
+    margin-bottom: 20px;
+  }
 
   .logo {
     position: relative;
@@ -19,6 +23,7 @@
     text-align: center;
     line-height: 1.5;
     border: 1px dotted transparent;
+    margin-top: calc((17 / 100) * 615px);
     img {
       max-width: 100%;
     }
@@ -52,10 +57,6 @@
   }
   .plat-name:not(.editing):hover {
     border-color: #535353;
-  }
-
-  .plat-name + .mk-login-item.am-list-item, .logo + .mk-login-item.am-list-item {
-    margin-top: 30px;
   }
 
   .mk-login-item.am-list-item {
@@ -145,13 +146,12 @@
       }
     }
   }
-  >.am-button {
+  .am-button {
     position: relative;
     z-index: 1;
     width: 245px;
     max-width: 270px;
     margin: 0 auto;
-    border-radius: 30px;
     border: 1px dotted transparent;
     overflow: visible;
     letter-spacing: 0px;
@@ -164,17 +164,14 @@
       font-weight: inherit;
     }
   }
-  >.am-button:hover {
+  .am-button:hover {
     color: #fff;
     border-color: #535353;
   }
   .company-msg {
-    position: absolute;
     width: 88%;
     min-height: 10px;
-    bottom: 20px;
-    bottom: 20px;
-    left: 6%;
+    margin-left: 6%;
     font-size: 12px;
     color: #fafafa;
     text-align: center;
diff --git a/src/mob/components/login/mob-login-2/index.jsx b/src/mob/components/login/mob-login-2/index.jsx
new file mode 100644
index 0000000..d9a4653
--- /dev/null
+++ b/src/mob/components/login/mob-login-2/index.jsx
@@ -0,0 +1,207 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { InputItem, Button } from 'antd-mobile'
+
+import zhCN from '@/locales/zh-CN/mob.js'
+import enUS from '@/locales/en-US/mob.js'
+import Utils from '@/utils/utils.js'
+import ContentUpdate from '@/mob/contupdate'
+import './index.scss'
+
+class MobLogin2 extends Component {
+  static propTpyes = {
+    card: PropTypes.object,
+    editId: PropTypes.any,
+    triggerEdit: PropTypes.func,
+    updateConfig: PropTypes.func,
+    onDoubleClick: PropTypes.func
+  }
+
+  state = {
+    dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
+    view: 'account',
+    param: {
+      type: 'login',
+      subtype: 'mob-login-2',
+      box: { uuid: Utils.getuuid(), eleType: 'box', style: {}},
+      title: { uuid: Utils.getuuid(), eleType: 'text', content: '鐧诲綍', style: {fontSize: '18px', fontWeight: 'bold', color: '#000000', textAlign: 'center', marginTop: '10vh', marginBottom: '10vh'}},
+      user: { uuid: Utils.getuuid(), eleType: 'input', content: '閭/鎵嬫満', style: {}},
+      password: { uuid: Utils.getuuid(), eleType: 'input', content: '瀵嗙爜', style: {}},
+      login: { uuid: Utils.getuuid(), eleType: 'button', content: '鐧诲綍', style: {fontSize: '16px', color: '#ffffff', textAlign: 'center', lineHeight: 2.4, backgroundColor: '#44a8f2'}},
+      phone: { uuid: Utils.getuuid(), eleType: 'button', content: '鎵嬫満鐭俊鐧诲綍/娉ㄥ唽', style: {fontSize: '16px', color: '#44a8f2', textAlign: 'center', lineHeight: 2.4, border: '1px solid #44a8f2'}},
+      lose: { uuid: Utils.getuuid(), eleType: 'text', content: '蹇樿瀵嗙爜锛�', style: {fontSize: '12px', color: '#44a8f2', textAlign: 'right', textDecoration: 'underline'}},
+      register: { uuid: Utils.getuuid(), eleType: 'text', content: '娉ㄥ唽鏄庣璐﹀彿', style: {fontSize: '16px', color: '#44a8f2', textAlign: 'center', marginTop: '20px', marginBottom: '30px'}},
+      copyright: { uuid: Utils.getuuid(), eleType: 'textarea', content: 'Copyright漏2017  鎵�鏈夌浉鍏崇増鏉冨綊  鍖椾含鏄庣鏅崕淇℃伅鎶�鏈湁闄愬叕鍙�', style: {fontSize: '12px', textAlign: 'center'} }
+    }
+  }
+
+  UNSAFE_componentWillMount () {
+    const { card } = this.props
+    const { param } = this.state
+
+    if (!card.box) {
+      this.props.updateConfig({...param, ...card})
+    }
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  editTitle = (e) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      ...fromJS(card.title.style).toJS(),
+      componentId: card.uuid,
+      uuid: card.title.uuid,
+      items: ['font', 'margin'],
+    }
+    this.props.triggerEdit(element)
+  }
+
+  editPlaceholder = (e, type) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      componentId: card.uuid,
+      uuid: card[type].uuid,
+      items: [''],
+    }
+    this.props.triggerEdit(element)
+  }
+
+  editMsg = (e) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      ...fromJS(card.copyright.style).toJS(),
+      componentId: card.uuid,
+      uuid: card.copyright.uuid,
+      items: ['font'],
+    }
+    this.props.triggerEdit(element)
+  }
+
+  editLogin = (e, type) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      ...fromJS(card[type].style).toJS(),
+      componentId: card.uuid,
+      uuid: card[type].uuid,
+      items: ['font', 'background', 'border']
+    }
+    this.props.triggerEdit(element)
+  }
+
+  editLose = (e) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      ...fromJS(card.lose.style).toJS(),
+      componentId: card.uuid,
+      uuid: card.lose.uuid,
+      items: ['font'],
+    }
+    this.props.triggerEdit(element)
+  }
+
+  editRegister = (e) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      ...fromJS(card.register.style).toJS(),
+      componentId: card.uuid,
+      uuid: card.register.uuid,
+      items: ['font', 'margin'],
+    }
+    this.props.triggerEdit(element)
+  }
+
+  editBox = (e) => {
+    const { card } = this.props
+    e.stopPropagation()
+    let element = {
+      ...fromJS(card.box.style).toJS(),
+      componentId: card.uuid,
+      uuid: card.box.uuid,
+      items: ['font', 'padding', 'background'],
+    }
+    this.props.triggerEdit(element)
+  }
+
+  updateContent = (card) => {
+    this.props.updateConfig(card)
+  }
+
+  render () {
+    const { card, editId } = this.props
+    const { view } = this.state
+
+    if (!card.box) return null
+
+    let titleStyle = card.title && card.title.style ? fromJS(card.title.style).toJS() : null
+    if (titleStyle && titleStyle.marginTop && /vh$/ig.test(titleStyle.marginTop)) {
+      let percent = parseInt(titleStyle.marginTop)
+      titleStyle.marginTop = `calc(${(percent / 100) * 615}px)`
+    }
+    if (titleStyle && titleStyle.marginBottom && /vh$/ig.test(titleStyle.marginBottom)) {
+      let percent = parseInt(titleStyle.marginBottom)
+      titleStyle.marginBottom = `calc(${(percent / 100) * 615}px)`
+    }
+
+    if (view === 'account') return (
+      <div className="mob-login-2" onClick={this.editBox} style={card.box.style}>
+        <div className="mob-login-body">
+          {card.title ? <div className={'plat-name ' + (editId === card.title.uuid ? 'editing' : '')} style={card.title.style} onClick={this.editTitle}>
+            <ContentUpdate element={card.title} updateContent={(ele) => this.updateContent({...card, title: ele})}/>
+            {card.title.content}
+          </div> : null}
+          
+          <div className={`mk-login-input ${editId === card.user.uuid ? 'editing' : ''}`} onClick={(e) => this.editPlaceholder(e, 'user')}>
+            <ContentUpdate element={card.user} deletable={false} updateContent={(ele) => this.updateContent({...card, user: ele})}/>
+            <InputItem placeholder={card.user.content}></InputItem>
+          </div>
+          <div className={`mk-login-input ${editId === card.password.uuid ? 'editing' : ''}`} onClick={(e) => this.editPlaceholder(e, 'password')}>
+            <ContentUpdate element={card.password} deletable={false} updateContent={(ele) => this.updateContent({...card, password: ele})}/>
+            <InputItem placeholder={card.password.content}></InputItem>
+          </div>
+          <Button 
+            className={'login ' + (editId === card.login.uuid ? 'editing' : '')} 
+            onDoubleClick={() => this.props.doubleClickCard(card.login)}
+            style={card.login.style}
+            onClick={(e) => this.editLogin(e, 'login')}
+          >
+            <ContentUpdate element={card.login} deletable={false} updateContent={(ele) => this.updateContent({...card, login: ele})}/>
+            {card.login.content}
+          </Button>
+          <Button 
+            className={'login ' + (editId === card.phone.uuid ? 'editing' : '')} 
+            onDoubleClick={() => this.props.doubleClickCard(card.phone)}
+            style={card.phone.style}
+            onClick={(e) => this.editLogin(e, 'phone')}
+          >
+            <ContentUpdate element={card.phone} deletable={false} updateContent={(ele) => this.updateContent({...card, phone: ele})}/>
+            {card.phone.content}
+          </Button>
+          {card.lose ? <div className={'plat-name ' + (editId === card.lose.uuid ? 'editing' : '')} style={card.lose.style} onClick={this.editLose}>
+            <ContentUpdate element={card.lose} updateContent={(ele) => this.updateContent({...card, lose: ele})}/>
+            {card.lose.content}
+          </div> : null}
+          {card.register ? <div className={'plat-name ' + (editId === card.register.uuid ? 'editing' : '')} style={card.register.style} onClick={this.editRegister}>
+            <ContentUpdate element={card.register} updateContent={(ele) => this.updateContent({...card, register: ele})}/>
+            {card.register.content}
+          </div> : null}
+        </div>
+        {card.copyright ? <div className={'company-msg ' + (editId === card.copyright.uuid ? 'editing' : '')} style={card.copyright.style} onClick={this.editMsg}>
+          <ContentUpdate element={card.copyright} updateContent={(ele) => this.updateContent({...card, copyright: ele})}/>
+          {card.copyright.content}
+        </div> : null}
+      </div>
+    )
+  }
+}
+
+export default MobLogin2
\ No newline at end of file
diff --git a/src/mob/components/login/mob-login-2/index.scss b/src/mob/components/login/mob-login-2/index.scss
new file mode 100644
index 0000000..a833946
--- /dev/null
+++ b/src/mob/components/login/mob-login-2/index.scss
@@ -0,0 +1,132 @@
+.mob-login-2 {
+  position: relative;
+  width: 100%;
+  min-height: 100%;
+  overflow-x: hidden;
+  background-repeat: no-repeat;
+  background-size: cover;
+  background-position: center center;
+
+  .mob-login-body {
+    min-height: calc((80 / 100) * 615px);
+    border-top: 1px solid transparent;
+    border-bottom: 1px solid transparent;
+    margin-bottom: 10px;
+  }
+
+  .plat-name {
+    position: relative;
+    max-width: 280px;
+    min-height: 10px;
+    margin: 0 auto;
+    text-align: center;
+    line-height: 1.5;
+    font-size: 18px;
+    color: #ffffff;
+    border: 1px dotted transparent;
+  }
+  .plat-name.editing {
+    border: 1px solid #1890ff;
+    box-shadow: 0px 0px 2px #1890ff;
+  }
+  .plat-name:not(.editing):hover {
+    border-color: #535353;
+  }
+
+  .am-list-item {
+    position: relative;
+    z-index: 1;
+    width: 100%;
+    font-size: 14px;
+    height: 38px;
+    min-height: 38px;
+    line-height: 1.5;
+    margin-bottom: 10px;
+    border: 1px solid #dddddd;
+
+    .am-input-label {
+      width: 30px;
+      color: inherit;
+      padding-top: 10px;
+    }
+    input {
+      font-size: 14px;
+      color: inherit;
+    }
+    input::-webkit-input-placeholder {
+      color: inherit;
+      opacity: 0.5;
+    }
+    input:-moz-placeholder {
+      color: inherit;
+      opacity: 0.5;
+    }
+    input::-moz-placeholder {
+      color: inherit;
+      opacity: 0.5;
+    }
+    input:-ms-input-placeholder {
+      color: inherit;
+      opacity: 0.5;
+    }
+  }
+  .am-list-item:not(:last-child) .am-list-line {
+    border: none;
+  }
+
+  .mk-login-input {
+    width: 280px;
+    position: relative;
+    margin: 0 auto;
+  }
+  
+  .am-button {
+    position: relative;
+    z-index: 1;
+    width: 280px;
+    margin: 0 auto 10px;
+    border: 1px dotted transparent;
+    overflow: visible;
+    letter-spacing: 0px;
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center center;
+    border-radius: 0;
+    
+    span {
+      font-style: inherit;
+      font-weight: inherit;
+    }
+  }
+  .am-button:hover {
+    color: unset;
+    border-color: #535353;
+  }
+  .company-msg {
+    width: 88%;
+    min-height: 10px;
+    margin-left: 6%;
+    font-size: 12px;
+    text-align: center;
+    line-height: 1.5;
+    letter-spacing: 0px;
+    border: 1px dotted transparent;
+  }
+  .company-msg.editing {
+    border: 1px solid #1890ff;
+    box-shadow: 0px 0px 2px #1890ff;
+  }
+  .company-msg:not(.editing):hover {
+    border-color: #535353;
+  }
+}
+.am-picker-popup-wrap {
+  left: calc(50vw - 305px);
+  right: calc(50vw - 45px);
+  bottom: 54px;
+  overflow: hidden;
+}
+.clear-both {
+  float: none!important;
+  clear: both;
+}
\ No newline at end of file
diff --git a/src/mob/controller/index.jsx b/src/mob/controller/index.jsx
index c6f5e17..6e822f7 100644
--- a/src/mob/controller/index.jsx
+++ b/src/mob/controller/index.jsx
@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Collapse, Form, Input, Col, Icon, InputNumber, Select, Radio } from 'antd'
+import { Collapse, Form, Input, Col, Icon, InputNumber, Select, Radio, Popover, Menu } from 'antd'
 
 import zhCN from '@/locales/zh-CN/mob.js'
 import enUS from '@/locales/en-US/mob.js'
@@ -23,7 +23,11 @@
     card: null,
     fontColor: '#000000',
     backgroundColor: '#ffffff',
-    bgimages: []
+    bgimages: [],
+    marginTop: '',
+    marginTopVal: '',
+    marginBottom: '',
+    marginBottomVal: '',
   }
 
   UNSAFE_componentWillReceiveProps (nextProps) {
@@ -48,6 +52,10 @@
           fontColor: _card.color || '#000000',
           backgroundColor: _card.backgroundColor || '#ffffff',
           backgroundImage: bgImg,
+          marginTop: _card.marginTop ? _card.marginTop : '',
+          marginTopVal: _card.marginTop ? parseInt(_card.marginTop) : '',
+          marginBottom: _card.marginBottom ? _card.marginBottom : '',
+          marginBottomVal: _card.marginBottomVal ? parseInt(_card.marginBottomVal) : ''
         })
       })
     }
@@ -205,8 +213,71 @@
     this.props.updateStyle({componentId: card.componentId, uuid: card.uuid, style: {backgroundImage: val}})
   }
 
+  submitBorder = (val, type) => {
+    const { card } = this.state
+
+    this.props.updateStyle({componentId: card.componentId, uuid: card.uuid, style: {[type]: val}})
+  }
+
+  changeBorderRadius = (val) => {
+    const { card } = this.state
+    let value = parseFloat(val)
+
+    if (isNaN(value) || value < 0 || value > 500) return
+
+    this.props.updateStyle({componentId: card.componentId, uuid: card.uuid, style: {borderRadius: `${value}px`}})
+  }
+
+  changeMarginTop = (e) => {
+    let val = e.target.value
+    let _val = parseInt(val)
+
+    this.setState({
+      marginTop: val
+    })
+
+    if (isNaN(_val)) return
+
+    this.setState({
+      marginTopVal: _val
+    })
+  }
+
+  submitMarginTop = (val) => {
+    const { card } = this.state
+
+    this.props.updateStyle({componentId: card.componentId, uuid: card.uuid, style: {marginTop: val}})
+    this.setState({
+      marginTop: val
+    })
+  }
+
+  changeMarginBottom = (e) => {
+    let val = e.target.value
+    let _val = parseInt(val)
+
+    this.setState({
+      marginBottom: val
+    })
+
+    if (isNaN(_val)) return
+
+    this.setState({
+      marginBottomVal: _val
+    })
+  }
+
+  submitMarginBottom = (val) => {
+    const { card } = this.state
+
+    this.props.updateStyle({componentId: card.componentId, uuid: card.uuid, style: {marginBottom: val}})
+    this.setState({
+      marginBottom: val
+    })
+  }
+
   render () {
-    const { card, fontColor, backgroundColor, backgroundImage, bgimages } = this.state
+    const { card, fontColor, backgroundColor, backgroundImage, bgimages, marginTop, marginTopVal, marginBottom, marginBottomVal } = this.state
     const formItemLayout = {
       labelCol: {
         xs: { span: 24 },
@@ -331,15 +402,95 @@
               </Col>
             </Panel> : null}
             {card.items.includes('border') ? <Panel header="杈规" key="border">
-              <Col span={12}>
-                <Form.Item colon={false} label={<Icon title="瀛椾綋澶у皬" type="font-size" />}>
-                  <InputNumber defaultValue={card.fontSize || 14} min={12} max={100} precision={0} onChange={this.changeFontSize} />
+              <Col span={24}>
+                <Form.Item
+                  colon={false}
+                  label={<Icon title="澶栬竟妗�" type="border-outer" />}
+                  labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
+                >
+                  <Input placeholder="" defaultValue={card.border || ''} autoComplete="off" onBlur={(e) => this.submitBorder(e.target.value, 'border')} onPressEnter={(e) => this.submitBorder(e.target.value, 'border')}/>
+                </Form.Item>
+              </Col>
+              <Col span={24}>
+                <Form.Item
+                  colon={false}
+                  label={<Icon title="宸﹁竟妗�" type="border-left" />}
+                  labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
+                >
+                  <Input placeholder="" defaultValue={card.borderLeft || ''} autoComplete="off" onBlur={(e) => this.submitBorder(e.target.value, 'borderLeft')} onPressEnter={(e) => this.submitBorder(e.target.value, 'borderLeft')}/>
+                </Form.Item>
+              </Col>
+              <Col span={24}>
+                <Form.Item
+                  colon={false}
+                  label={<Icon title="鍙宠竟妗�" type="border-right" />}
+                  labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
+                >
+                  <Input placeholder="" defaultValue={card.borderRight || ''} autoComplete="off" onBlur={(e) => this.submitBorder(e.target.value, 'borderRight')} onPressEnter={(e) => this.submitBorder(e.target.value, 'borderRight')}/>
+                </Form.Item>
+              </Col>
+              <Col span={24}>
+                <Form.Item
+                  colon={false}
+                  label={<Icon title="涓婅竟妗�" type="border-top" />}
+                  labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
+                >
+                  <Input placeholder="" defaultValue={card.borderTop || ''} autoComplete="off" onBlur={(e) => this.submitBorder(e.target.value, 'borderTop')} onPressEnter={(e) => this.submitBorder(e.target.value, 'borderTop')}/>
+                </Form.Item>
+              </Col>
+              <Col span={24}>
+                <Form.Item
+                  colon={false}
+                  label={<Icon title="涓嬭竟妗�" type="border-bottom" />}
+                  labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
+                >
+                  <Input placeholder="" defaultValue={card.borderBottom || ''} autoComplete="off" onBlur={(e) => this.submitBorder(e.target.value, 'borderBottom')} onPressEnter={(e) => this.submitBorder(e.target.value, 'borderBottom')}/>
+                </Form.Item>
+              </Col>
+              <Col span={24}>
+                <Form.Item
+                  colon={false}
+                  label={<Icon title="鍦嗚" type="radius-setting" />}
+                  labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
+                >
+                  <InputNumber defaultValue={card.borderRadius || 0} min={0} max={500} precision={0} onChange={this.changeBorderRadius}/>
                 </Form.Item>
               </Col>
             </Panel> : null}
-            <Panel header="鍏朵粬" key="3">
-              鍏朵粬
-            </Panel>
+            {card.items.includes('margin') ? <Panel header="澶栬竟璺�" key="margin">
+              <Col span={12}>
+                <Form.Item
+                  colon={false}
+                  label={<Icon title="涓婅竟璺�" type="vertical-align-top"/>}
+                >
+                  <Popover placement="bottom" overlayClassName="margin-popover" content={
+                    marginTopVal !== '' ?
+                    <Menu>
+                      <Menu.Item onClick={() => this.submitMarginTop(`${marginTopVal}px`)}>{marginTopVal} px</Menu.Item>
+                      <Menu.Item onClick={() => this.submitMarginTop(`${marginTopVal}vh`)}>{marginTopVal} vh</Menu.Item>
+                    </Menu> : null
+                  } trigger="hover">
+                    <Input value={marginTop} onChange={this.changeMarginTop}/>
+                  </Popover>
+                </Form.Item>
+              </Col>
+              <Col span={12}>
+                <Form.Item
+                  colon={false}
+                  label={<Icon title="涓嬭竟璺�" type="vertical-align-bottom"/>}
+                >
+                  <Popover placement="bottom" overlayClassName="margin-popover" content={
+                    marginBottomVal !== '' ?
+                    <Menu>
+                      <Menu.Item onClick={() => this.submitMarginBottom(`${marginBottomVal}px`)}>{marginBottomVal} px</Menu.Item>
+                      <Menu.Item onClick={() => this.submitMarginBottom(`${marginBottomVal}vh`)}>{marginBottomVal} vh</Menu.Item>
+                    </Menu> : null
+                  } trigger="hover">
+                    <Input value={marginBottom} onChange={this.changeMarginBottom}/>
+                  </Popover>
+                </Form.Item>
+              </Col>
+            </Panel> : null}
           </Collapse> : null}
         </Form>
       </div>
diff --git a/src/mob/controller/index.scss b/src/mob/controller/index.scss
index 6b87772..6acbf69 100644
--- a/src/mob/controller/index.scss
+++ b/src/mob/controller/index.scss
@@ -17,7 +17,9 @@
         color: rgba(255, 255, 255, 0.85);
         background-color: #202735;
         border-top: 1px solid #202735;
-
+        .ant-input-number {
+          width: 100%;
+        }
         .ant-form-item {
           margin-bottom: 5px;
 
@@ -114,4 +116,32 @@
       }
     }
   }
+}
+
+.margin-popover {
+  padding-top: 0px;
+  .ant-popover-inner-content {
+    width: 90px;
+    padding: 0px 5px;
+    .ant-menu-root.ant-menu-vertical {
+      border: 0;
+      .ant-menu-item {
+        height: 30px;
+        cursor: pointer;
+        line-height: 30px;
+      }
+      .ant-menu-item:not(:last-child) {
+        margin-bottom: 0px;
+      }
+      .ant-menu-item:first-child {
+        margin-top: 10px;
+      }
+      .ant-menu-item:last-child {
+        margin-bottom: 10px;
+      }
+    }
+  }
+  .ant-popover-arrow {
+    display: none;
+  }
 }
\ No newline at end of file
diff --git a/src/mob/contupdate/index.scss b/src/mob/contupdate/index.scss
index 465e2a5..7e15ba9 100644
--- a/src/mob/contupdate/index.scss
+++ b/src/mob/contupdate/index.scss
@@ -7,6 +7,7 @@
   font-size: 14px;
   display: none;
   line-height: 1.5;
+  z-index: 1;
 
   i {
     padding: 2px 5px;
diff --git a/src/mob/header/index.scss b/src/mob/header/index.scss
index f6a1e0e..a71158f 100644
--- a/src/mob/header/index.scss
+++ b/src/mob/header/index.scss
@@ -1,7 +1,11 @@
 .mob-header-container {
   width: 100%;
   height: 48px;
+  padding-right: 320px;
   color: rgba(255, 255, 255, 0.65);
+  position: fixed;
+  top: 0px;
+  z-index: 10;
   
   background: #001529;
   border-bottom: 1px solid #000;
diff --git a/src/mob/login/index.jsx b/src/mob/login/index.jsx
deleted file mode 100644
index 152a2d9..0000000
--- a/src/mob/login/index.jsx
+++ /dev/null
@@ -1,187 +0,0 @@
-import React, {Component} from 'react'
-import PropTypes from 'prop-types'
-import { is, fromJS } from 'immutable'
-import { InputItem, Icon, Checkbox, List, Button } from 'antd-mobile'
-import { createForm } from 'rc-form'
-
-import zhCN from '@/locales/zh-CN/mob.js'
-import enUS from '@/locales/en-US/mob.js'
-import ContentUpdate from '@/mob/contupdate'
-import './index.scss'
-
-const CheckboxItem = Checkbox.CheckboxItem
-// const PlaceHolder = ({ active = false, children}) => (
-//   <div>{active ? <div></div> : null}{children}</div>
-// )
-
-class MobLogin extends Component {
-  static propTpyes = {
-    card: PropTypes.object,
-    editId: PropTypes.any,
-    triggerEdit: PropTypes.func,
-    updateConfig: PropTypes.func,
-    onDoubleClick: PropTypes.func
-  }
-
-  state = {
-    dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
-    rember: true,
-    param: {
-      background: {color: '#000000', image: ''},
-      logo: {width: ''}
-    }
-  }
-
-  UNSAFE_componentWillMount () {
-
-  }
-
-  shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
-  }
-
-  onChange = (e) => {
-    const { rember } = this.state
-    e.stopPropagation()
-
-    this.setState({
-      rember: !rember
-    })
-  }
-
-  onChangeLang = (value) => {
-    this.setState({
-      lang: value
-    })
-  }
-
-  editLogo = (e) => {
-    const { card } = this.props
-    e.stopPropagation()
-    let element = {
-      ...fromJS(card.logo.style).toJS(),
-      componentId: card.uuid,
-      uuid: card.logo.uuid,
-      items: []
-    }
-    this.props.triggerEdit(element)
-  }
-
-  editTitle = (e) => {
-    const { card } = this.props
-    e.stopPropagation()
-    let element = {
-      ...fromJS(card.title.style).toJS(),
-      componentId: card.uuid,
-      uuid: card.title.uuid,
-      items: ['font'],
-    }
-    this.props.triggerEdit(element)
-  }
-
-  editMsg = (e) => {
-    const { card } = this.props
-    e.stopPropagation()
-    let element = {
-      ...fromJS(card.copyright.style).toJS(),
-      componentId: card.uuid,
-      uuid: card.copyright.uuid,
-      items: ['font'],
-    }
-    this.props.triggerEdit(element)
-  }
-
-  editLogin = (e) => {
-    const { card } = this.props
-    e.stopPropagation()
-    let element = {
-      ...fromJS(card.login.style).toJS(),
-      componentId: card.uuid,
-      uuid: card.login.uuid,
-      items: ['font', 'background']
-    }
-    this.props.triggerEdit(element)
-  }
-
-  editBox = (e) => {
-    const { card } = this.props
-    e.stopPropagation()
-    let element = {
-      ...fromJS(card.box.style).toJS(),
-      componentId: card.uuid,
-      uuid: card.box.uuid,
-      items: ['font', 'padding', 'background'],
-    }
-    this.props.triggerEdit(element)
-  }
-
-  updateContent = (card) => {
-    this.props.updateConfig(card)
-  }
-
-  render () {
-    const { card, editId } = this.props
-    const { getFieldProps } = this.props.form
-    const { rember } = this.state
-
-    return (
-      <div className="mob-login" onClick={this.editBox} style={card.box.style}>
-        {card.logo ? <div className={'logo ' + (editId === card.logo.uuid ? 'editing' : '')} onClick={this.editLogo}>
-          <ContentUpdate element={card.logo} updateContent={(ele) => this.updateContent({...card, logo: ele})}/>
-          <img src={card.logo.content} alt=""/>
-        </div> : null}
-        {card.title ? <div className={'plat-name ' + (editId === card.title.uuid ? 'editing' : '')} style={card.title.style} onClick={this.editTitle}>
-          <ContentUpdate element={card.title} updateContent={(ele) => this.updateContent({...card, title: ele})}/>
-          {card.title.content}
-        </div> : null}
-        <InputItem
-          placeholder="UserName"
-          prefixListCls="mk-login-item am-list"
-          {...getFieldProps('userName', {
-            initialValue: 'admin',
-          })}
-          disabled={true}
-        >
-          <Icon type="check-circle-o" />
-        </InputItem>
-        <InputItem
-          placeholder="Password"
-          prefixListCls="mk-login-item am-list"
-          {...getFieldProps('password', {
-            initialValue: '123456',
-          })}
-          type={'password'}
-          disabled={true}
-        >
-          <Icon type="check-circle" />
-        </InputItem>
-        <div className="other-setting">
-          <CheckboxItem checked={rember} onChange={this.onChange}>
-            <span onClick={this.onChange}>璁颁綇瀵嗙爜</span>
-          </CheckboxItem>
-          {/* <Picker data={langs} value={lang} cols={1} onChange={this.onChangeLang} className="forss">
-            <List.Item>{lang}</List.Item>
-          </Picker> */}
-          <List.Item className="lang">涓枃绠�浣�</List.Item>
-          <div className="clear-both"></div>
-        </div>
-        <Button 
-          type="primary"
-          className={'login ' + (editId === card.login.uuid ? 'editing' : '')} 
-          onDoubleClick={() => this.props.doubleClickCard(card.login)}
-          style={card.login.style}
-          onClick={this.editLogin}
-        >
-          <ContentUpdate element={card.login} deletable={false} updateContent={(ele) => this.updateContent({...card, login: ele})}/>
-          {card.login.content}
-        </Button>
-        {card.copyright ? <div className={'company-msg ' + (editId === card.copyright.uuid ? 'editing' : '')} style={card.copyright.style} onClick={this.editMsg}>
-          <ContentUpdate element={card.copyright} updateContent={(ele) => this.updateContent({...card, copyright: ele})}/>
-          {card.copyright.content}
-        </div> : null}
-      </div>
-    )
-  }
-}
-
-export default createForm()(MobLogin)
\ No newline at end of file
diff --git a/src/mob/mobshell/card.jsx b/src/mob/mobshell/card.jsx
index 2cf4204..4c243e9 100644
--- a/src/mob/mobshell/card.jsx
+++ b/src/mob/mobshell/card.jsx
@@ -7,7 +7,8 @@
 import './index.scss'
 
 // const Home = asyncComponent(() => import('@/mob/home'))
-const Login = asyncComponent(() => import('@/mob/login'))
+const MobLogin1 = asyncComponent(() => import('@/mob/components/login/mob-login-1'))
+const MobLogin2 = asyncComponent(() => import('@/mob/components/login/mob-login-2'))
 
 const Card = ({ id, card, moveCard, findCard, editId, editCard, delCard, hasDrop, doubleClickCard, updateConfig }) => {
   const originalIndex = findCard(id).index
@@ -45,7 +46,9 @@
   const getCardComponent = () => {
     if (card.type === 'login') {
       if (card.subtype === 'mob-login-1') {
-        return (<Login card={card} triggerEdit={editCard} editId={editId} onDoubleClick={doubleClickCard} updateConfig={updateConfig} />)
+        return (<MobLogin1 card={card} triggerEdit={editCard} editId={editId} onDoubleClick={doubleClickCard} updateConfig={updateConfig} />)
+      } else if (card.subtype === 'mob-login-2') {
+        return (<MobLogin2 card={card} triggerEdit={editCard} editId={editId} onDoubleClick={doubleClickCard} updateConfig={updateConfig} />)
       }
     }
   }
diff --git a/src/mob/mobshell/index.jsx b/src/mob/mobshell/index.jsx
index 12010de..f293e7b 100644
--- a/src/mob/mobshell/index.jsx
+++ b/src/mob/mobshell/index.jsx
@@ -50,13 +50,11 @@
         return
       }
 
-      let newcard = fromJS(item.param).toJS()
-      Object.keys(newcard).forEach(key => {
-        if (newcard[key].editable) {
-          newcard[key].uuid = Utils.getuuid()
-        }
-      })
-      newcard.uuid = Utils.getuuid()
+      let newcard = {
+        uuid: Utils.getuuid(),
+        type: item.componentType,
+        subtype: item.subtype,
+      }
       
       let targetId = cards.length > 0 ? cards[cards.length - 1].uuid : 0
       if (target) {
diff --git a/src/mob/mobshell/index.scss b/src/mob/mobshell/index.scss
index 09697c5..58629e7 100644
--- a/src/mob/mobshell/index.scss
+++ b/src/mob/mobshell/index.scss
@@ -5,7 +5,7 @@
       position: absolute;
       right: 2px;
       top: 50%;
-      background: #2f54eb;
+      background: #ff4d4f;
       border-radius: 2px;
       padding: 4px;
       color: #ffffff;
diff --git a/src/mob/modelsource/dragsource/index.scss b/src/mob/modelsource/dragsource/index.scss
index 3b86b2a..9884d46 100644
--- a/src/mob/modelsource/dragsource/index.scss
+++ b/src/mob/modelsource/dragsource/index.scss
@@ -4,10 +4,10 @@
   margin-right: 15px;
   cursor: move;
   height: 130px;
-  box-shadow: 0px 0px 3px #dddddd;
+  box-shadow: 0px 0px 3px #cdcdcd;
 
-  background-size: contain;
-  background-position: center center;
+  background-size: cover;
+  background-position: top center;
   background-repeat: no-repeat;
 
   .tooltip-block {
diff --git a/src/mob/modelsource/index.jsx b/src/mob/modelsource/index.jsx
index b85bea0..9adfe9c 100644
--- a/src/mob/modelsource/index.jsx
+++ b/src/mob/modelsource/index.jsx
@@ -18,9 +18,11 @@
   }
 
   render() {
+    const { appType } = this.props
+
     return (
       <div className="mob-card-source-box">
-        {mobOptions.map((item, index) => (
+        {appType === 'mob' && mobOptions.map((item, index) => (
           <div key={index}>
             <p>{item.title}</p>
             {item.options.map((cell, i) => (<SourceWrap key={i} content={cell} />))}
diff --git a/src/mob/modelsource/option.jsx b/src/mob/modelsource/option.jsx
index 5418f89..0123971 100644
--- a/src/mob/modelsource/option.jsx
+++ b/src/mob/modelsource/option.jsx
@@ -1,7 +1,7 @@
 import zhCN from '@/locales/zh-CN/mob.js'
 import enUS from '@/locales/en-US/mob.js'
 import mobLogin1 from '@/assets/mobimg/mob-login1.png'
-import mklogo from '@/assets/mobimg/mklogo.png'
+import mobLogin2 from '@/assets/mobimg/mob-login2.png'
 
 const _dict =  sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS
 
@@ -10,16 +10,7 @@
   title: _dict['mob.login'],
   sourceType: 'login',
   options: [
-    {
-      sourceType: 'mob-login-1', type: 'mob', url: mobLogin1,  style: {},
-      param: {
-        type: 'login', subtype: 'mob-login-1',
-        box: { editable: true, eleType: 'box', style: {paddingTop: '17vh', color: '#ffffff', backgroundImage: 'linear-gradient(#378DBE, #46C29E, #48A9D6)'}},
-        logo: { editable: true, eleType: 'img', content: mklogo, style: {} },
-        title: { editable: true, eleType: 'text', content: '鏄庣鍟嗕笟鏅鸿兘寮�鏀惧钩鍙�', style: {fontSize: '20px', fontWeight: 'bold', color: '#ffffff', textAlign: 'center'}},
-        login: { editable: true, eleType: 'button', content: '鐧诲綍', style: {fontSize: '18px', color: '#ffffff', textAlign: 'center', lineHeight: 2.4}},
-        copyright: { editable: true, eleType: 'textarea', content: 'Copyright漏2017  鎵�鏈夌浉鍏崇増鏉冨綊  鍖椾含鏄庣鏅崕淇℃伅鎶�鏈湁闄愬叕鍙�', style: {fontSize: '12px', color: '#ffffff', textAlign: 'center'} }
-      }
-    },
+    { subtype: 'mob-login-1', componentType: 'login', type: 'mob', url: mobLogin1,  style: {} },
+    { subtype: 'mob-login-2', componentType: 'login', type: 'mob', url: mobLogin2,  style: {} },
   ]
 }]
diff --git a/src/templates/zshare/formconfig.jsx b/src/templates/zshare/formconfig.jsx
index 7680c60..a040eef 100644
--- a/src/templates/zshare/formconfig.jsx
+++ b/src/templates/zshare/formconfig.jsx
@@ -2289,13 +2289,6 @@
       options: []
     },
     {
-      type: 'multiselect',
-      key: 'linkSubField',
-      label: Formdict['model.form.link'],
-      initVal: card.linkSubField || [],
-      options: inputfields
-    },
-    {
       type: 'select',
       key: 'fileType',
       label: '鏄剧ず鏂瑰紡',
@@ -2414,6 +2407,13 @@
     },
     {
       type: 'multiselect',
+      key: 'linkSubField',
+      label: Formdict['model.form.linkform'],
+      initVal: card.linkSubField || [],
+      options: inputfields
+    },
+    {
+      type: 'multiselect',
       key: 'blacklist',
       label: Formdict['header.form.blacklist'],
       initVal: card.blacklist || [],
diff --git a/src/views/mobdesign/index.jsx b/src/views/mobdesign/index.jsx
index 5a2f0b8..744fa84 100644
--- a/src/views/mobdesign/index.jsx
+++ b/src/views/mobdesign/index.jsx
@@ -131,8 +131,14 @@
     config.components = config.components.map(component => {
       if (component.uuid === proper.componentId) {
         Object.keys(component).forEach(key => {
-          if (component[key].editable && component[key].uuid === proper.uuid) {
+          if (component[key].uuid === proper.uuid) {
             component[key].style = {...component[key].style, ...proper.style}
+            // eslint-disable-next-line
+            for (let index in component[key].style) {
+              if (component[key].style[index] === '') {
+                delete component[key].style[index]
+              }
+            }
           }
         })
       }
@@ -180,7 +186,6 @@
             <div className="mob-setting">
               {config ? <Tabs defaultActiveKey="1" animated={false} size="small">
                 <TabPane tab="閰嶇疆" key="1">
-                  {/* <SketchPicker /> */}
                   <Controller editElem={editElem} updateStyle={this.updateStyle} />
                 </TabPane>
                 <TabPane tab="鏁版嵁婧�" key="2">
diff --git a/src/views/mobdesign/index.scss b/src/views/mobdesign/index.scss
index b496b3a..7251e22 100644
--- a/src/views/mobdesign/index.scss
+++ b/src/views/mobdesign/index.scss
@@ -1,17 +1,18 @@
 .mobile-view {
   background: #000;
+  min-height: 100vh;
   .mob-body {
     width: 100vw;
-    height: calc(100vh - 50px);
-    overflow: hidden;
+    height: 100vh;
+    overflow-x: hidden;
     position: relative;
     background: #262626;
-    padding: 0px 300px 0px 40px;
+    padding: 50px 300px 0px 40px;
 
     .mob-tool {
-      position: absolute;
+      position: fixed;
       left: 0;
-      top: 0;
+      top: 48px;
       height: 100%;
       width: 40px;
       background: #262626;
@@ -63,9 +64,10 @@
     }
 
     .mob-setting {
-      position: absolute;
+      position: fixed;
       right: 0;
       top: 0;
+      z-index: 10;
       height: 100%;
       width: 300px;
       background: #202735;
@@ -75,7 +77,9 @@
         >.ant-tabs-bar {
           border-bottom: 1px solid #181F29;
           margin-bottom: 0px;
+          min-height: 48px;
           .ant-tabs-tab {
+            padding: 14px 16px;
             color: rgba(255, 255, 255, 0.85);
           }
           .ant-tabs-tab-active.ant-tabs-tab {
@@ -87,11 +91,11 @@
 
     .mob-shell {
       width: 375px;
-      height: calc(100vh - 70px);
+      height: 680px;
       margin: 0 auto;
       background: #ffffff;
       background-size: 100% 100%;
-      padding: 5vh 13px 6vh;
+      padding: 25px 13px 40px;
       border-radius: 30px;
 
       .mob-shell-inner {
@@ -99,10 +103,10 @@
         height: 100%;
         overflow-y: auto;
         overflow-x: hidden;
-        box-shadow: 0px 0px 3px #d1d1d5;
+        box-shadow: 0px 0px 2px #000000;
       }
       .mob-shell-inner::-webkit-scrollbar {
-        width: 4px;
+        width: 2px;
       }
       .mob-shell-inner::-webkit-scrollbar-thumb {
         box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
diff --git a/src/views/mobmanage/index.scss b/src/views/mobmanage/index.scss
index 0dff349..3178be3 100644
--- a/src/views/mobmanage/index.scss
+++ b/src/views/mobmanage/index.scss
@@ -1,4 +1,10 @@
 .mobile-manage {
   background: #fff;
   min-height: 100vh;
+
+  .mob-header-container {
+    padding-right: 0px;
+    position: relative;
+    z-index: 10;
+  }
 }

--
Gitblit v1.8.0