فهرست منبع

完成登录交互功能开发

Administrator 7 سال پیش
والد
کامیت
897799cc28

+ 1 - 0
app.html

@@ -4,6 +4,7 @@
   <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"/>
   <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css"/>
   <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
+  <link rel="stylesheet" href="https://unpkg.com/mint-ui/lib/style.css">
   <link rel="stylesheet" type="text/css" href="https://at.alicdn.com/t/font_0d1jjt5tukcblnmi.css"/>
   {{ HEAD }}
   <script>

+ 6 - 0
assets/scss/mobileCommon.scss

@@ -10,3 +10,9 @@
 .mint-cell-wrapper{
   border:1px solid #b5b5b5;
 }
+.page-part a{
+  color:#333;
+  &:hover{
+    color:#666;
+  }
+}

+ 174 - 6
components/mobile/loginMobile.vue

@@ -1,18 +1,31 @@
 <template>
 <div class="login">
   <div class="page-part">
-    <mt-field placeholder="账号" v-model="username"></mt-field>
+    <mt-field auto-complete="off" placeholder="手机号/邮箱/账号ID" v-model="login.username" @blur.native.capture="codeCount"></mt-field>
   </div>
   <div class="page-part">
-    <mt-field placeholder="密码" v-model="password"></mt-field>
+    <mt-field placeholder="密码" v-model="login.password"></mt-field>
   </div>
+  <template v-if="showCheckCode">
+    <div class="page-part">
+      <mt-field placeholder="验证码" v-model="login.captcha">
+        <img :src="imgSrc" height="45px" width="100px" @click="getCode">
+      </mt-field>
+    </div>
+  </template>
   <div class="page-part">
-    <mt-button size="large" type="primary">登录</mt-button>
+    <mt-button size="large" type="primary" @click="checkLogin(true)">登录</mt-button>
   </div>
   <div class="login-btn">
     <p>还没有优软云账号?</p>
-    <mt-button size="large" plain type="primary">立即注册</mt-button>
+    <mt-button size="large" plain type="primary" @click="jump">立即注册</mt-button>
   </div>
+  <mt-popup v-model="popupVisible" position="right" class="mint-popup" :modal="false">
+    <ul style="height:100vh;overflow-y:auto">
+      <li class="listitem itemgreen">选择您要登录的公司:</li>
+      <li v-for="item in enterprise" class="listitem" @click="selectEnterprise(false, item.id)">{{ item.name }}</li>
+    </ul>
+  </mt-popup>
 </div>
 </template>
 
@@ -21,14 +34,169 @@
     name: 'loginMobile',
     data () {
       return {
-        username: '',
-        password: ''
+        loading: false,
+        popupVisible: false,
+        imgSrc: '',
+        showCheckCode: false,
+        login: {
+          username: '',
+          password: '',
+          spaceUU: '',
+          captcha: ''
+        },
+        appId: '',
+        returnUrl: '',
+        baseUrl: ''
+      }
+    },
+    mounted () {
+      this.$nextTick(() => {
+        this.getUrl()
+      })
+    },
+    computed: {
+      enterprise () {
+        return this.$store.state.login.chooseRegisterEnterprise.choose.data
+      }
+    },
+    methods: {
+      selectEnterprise (flag, type) {
+        this.login.spaceUU = type
+        this.toLogin(flag)
+      },
+      jump () {
+        if (this.appId === 'mall') {
+          window.location.href = `/register/personalRegistration?appId=${this.appId}&returnUrl=${this.returnUrl}`
+        } else {
+          window.location.href = `/register/enterpriseRegistration?appId=${this.appId}&returnUrl=${this.returnUrl}`
+        }
+      },
+      getUrl () {
+        let url = window.location.search
+        let request = {}
+        if (url.indexOf('?' !== -1)) {
+          let str = url.substr(1)
+          let strs = str.split('&')
+          for (let i = 0; i < strs.length; i++) {
+            request[strs[i].split('=')[0]] = decodeURI(strs[i].split('=')[1])
+          }
+        }
+        this.appId = request['appId'] || ''
+        this.returnUrl = request['returnUrl'] || ''
+        this.baseUrl = request['baseUrl'] || ''
+      },
+      getCode () {
+        this.imgSrc = '/sso/login/checkCode?timestamp=' + (new Date()).valueOf()
+      },
+      checkLogin (flag) {
+        if (!this.login.username) {
+          this.$toast({message: '请填写账号', iconClass: 'el-icon-warning'})
+        } else if (!this.login.password) {
+          this.$toast({message: '请填写密码', iconClass: 'el-icon-warning'})
+        } else {
+          this.toLogin(flag)
+        }
+      },
+      codeCount () {
+        this.$http.get(`/sso/login/getPwdErrorCount`, {params: {username: this.login.username}})
+          .then(response => {
+            if (response.data.success) {
+              let count = response.data.content || ''
+              if (count >= 3 && count < 5) {
+                this.showCheckCode = true
+                let _this = this
+                setTimeout(function () {
+                  _this.getCode()
+                }, 100)
+                this.$toast({
+                  message: '当前已输错密码' + count + '次,若达到5次今日将无法登陆',
+                  iconClass: 'el-icon-warning'
+                })
+              }
+            }
+            return Promise.reject(response.data)
+          }).catch(() => {
+            this.$indicator.close()
+          })
+      },
+      toLogin (flag) {
+        this.$indicator.open('登录中...')
+        let param = new FormData()
+        param.append('username', this.login.username)
+        param.append('password', this.login.password)
+        param.append('captcha', this.login.captcha)
+        param.append('appId', this.appId)
+        param.append('returnUrl', this.returnUrl)
+        param.append('baseUrl', this.baseUrl)
+        param.append('spaceUU', this.login.spaceUU)
+        let config = {
+          headers: {'Content-Type': 'multipart/form-data'}
+        }
+        this.$http.post('/sso/login', param, config)
+          .then(response => {
+            this.$indicator.close()
+            if (response.data.success) {
+              // 弹框用户选择企业
+              if (response.data.content.spaces) {
+                this.$store.commit('login/chooseRegisterEnterprise/GET_ENTERPRISE_SUCCESS', response.data.content.spaces)
+                this.popupVisible = flag
+              } else if (response.data.content.loginUrls) {
+                // 遍历登录url循环让各个应用登录
+                for (let i in response.data.content.loginUrls) {
+                  this.$jsonp(`${response.data.content.loginUrls[i]}`, function (err) {
+                    if (err) throw err
+                  })
+                }
+                window.location.href = response.data.content.returnUrl || 'http://www.ubtob.com'
+              }
+            }
+            return Promise.reject(response.data)
+          }).catch(err => {
+            this.$toast({
+              message: err.errMsg,
+              iconClass: 'el-icon-error'
+            })
+          })
       }
     }
   }
 </script>
 
 <style type="text/scss" lang="scss">
+  ::-webkit-scrollbar {
+    width: 0;
+    height: 1px;
+  }
+  ::-webkit-scrollbar-thumb {
+    border-radius: 5px;
+    -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
+    background: rgba(0, 0, 0, 0.2);
+  }
+  .itemgreen{
+    color:#2d8cf0;
+  }
+  .listitem {
+    height: 1rem;
+    line-height: 1rem;
+    border-bottom: solid 1px #eee;
+    text-align: center;
+    &:first-child {
+      border-top: solid 1px #eee;
+    }
+  }
+  .mint-popup {
+    width: 100%;
+    height: 100%;
+    background-color: #fff;
+  }
+  .mint-popup .mint-button {
+    position: absolute;
+    width: 90%;
+    top: 50%;
+    left: 5%;
+    transform: translateY(-50%);
+  }
+
   .mint-button .mint-button-text{
     margin: 0;
     font-weight: normal;

+ 130 - 0
components/mobile/registerEnterprise/index.vue

@@ -0,0 +1,130 @@
+<template>
+  <div class="f-main">
+    <div class="content-top">
+      <p>企业注册</p>
+      <a class="go" href="/register/personalRegistration"><i class="fa fa-long-arrow-right"></i>个人注册</a>
+    </div>
+    <template v-if="step === 2">
+      <div class="f-form">
+        <div class="page-part">
+          <mt-field placeholder="手机号码" v-model="mobile"></mt-field>
+        </div>
+        <div class="page-part">
+          <mt-field placeholder="短信验证码" v-model="token">
+            <span class="token">获取验证码</span>
+          </mt-field>
+        </div>
+      </div>
+      <div class="form-btn">
+        <div class="page-part">
+          <el-checkbox v-model="checked">我已阅读并同意 <a href="#">《优软云服务条款》</a></el-checkbox>
+        </div>
+        <mt-button type="primary" size="large">验证手机</mt-button>
+      </div>
+    </template>
+    <template v-if="step === 1">
+      <div class="f-form">
+        <div class="page-part">
+          <mt-field placeholder="企业名称" v-model="step2.spaceName"></mt-field>
+        </div>
+        <div class="page-part">
+          <mt-field placeholder="营业护照号" v-model="step2.businessCode"></mt-field>
+        </div>
+        <div class="page-part">
+          <mt-field placeholder="管理员号码" v-model="step2.vipName"></mt-field>
+        </div>
+        <div class="page-part">
+          <mt-field placeholder="登录密码" v-model="step2.password"></mt-field>
+          <template v-if="password">
+            <p class="pwd">密码强度 <em class="sm"></em> <em class="md"></em> <em class="ld"></em> <span class="sm-span">强</span></p>
+            <p class="pwd">密码须为8-20字符的英文、数字混合</p>
+          </template>
+        </div>
+        <div class="page-part">
+          <mt-field placeholder="密码确认" v-model="step2.password"></mt-field>
+        </div>
+        <div class="page-part">
+          <mt-field placeholder="联系邮箱" v-model="step2.email"></mt-field>
+        </div>
+      </div>
+      <div class="form-btn">
+        <mt-button type="primary" size="large">完成注册</mt-button>
+      </div>
+    </template>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'registerEnterprise',
+    data () {
+      return {
+        step: 1,
+        step1: {
+          mobile: '',
+          token: ''
+        },
+        step2: {
+          spaceName: '',
+          businessCode: '',
+          vipName: '',
+          password: '',
+          email: ''
+        },
+        checked: ''
+      }
+    }
+  }
+</script>
+
+<style scoped type="text/scss" lang="scss">
+  .f-main{
+    background: #fff;
+    padding:0.55rem .3rem 1.1rem;
+    .content-top{
+      position:relative;
+      p{
+        font-size: .4rem;
+        color:#787878;
+        margin-bottom:.35rem;
+      }
+      a.go{
+        position: absolute;
+        top: 0;
+        right: 0;
+        font-size: .28rem;
+        i{
+          margin-right: .06rem;
+        }
+      }
+    }
+    .f-form{
+      border-top:1px solid #b5b5b5;
+      padding-top:.6rem;
+      .pwd{
+        font-size: .14rem;
+        color:#a0a0a0;
+        margin: .2rem auto;
+        em{
+          display: inline-block;
+          line-height: .14rem;
+          margin:.05rem .2rem;
+          width: .45rem;
+          height: .1rem;
+        }
+        .sm{background:#ff4e00}
+        .md{background: #22ac38}
+        .ld{background: #00a0e9}
+        .sm-span{color:#ff4e00}
+        .md-span{color: #22ac38}
+        .ld-span{color: #00a0e9}
+      }
+      .token{
+        display:inline-block;
+        padding: 0 .5rem;
+        text-align: center;
+        border-left:1px solid #b5b5b5;
+      }
+    }
+  }
+</style>

+ 42 - 17
pages/mobile/registerPerson/index.vue → components/mobile/registerPersonal/index.vue

@@ -1,14 +1,19 @@
 <template>
-<div class="person">
-  <header-mobile/>
   <div class="f-main">
-    <p>个人注册</p>
+    <div class="content-top">
+      <p>个人注册</p>
+      <a class="go" href="/register/enterpriseRegistration"><i class="fa fa-long-arrow-right"></i>企业注册</a>
+    </div>
     <div class="f-form">
       <div class="page-part">
         <mt-field placeholder="会员名" v-model="vipName"></mt-field>
       </div>
       <div class="page-part">
         <mt-field placeholder="密码" v-model="password"></mt-field>
+        <template v-if="password">
+          <p class="pwd">密码强度 <em class="sm"></em> <em class="md"></em> <em class="ld"></em> <span class="sm-span">强</span></p>
+          <p class="pwd">密码须为8-20字符的英文、数字混合</p>
+        </template>
       </div>
       <div class="page-part">
         <mt-field placeholder="确认密码" v-model="password"></mt-field>
@@ -29,19 +34,11 @@
       <mt-button type="primary" size="large">完成注册</mt-button>
     </div>
   </div>
-  <footer-mobile/>
-</div>
 </template>
 
 <script>
-  import { HeaderMobile, FooterMobile } from '~components/mobile'
   export default {
     name: 'registerPerson',
-    layout: 'mobile',
-    components: {
-      HeaderMobile,
-      FooterMobile
-    },
     data () {
       return {
         vipName: '',
@@ -55,18 +52,47 @@
 </script>
 
 <style scoped type="text/scss" lang="scss">
-.person{
   .f-main{
     background: #fff;
     padding:0.55rem .3rem 1.1rem;
-    p{
-      font-size: .4rem;
-      color:#787878;
-      margin-bottom:.35rem;
+    .content-top{
+      position:relative;
+      p{
+        font-size: .4rem;
+        color:#787878;
+        margin-bottom:.35rem;
+      }
+      a.go{
+        position: absolute;
+        top: 0;
+        right: 0;
+        font-size: .28rem;
+        i{
+          margin-right: .06rem;
+        }
+      }
     }
     .f-form{
       border-top:1px solid #b5b5b5;
       padding-top:.6rem;
+      .pwd{
+        font-size: .14rem;
+        color:#a0a0a0;
+        margin: .2rem auto;
+        em{
+          display: inline-block;
+          line-height: .14rem;
+          margin:.05rem .2rem;
+          width: .45rem;
+          height: .1rem;
+        }
+        .sm{background:#ff4e00}
+        .md{background: #22ac38}
+        .ld{background: #00a0e9}
+        .sm-span{color:#ff4e00}
+        .md-span{color: #22ac38}
+        .ld-span{color: #00a0e9}
+      }
       .token{
         display:inline-block;
         padding: 0 .5rem;
@@ -75,5 +101,4 @@
       }
     }
   }
-}
 </style>

+ 23 - 4
pages/register/enterpriseRegistration.vue

@@ -1,17 +1,36 @@
 <template>
   <div>
-    <accountCenter-header/>
-    <enterprise-registration/>
+    <template v-if="isMobile">
+      <header-mobile/>
+      <registerEnterprise-mobile/>
+      <footer-mobile/>
+    </template>
+    <template v-else>
+      <accountCenter-header/>
+      <enterprise-registration/>
+    </template>
   </div>
 </template>
 <script>
   import AccountCenterHeader from '~components/default/AccountCenterHeader.vue'
   import EnterpriseRegistration from '~components/register/EnterpriseRegistration.vue'
+  import { HeaderMobile, FooterMobile } from '~components/mobile'
+  import registerEnterpriseMobile from '~components/mobile/registerEnterprise'
   export default {
-    layout: 'default',
+    layout (context) {
+      return context.store.state.option.isMobile ? 'mobile' : 'default'
+    },
     components: {
       AccountCenterHeader,
-      EnterpriseRegistration
+      EnterpriseRegistration,
+      registerEnterpriseMobile,
+      HeaderMobile,
+      FooterMobile
+    },
+    computed: {
+      isMobile () {
+        return this.$store.state.option.isMobile
+      }
     }
   }
 </script>

+ 23 - 4
pages/register/personalRegistration.vue

@@ -1,22 +1,41 @@
 <template>
   <div>
-    <accountCenter-header/>
-    <personal-registration/>
+    <template v-if="isMobile">
+      <header-mobile/>
+      <registerPersonal-mobile/>
+      <footer-mobile/>
+    </template>
+    <template v-else>
+      <accountCenter-header/>
+      <personal-registration/>
+    </template>
   </div>
 </template>
 <script>
   import AccountCenterHeader from '~components/default/AccountCenterHeader.vue'
   import PersonalRegistration from '~components/register/PersonalRegistration.vue'
+  import { HeaderMobile, FooterMobile } from '~components/mobile'
+  import registerPersonalMobile from '~components/mobile/registerPersonal'
   export default {
-    layout: 'default',
+    layout (context) {
+      return context.store.state.option.isMobile ? 'mobile' : 'default'
+    },
     components: {
       AccountCenterHeader,
-      PersonalRegistration
+      PersonalRegistration,
+      HeaderMobile,
+      FooterMobile,
+      registerPersonalMobile
     },
     fetch ({store, route}) {
       return Promise.all([
 
       ])
+    },
+    computed: {
+      isMobile () {
+        return this.$store.state.option.isMobile
+      }
     }
   }
 </script>

+ 2 - 3
plugins/mint-ui.js

@@ -1,4 +1,3 @@
 import Vue from 'vue'
-import MintUI from 'mint-ui'
-import 'mint-ui/lib/style.css'
-Vue.use(MintUI)
+import Mint from 'mint-ui'
+Vue.use(Mint)