cuiqian2004
2025-06-06 08b2db8f26e6b508c7ed9a59006cff3005db5895
pages/login/index.vue
@@ -1,171 +1,37 @@
<style>
   input::-webkit-input-placeholder {
      font-size: 12rpx;
   }
   #headr {
      background: #434343;
      /* width: 375px; */
      height: 250rpx;
      text-align: center;
      background-color: #438EB9;
      /* background-image: url(../../images/login/root.png) !important;
      background-size: cover !important;
      background-repeat: no-repeat !important; */
   }
   .SetServer {
      float: left;
      margin-left: 20rpx;
   }
   .check_rememberPwd {
      margin-top: 20rpx;
      margin-left: 20rpx;
   }
   .logo {
      height: 180rpx;
      width: 180rpx;
      margin-top: 170rpx;
   }
   .logo_input {
      height: 40rpx;
      width: 40rpx;
      margin-left: 40rpx;
   }
   .logo_icon {
      height: 50rpx;
      width: 50rpx;
      margin-left: 15rpx;
      margin-top: 20rpx;
   }
   .mui-content {
      height: 100%;
      padding-top: 140rpx;
      background: #FFFFFF;
      z-index: 1;
   }
   .mui-input-group .la_icon {
      width: 100rpx;
      text-align: center;
      font-family: 'Helvetica Neue', Helvetica, sans-serif;
      line-height: 1.5;
      float: left;
      padding: 7px 13px;
   }
   .mui-input-group .mui-input-row {
      height: 85rpx;
      position: relative;
      clear: left;
      overflow: hidden;
   }
   .mui-input-row:first-child {
      border-top: 1px solid #c8c7cc;
   }
   .mui-input-row:last-child {
      border-bottom: 1px solid #c8c7cc;
   }
   .mui-input-group .mui-input-row:last-child:after {
      background-color: #fff;
   }
   .mui-input-group .mui-input-row:after {
      position: absolute;
      right: 0;
      bottom: 0;
      left: 15px;
      height: 1px;
      content: '';
      transform: scaleY(.5);
      background-color: #c8c7cc;
   }
   .mui-input-row input {
      font-family: 'Helvetica Neue', Helvetica, sans-serif;
      font-size: 15px;
      width: 480rpx;
      /* float: right; */
      margin-bottom: 0;
      padding-left: 20rpx;
      /* padding-right: 10rpx; */
      /* line-height: 30rpx; */
      height: 85rpx;
      /* padding: 7px 40px 7px 0px; */
      -webkit-user-select: text;
      /* border: 0; */
      /* border-radius: 0; */
      box-shadow: none;
      outline: 0;
      background: 0 0;
      -webkit-appearance: none;
   }
   .mui-input-group label.mui-navigate-right {
      font-size: 25px;
      float: right;
      padding: 0;
      width: 80rpx;
      margin-right: 5rpx;
      margin-top: -88rpx;
      display: inline-block;
   }
   button.btn_login {
      margin-top: 50rpx;
      padding: 20rpx;
      line-height: 1.5;
      background: #27A6E1;
      border: none;
      color: #fff;
   }
</style>
<template>
   <view class="" style="width: 100vw;height: 64vh;">
   <view class="uni-page-login " :class="largeMode?'large-mode':''" style="width: 100vw;height: 64vh;">
      <div id="headr" class="mui-bar mui-bar-nav">
         <image class="logo" src="../../images/login/mobox_log_200.png"></image>
      </div>
      <div class="mui-content">
         <form id='login-form' class="mui-input-group">
            <a href="javascript:;" class="SetServer" @click="inputDialogToggle">配置</a>
            <!-- <div class="mui-input-row">
               <label class="la_icon"><image class="logo_input" src="../../images/login/svr_30.png"></image></label>
               <input type="text" class="mui-input" v-model="userServer" placeholder="服务器地址">
               <label class="mui-navigate-right" id="sersel"><image class="logo_icon" src="../../images/login/sel_left.png" ></image></label>
            </div> -->
            <a href="javascript:;" class="SetServer" @click="inputDialogToggle">{{translateSys('set')}}</a>
            <a href="javascript:;" class="SetServer" @click="clickSetLanguage">{{translateSys('language')}}</a>
            <div class="mui-input-row">
               <label class="la_icon">
                  <image class="logo_input" src="../../images/login/person_30.png"></image>
               </label>
               <input type="text" class="mui-input" v-model="userName" placeholder="请输入账号">
               <!-- <label class="mui-navigate-right" id="namsel"><image class="logo_icon" src="../../images/login/user-photo.png</image></label> -->
               <input type="text" class="mui-input" v-model="userName" :placeholder="translateSys('input_login')">
            </div>
            <div class="mui-input-row">
               <label class="la_icon">
                  <image class="logo_input" src="../../images/login/lock_30.png"></image>
               </label>
               <input type="password" class="mui-input" v-model="userPwd" placeholder="请输入密码">
               <input type="password" class="mui-input" v-model="userPwd"
                  :placeholder="translateSys('input_password')">
            </div>
            <checkbox-group class="check_rememberPwd" @change="rememberPwd">
               <label>
                  <checkbox value="1" :checked="ischecked" />
                  <text>记住密码</text>
                  <text>{{translateSys('remember_password')}}</text>
               </label>
            </checkbox-group>
         </form>
         <button id='login' type="default" @tap="logind" class="btn_login">{{login}}</button>
         <button id='login' :disabled="btnLoading" type="default" @tap="onClickLogin"
            class="btn_login">{{translateSys("start_login")}}</button>
         <p style="float:right; margin: 10px 10px;color:#c8c7cc">
            <span>版本号:</span>
            <span>{{translateSys('version')}}:</span>
            <span>{{version}}</span>
         </p>
         <div class=""
@@ -175,20 +41,20 @@
      <view>
         <!-- 输入框示例 -->
         <uni-popup ref="inputDialog" type="dialog">
            <uni-popup-dialog ref="inputClose" mode="input" title="设置" :value="userServer" placeholder="请输入内容"
               @confirm="dialogInputConfirm"></uni-popup-dialog>
            <uni-popup-dialog ref="inputClose" mode="input" :title="translateSys('set')" :value="userServer"
               :placeholder="translate('input_server')" @confirm="dialogInputConfirm"></uni-popup-dialog>
         </uni-popup>
         <!-- 版本升级弹窗开始 -->
         <uni-popup ref="promotion" type="center">
            <view class="promotion" style="width: 700rpx;padding:20rpx 40rpx; background: white;font-size: 36rpx;">
               <view class="operates" v-if="showBtns==true">
                  <view style="text-align: center;padding-top:20rpx;padding-bottom: 40rpx;">
                     系统有新版本,是否需要更新
                     {{translate('tip_app_update')}}
                  </view>
                  <text @click="cancel"
                     style="display: inline-block;color: #7cd0f8;width: 50%; text-align: center;">取消</text>
                     style="display: inline-block;color: #7cd0f8;width: 50%; text-align: center;">{{translateSys('cancel')}}</text>
                  <text @click="sure"
                     style="display: inline-block;color: #7cd0f8;width: 50%; text-align: center;">确认</text>
                     style="display: inline-block;color: #7cd0f8;width: 50%; text-align: center;">{{translateSys('confirm')}}</text>
               </view>
               <view class="operates" v-else>
                  <cmd-progress :percent="percentage" stroke-color="linear-gradient(to right, #ef32d9, #89fffd)">
@@ -197,49 +63,66 @@
            </view>
         </uni-popup>
         <!-- 版本升级弹窗结束 -->
         <uni-popup ref="refClassDialog" type="dialog">
            <uni-popup-dialog mode="info" :title="$t('page.bind_classes')" @confirm="dialogClassConfirm">
               <view class="popup-class">
                  <view class="popup-class-item" :style="{color:item.text == selectedClasses ? '#27A6E1' :''}"
                     v-for="(item,index) in classesLst" :key="index" @click="clickSelectClass(item)">
                     <view class="ico"><uni-icons v-if="item.text == selectedClasses" type="checkmarkempty"
                           :color="item.text == selectedClasses ? '#27A6E1' :''" size="24"></uni-icons></view>
                     {{item.text}}
                  </view>
               </view>
            </uni-popup-dialog>
         </uni-popup>
      </view>
      <!-- <button @click="onClickWms">登录wms</button>
      <view class="webview">
         <web-view ref="webview" src="http://115.29.185.26:5000/mobox3/#/"></web-view>
      </view> -->
   </view>
</template>
<script>
   import cmdProgress from "@/components/cmd-progress/cmd-progress.vue"
   // import {
   //    mapState,
   //    mapMutations,
   //    mapActions ,
   // } from 'vuex'
   import {
      showModal,
      showToast,
      showLoading,
      hideLoading
   } from "@/js/Page.js"
   import {
      isMobox3Web,
      login,
      getApkVersionInfo
   } from "@/api/index.js"
   import buttonClickMixin from '@/mixins/button-click.js';
   import {
      dictGetInfo
   } from "@/api/mobox.js"
   import utils from "@/js/utils.js"
   export default {
      mixins: [buttonClickMixin],
      components: {
         cmdProgress
      },
      data() {
         //获取全局参数:url-服务器地址
         var server = uni.getStorageSync('server');
         var account = uni.getStorageSync('account');
         var password = uni.getStorageSync('password');
         var url = this.$store.state.url;
         var username = this.$store.state.username;
         var userpwd = this.$store.state.userpwd;
         var ischecked = false;
         if (!server)
            server = url;
         if (!account)
            account = username;
         if (account && password)
            ischecked = true;
         // console.log(url);
         return {
            login: "开始登录",
            userServer: server,
            userName: account,
            userPwd: password,
            ischecked: ischecked,
            userServer: utils.session.getValue('server'),
            userName: utils.session.getValue('account'),
            userPwd: utils.session.getValue('password'),
            ischecked: false,
            version: "1.0.0",
            downloadUrl: "", //安卓app下载链接
            percentage: 0, //下载进度
            showBtns: true,
            selectedClasses: "",
            classesLst: [],
            largeMode: false,
         }
      },
      onShow() {
@@ -274,80 +157,67 @@
         },
         //检测是否需要更新
         async check(version) {
            if (!this.userServer) {
               uni.showModal({
                  title: "提示",
                  content: "未输入网站地址,请重新配置输入!",
                  showCancel: false,
                  confirmText: "取消"
               });
               return;
            }
            var dataInfo = {
               server: this.userServer
            };
            this.$store.dispatch('GetApkVersionInfo', dataInfo).then(success => {
               console.log(success);
               if (success.code == '00000') {
                  let resp = success.data;
                  if (resp) {
                     // const obj = resp.data.filter(item => {
                     //    return item.groupName == 'version'
                     // })
                     //获取当前版本号
                     const VersionName = resp.VersionName; //更新包名称
                     const VersionCode = resp.VersionCode; //版本编码
                     const versionNum = resp.Version; //服务端版本号
                     // this.downloadUrl = resp.PdaUrl+"/"+VersionName; //app下载链接
                     this.downloadUrl = "http://" + this.userServer + "/Program/" + VersionName; //app下载链接this.
                     var isver = this.compare(versionNum,version);
                     if (isver) {
                        this.$refs.promotion.open();
                     } else {
                        console.log('当前已是最新版本')
                     }
                  }
               } else {
            try {
               if (!this.userServer) {
                  uni.showModal({
                     title: "错误",
                     content: success.msg,
                     title: this.translateSys("tip"),
                     content: this.translate("tip_no_web_server"),
                     showCancel: false,
                     confirmText: "取消"
                     confirmText: this.translateSys('close')
                  });
                  return;
               }
            }).catch(ex => {
               console.log(ex);
               // var ser = this.userServer.toLowerCase().split('/');
               const res = await getApkVersionInfo(this.userServer)
               this.downloadUrl = res.dldUrl || ""
               if (this.downloadUrl) {
                  var isver = this.compare(res.verNum || "", version);
                  if (isver) {
                     this.$refs.promotion.open();
                  } else {
                     console.log('当前已是最新版本')
                  }
               }
            } catch (ex) {
               // console.log(ex);
               let exStr = JSON.stringify(ex)
               if (exStr == "{}")
                  exStr = ex
               let tip = typeof ex.errMsg == "string" ? ex.errMsg : exStr
               uni.showModal({
                  title: "错误",
                  content: ex.errMsg ? ex.errMsg : ex.message,
                  title: this.translateSys("error"),
                  content: tip,
                  showCancel: false,
                  confirmText: "取消"
                  confirmText: this.translateSys('close')
               });
            });
            }
         },
         compare(curV, reqV) {
            var arr1 = curV.toString().split('.');
             var arr2 = reqV.toString().split('.');
             //将两个版本号拆成数字
             var minL = Math.min(arr1.length, arr2.length);
             var pos = 0; //当前比较位
             var diff = 0; //当前为位比较是否相等
             var flag = false;
             //逐个比较如果当前位相等则继续比较下一位
             while (pos < minL) {
                 diff = parseInt(arr1[pos]) - parseInt(arr2[pos]);
                 if (diff == 0) {
                     pos++;
                     continue;
                 } else if (diff > 0) {
                     flag = true;
                     break;
                 } else {
                     flag = false;
                     break;
                 }
             }
             return flag;
            var arr2 = reqV.toString().split('.');
            //将两个版本号拆成数字
            var minL = Math.min(arr1.length, arr2.length);
            var pos = 0; //当前比较位
            var diff = 0; //当前为位比较是否相等
            var flag = false;
            //逐个比较如果当前位相等则继续比较下一位
            while (pos < minL) {
               diff = parseInt(arr1[pos]) - parseInt(arr2[pos]);
               if (diff == 0) {
                  pos++;
                  continue;
               } else if (diff > 0) {
                  flag = true;
                  break;
               } else {
                  flag = false;
                  break;
               }
            }
            return flag;
         },
         //确认更新
         sure() {
@@ -386,7 +256,7 @@
                  plus.runtime.openFile(d.filename); //选择软件打开文件
                  uni.showToast({
                     icon: 'none',
                     title: '更新成功'
                     title: this.translate('update_success')
                  });
                  _this.$refs.promotion.close();
               } else {
@@ -394,7 +264,7 @@
                  plus.downloader.clear(); //清除下载任务
                  uni.showToast({
                     icon: 'none',
                     title: '更新失败'
                     title: this.translate('update_fail')
                  });
                  _this.showBtns = false;
               }
@@ -418,8 +288,27 @@
         //    actionLogin:'login'
         // }),
         inputDialogToggle() {
            this.$refs.inputDialog.open()
            // this.$refs.inputDialog.open()
            const $this = this
            uni.navigateTo({
               url: "./set",
               events: {
                  exitSetEvent(val) {
                     $this.userServer = val;
                     $this.query(); //版本升级
                     $this.largeMode =    getApp().globalData.largeMode
                  }
               }
            })
         },
         clickSetLanguage() {
            uni.navigateTo({
               url: './language'
            });
         },
         dialogInputConfirm(val) {
            // console.log(val);
            // uni.showLoading({
@@ -428,7 +317,7 @@
            // setTimeout(() => {
            // uni.hideLoading();
            this.userServer = val;
            uni.setStorageSync('server', val);
            utils.session.setValue('server', val);
            // this.value = val
            // 关闭窗口后,恢复默认内容
            this.$refs.inputDialog.close();
@@ -437,13 +326,14 @@
            // }, 3000)
            // }, 3000)
         },
         rememberPwd(e) { //记住密码
            console.log(e.target);
            uni.setStorageSync('account', '');
            uni.setStorageSync('password', '');
            if (e.target.value[0] == '1') {
               uni.setStorageSync('account', this.userName);
               uni.setStorageSync('password', this.userPwd);
            utils.session.setValue('account', '');
            utils.session.setValue('password', '');
            if (e.detail.value[0] == '1') {
               utils.session.setValue('account', this.userName);
               utils.session.setValue('password', this.userPwd);
            }
         },
         // getCookie(key){
@@ -465,98 +355,368 @@
         //    ((expiredays==null)?'':';expires='+exdate.toGMTString());
         // },
         logind() {
            if (!this.userServer) {
               uni.showModal({
                  title: "提示",
                  content: "未输入网站地址,请重新配置输入!",
                  showCancel: false,
                  confirmText: "取消"
               });
               return;
            }
            if (!this.userName) {
               uni.showModal({
                  title: "提示",
                  content: "未输入用户名,请重新输入!",
                  showCancel: false,
                  confirmText: "取消"
               });
               return;
            }
            if (!this.userPwd) {
               uni.showModal({
                  title: "提示",
                  content: "未输入密码,请重新输入!",
                  showCancel: false,
                  confirmText: "取消"
               });
               return;
            }
            //检查 "登录状态/锁屏状态" 结束
            var loginInfo = {
               server: this.userServer,
               uname: this.userName,
               pwd: this.userPwd,
               cname: plus.device.model,
               type: "0"
            };
            console.log(loginInfo);
            this.$data.login = "loading......";
            //登录
            this.$store.dispatch('login', loginInfo).then(success => {
               console.log(success);
               if (success.code == '00000' || success.err_code==0) {
                  //登录成功后清空缓存数据
                  this.$store.commit("areaFunc", null);
                  this.$store.commit("classAttrList", null);
                  this.$store.commit("classGridStyleInfo", null);
                  this.$store.commit("dicValueInfo", null);
                  this.$store.commit("subClassAttrList", null);
                  this.$store.commit("subClassGridStyleInfo", null);
                  //设置全局参数:user-用户信息
                  uni.setStorageSync('server', loginInfo.server);
                  uni.setStorageSync('account', loginInfo.uname);
                  uni.setStorageSync('password', loginInfo.pwd);
                  // this.mutatLogin({loginid:success});
                  this.$store.commit('login', {
                     loginid: success
                  });
                  uni.navigateTo({
                     url: '../index/index?args=9999999999'
                  })
                  // uni.redirectTo({
                  //    url:'../index/index?args=9999999999'
                  // });
                  this.login = "开始登录";
               } else {
                  uni.showModal({
                     title: "错误",
                     content: success.msg,
                     showCancel: false,
                     confirmText: "取消"
                  });
                  this.login = "开始登录";
               }
            }).catch(ex => {
               console.log(ex);
               uni.showModal({
                  title: "错误",
                  content: ex.errMsg,
                  showCancel: false,
                  confirmText: "取消"
               });
               this.login = "开始登录";
         onClickLogin() {
            this.handleButtonClick((done) => {
               this.logind()
               setTimeout(() => {
                  done(); // 重置状态
               }, 1000);
            });
         }
         },
         async logind() {
            try {
               if (!this.userServer) {
                  uni.showModal({
                     title: this.translateSys('tip'),
                     content: this.translate('tip_no_web_server'),
                     showCancel: false,
                     confirmText: this.translateSys('close')
                  });
                  return;
               }
               if (!this.userName) {
                  uni.showModal({
                     title: this.translateSys('tip'),
                     content: this.translate('tip_no_user_account'),
                     showCancel: false,
                     confirmText: this.translateSys('close')
                  });
                  return;
               }
               if (!this.userPwd) {
                  uni.showModal({
                     title: this.translateSys('tip'),
                     content: this.translate('tip_no_user_password'),
                     showCancel: false,
                     confirmText: this.translateSys('close')
                  });
                  return;
               }
               var rootUrl = 'http://' + this.userServer
               if (this.userServer.includes("://")) {
                  rootUrl = this.userServer
               }
               showLoading("loading......")
               const res = await login(rootUrl, this.userName, this.userPwd)
               //设置全局参数:user-用户信息
               utils.session.setValue('server', rootUrl);
               utils.session.setValue('account', this.userName);
               utils.session.setValue('password', this.userPwd);
               const app = getApp()
               app.globalData.sessionId = res.session_id
               app.globalData.loginUser = {
                  id: this.userName,
                  name: res.name,
                  pwd: this.userPwd
               }
               hideLoading()
               const bindInfo = utils.session.getValue('bind_classes')
               app.globalData.bindClasses = bindInfo?.checked || false
               if (app.globalData.bindClasses) {
                  this.selectedClasses = bindInfo?.classes || ""
                  await this.loadClassesList()
                  if (this.classesLst.length > 0) {
                     this.$refs.refClassDialog.open()
                  }
                  return
               }
               uni.navigateTo({
                  url: '../index/index?args=9999999999'
               })
            } catch (ex) {
               hideLoading()
               let exStr = JSON.stringify(ex)
               if (exStr == "{}")
                  exStr = ex
               let tip = typeof ex.errMsg == "string" ? ex.errMsg : exStr
               uni.showModal({
                  title: this.translateSys("error"),
                  content: tip,
                  showCancel: false,
                  confirmText: this.translateSys('close')
               });
            }
         },
         onClickWms() {
            let otherAppSchemeURL = "testapp://pages/index/index"; // 替换为目标app的scheme URL
            plus.runtime.openURL(otherAppSchemeURL, function(error) {
               console.error('打开应用失败: ', error);
            }, "uni.TeatApp");
         },
         async loadClassesList() {
            try {
               var $this = this;
               var dataInfo = {
                  dict_id: "",
                  dict_name: "WMS_CLASSES"
               };
               const res = await dictGetInfo(dataInfo)
               var list = [];
               (res.dict_item_list || []).forEach((item) => {
                  list.push({
                     text: item.value ? item.value : item.name,
                     value: item.name,
                  });
               });
               if (list.length == 0) {
                  uni.showModal({
                     title: this.translate("get_classes_fail"),
                     content: this.translate("page.please_login_after_admin_add_classes"),
                     showCancel: false,
                     confirmText: this.translateSys('close')
                  });
                  this.selectedClasses = ""
               } else {
                  if (this.selectedClasses) {
                     const curIndex = list.findIndex((a) => {
                        return a.text == this.selectedClasses
                     })
                     if (curIndex < 0) {
                        this.selectedClasses = list[0].text
                     }
                  } else {
                     this.selectedClasses = list[0].text
                  }
               }
               this.classesLst = list
            } catch (ex) {
               let exStr = JSON.stringify(ex)
               if (exStr == "{}")
                  exStr = ex
               let tip = typeof ex.errMsg == "string" ? ex.errMsg : exStr
               uni.showModal({
                  title: this.translate("get_classes_fail"),
                  content: tip,
                  showCancel: false,
                  confirmText: this.translateSys('close')
               });
               this.selectedClasses = ""
               this.classesLst = []
               // {
               //    text: "测试",
               //    value: "test"
               // }, {
               //    text: "测试3",
               //    value: "test3"
               // }
            }
         },
         dialogClassConfirm() {
            utils.session.setValue('bind_classes', {
               checked: true,
               classes: this.selectedClasses
            })
            getApp().globalData.classes = this.selectedClasses
            uni.navigateTo({
               url: '../index/index?args=9999999999'
            })
         },
         clickSelectClass(item) {
            this.selectedClasses = item.text
         },
         translate(t) {
            if (typeof this.$t == "function") return this.$t(`page.${t}`)
            else return t;
         },
         translateSys(t) {
            if (typeof this.$t == "function") return this.$t(`sys.${t}`)
            else return t;
         },
      },
      onLoad() {
      onLoad(options) {
         //获取mac地址
         var url = utils.session.getValue('server');
         var username = utils.session.getValue('account');
         var userpwd = utils.session.getValue('password');
         this.largeMode = utils.session.getValue('large_mode') ? true : false
         getApp().globalData.largeMode = this.largeMode
         var ischecked = false;
         if (!this.userServer)
            this.userServer = url;
         if (!this.userName)
            this.userName = username;
         if (this.userName && this.userPwd)
            ischecked = true;
         this.ischecked = ischecked
         var net = plus.android.importClass("java.net.NetworkInterface");
         var wl0 = net.getByName('wlan0');
         var macByte = wl0.getHardwareAddress();
         var deviceId = ''
         //下面这段代码来自网络
         for (var i = 0; i < macByte.length; i++) {
            var tmp = "";
            var num = macByte[i];
            if (num < 0) {
               tmp = (255 + num + 1).toString(16);
            } else {
               tmp = num.toString(16);
            }
            if (tmp.length == 1) {
               tmp = "0" + tmp;
            }
            deviceId += tmp;
         }
         getApp().globalData.deviceId = deviceId
         getApp().globalData.cname = plus.device.model
         //78b8d67511ca
         console.log('Android设备的deviceId:', deviceId);
         plus.runtime.getProperty(plus.runtime.appid, (info) => {
            // console.log(info);
            this.$data.version = info.version;
            this.version = info.version;
         });
      }
   }
</script>
<style lang="scss">
   .uni-page-login {
      input::-webkit-input-placeholder {
         font-size: 12rpx;
      }
      #headr {
         background: #434343;
         /* width: 375px; */
         height: 250rpx;
         text-align: center;
         background-color: #438EB9;
         /* background-image: url(../../images/login/root.png) !important;
      background-size: cover !important;
      background-repeat: no-repeat !important; */
      }
      .SetServer {
         float: left;
         margin-left: 20rpx;
      }
      .check_rememberPwd {
         margin-top: 20rpx;
         margin-left: 20rpx;
      }
      .logo {
         height: 180rpx;
         width: 180rpx;
         margin-top: 170rpx;
      }
      .logo_input {
         height: 40rpx;
         width: 40rpx;
         margin-left: 40rpx;
      }
      .logo_icon {
         height: 50rpx;
         width: 50rpx;
         margin-left: 15rpx;
         margin-top: 20rpx;
      }
      .mui-content {
         height: 100%;
         padding-top: 140rpx;
         background: #FFFFFF;
         z-index: 1;
      }
      .mui-input-group .la_icon {
         width: 100rpx;
         text-align: center;
         font-family: 'Helvetica Neue', Helvetica, sans-serif;
         line-height: 1.5;
         float: left;
         padding: 7px 13px;
      }
      .mui-input-group .mui-input-row {
         height: 85rpx;
         position: relative;
         clear: left;
         overflow: hidden;
      }
      .mui-input-row:first-child {
         border-top: 1px solid #c8c7cc;
      }
      .mui-input-row:last-child {
         border-bottom: 1px solid #c8c7cc;
      }
      .mui-input-group .mui-input-row:last-child:after {
         background-color: #fff;
      }
      .mui-input-group .mui-input-row:after {
         position: absolute;
         right: 0;
         bottom: 0;
         left: 15px;
         height: 1px;
         content: '';
         transform: scaleY(.5);
         background-color: #c8c7cc;
      }
      .mui-input-row input {
         font-family: 'Helvetica Neue', Helvetica, sans-serif;
         width: 480rpx;
         margin-bottom: 0;
         padding-left: 20rpx;
         -webkit-user-select: text;
         box-shadow: none;
         outline: 0;
         background: 0 0;
         -webkit-appearance: none;
      }
      button.btn_login {
         margin-top: 50rpx;
         padding: 20rpx;
         line-height: 1.5;
         background: #27A6E1;
         border: none;
         color: #fff;
      }
      .popup-class {
         display: flex;
         flex-direction: column;
         width: 100%;
         .popup-class-item {
            padding: 20rpx 0;
            border-bottom: 1px solid #eee;
            display: flex;
            flex-direction: row;
            .ico {
               width: 20px;
               margin: 0 20rpx;
            }
         }
      }
   }
   .uni-page-login.large-mode{
      .logo_input {
         height: 54rpx;
         width: 54rpx;
      }
   }
</style>