| <template> | 
|     <view class="bodyView"> | 
|         <view class="topView"> | 
|             <image src="/static/img/login_top.png" mode="aspectFill">                 | 
|             </image> | 
|         </view> | 
|         <view class="logoView"> | 
|             <image src="/static/img/newLogo.png" mode="aspectFit"> | 
|             </image> | 
|         </view> | 
|         <view class="bottomView"> | 
|             <view class="itemView" style="margin-bottom: 40px;"> | 
|                 <view class="helloText">{{$t('index.hello')}}</view> | 
|                 <view class="introText">{{$t('index.intro')}}</view> | 
|             </view> | 
|             <view class="itemView"> | 
|                 <view class="textType3">{{$t('login.user')}}:</view> | 
|                 <view class="input-wrapper"> | 
|                     <input class="uni-input" v-model="user.userName" focus :placeholder="$t('login.inputUser')" /> | 
|                 </view> | 
|             </view> | 
|             <view class="itemView"> | 
|                 <view class="textType3">{{$t('login.pwd')}}:</view> | 
|                 <view class="input-wrapper"> | 
|                     <input class="uni-input" v-model="user.password" :placeholder="$t('login.inputPwd')" :password="!showPassword" /> | 
|                     <image src="/static/img/login_noteye.png" class="eye-icon" v-if="showPassword" | 
|                         @click="changePassword"></image> | 
|                     <image src="/static/img/login_eye.png" class="eye-icon" v-if="!showPassword" | 
|                         @click="changePassword"></image> | 
|                 </view> | 
|             </view> | 
|             <view class="langAndRemView"> | 
|                 <view class="check"> | 
|                     <view > | 
|                         <view>{{$t('login.remPwd')}}</view> | 
|                     </view> | 
|                     <view> | 
|                         <switch :checked='remberPassword' color="#FFCC33" style="transform:scale(0.7)" @change="remberChange" /> | 
|                     </view> | 
|                 </view> | 
|                 <view class="langView"> | 
|                     <!-- 语言选择下拉菜单 --> | 
|                     <view class="language-dropdown"> | 
|                         <view class="selected-language" @click="toggleLanguageDropdown"> | 
|                             <text>{{getCurrentLanguageText()}}</text> | 
|                             <uni-icons type="bottom" size="14" color="#707070"></uni-icons> | 
|                         </view> | 
|                         <view class="language-options" v-if="showLanguageDropdown"> | 
|                             <view class="language-option" v-for="(item, index) in locales" :key="index" @click="onLocaleChange(item)"> | 
|                                 <text>{{item.text}}</text> | 
|                                 <uni-icons type="checkmarkempty" size="14" color="#007AFF" v-if="item.code == applicationLocale"></uni-icons> | 
|                             </view> | 
|                         </view> | 
|                     </view> | 
|                 </view> | 
|             </view> | 
|             <view class="itemView"> | 
|                 <button class="loadingButton" @click="onLogin()"  :loading="loading">{{btnText}}</button> | 
|             </view> | 
|         </view> | 
|     </view> | 
| </template> | 
|   | 
| <script> | 
|     import md5 from '../../static/js/md5.js' | 
|     import { | 
|         request | 
|     } from '../../common/request.js' | 
| export default{ | 
|     data(){ | 
|         return{ | 
|             showPassword: false, | 
|             loading: false, | 
|             showLanguageDropdown: false, | 
|             loginButton: 'login.login', | 
|             systemLocale: '', | 
|             applicationLocale: '', | 
|             remberPassword: true, | 
|             user: { | 
|                 userName: '', | 
|                 password: '', | 
|             }, | 
|         } | 
|     }, | 
|     computed:{ | 
|       locales() { | 
|         return [{ | 
|             text: this.$t('locale.auto'), | 
|             code: 'auto' | 
|           }, { | 
|             text: this.$t('locale.en'), | 
|             code: 'en' | 
|           }, | 
|           { | 
|             text: this.$t('locale.zh-hans'), | 
|             code: 'zh-Hans' | 
|           }, | 
|           { | 
|             text: this.$t('locale.zh-hant'), | 
|             code: 'zh-Hant' | 
|           }, | 
|           { | 
|             text: this.$t('locale.ja'), | 
|             code: 'ja' | 
|           } | 
|         ] | 
|       }, | 
|       btnText() {              | 
|               return this.$t(this.loginButton);  | 
|         } | 
|     }, | 
|     onLoad(){ | 
|         let systemInfo = uni.getSystemInfoSync(); | 
|         this.systemLocale = systemInfo.language; | 
|         this.applicationLocale = uni.getLocale(); | 
|         this.isAndroid = systemInfo.platform.toLowerCase() === 'android'; | 
|         uni.onLocaleChange((e) => { | 
|           this.applicationLocale = e.locale; | 
|         }) | 
|          | 
|         this.user = uni.getStorageSync('user')         | 
|         if (!this.user) { | 
|             this.user = { | 
|                 userName: '', | 
|                 password: '' | 
|             } | 
|         } | 
|     }, | 
|     methods:{ | 
|         async onLogin() { | 
|             const { | 
|                 code, | 
|                 data, | 
|                 msg | 
|             } = await request('/login', { | 
|                 username: this.user.userName, | 
|                 password: this.user.password, | 
|             }) | 
|             if (code === 200) { | 
|                 this.loading = true; | 
|                 this.loginButton = 'login.loging';                     | 
|                 uni.setStorageSync('token', data.accessToken);     | 
|                 uni.setStorageSync('userData', data.user);                 | 
|                 if (this.remberPassword) {                         | 
|                     uni.setStorageSync('user', this.user); | 
|                 } else { | 
|                     uni.removeStorageSync('user'); | 
|                 } | 
|                 this.goHome() | 
|             } else { | 
|                 uni.showToast({ | 
|                     title: msg | 
|                 }) | 
|             } | 
|          | 
|         }, | 
|         goHome() { | 
|             setTimeout(() => { | 
|                 // this.getAuth2() | 
|                 this.getFields() | 
|                 uni.showToast({ | 
|                     title: '登录成功' | 
|                 }) | 
|                 setTimeout(() => { | 
|                     uni.reLaunch({ | 
|                         url: '../home/index' | 
|                     }); | 
|                 }, 300) | 
|             }, 700) | 
|         }, | 
|         async getFields() { | 
|             const { | 
|                 code, | 
|                 data, | 
|                 msg | 
|             } = await request('/dynamic/fields', {}, 'get') | 
|             if (code === 200) { | 
|                 this.$store.commit('user/setFields', data) | 
|             } else { | 
|                 uni.showToast({ | 
|                     title: msg | 
|                 }) | 
|             } | 
|         }, | 
|         remberChange(e) { | 
|             this.remberPassword = !this.remberPassword | 
|         }, | 
|         // 显示/隐藏密码 | 
|         changePassword() { | 
|             this.showPassword = !this.showPassword; | 
|         }, | 
|         localChange() { | 
|             console.log(this.local) | 
|           if (this.isAndroid) { | 
|             uni.showModal({ | 
|               content: this.$t('index.language-change-confirm'), | 
|               success: (res) => { | 
|                 if (res.confirm) { | 
|                   uni.setLocale(this.local.value); | 
|                 } | 
|               } | 
|             }) | 
|           } else { | 
|             uni.setLocale(this.local.value); | 
|             this.$i18n.locale = this.local.value; | 
|           } | 
|         }, | 
|         // 切换语言下拉菜单显示状态 | 
|         toggleLanguageDropdown() { | 
|             this.showLanguageDropdown = !this.showLanguageDropdown; | 
|         }, | 
|          | 
|         // 获取当前选择的语言文本 | 
|         getCurrentLanguageText() { | 
|             const currentLocale = this.locales.find(item => item.code === this.applicationLocale); | 
|             return currentLocale ? currentLocale.text : this.$t('locale.auto'); | 
|         }, | 
|          | 
|         // 语言选择改变 | 
|         onLocaleChange(e) { | 
|             if (this.isAndroid) { | 
|                 uni.showModal({ | 
|                     content: this.$t('index.language-change-confirm'), | 
|                     success: (res) => { | 
|                         if (res.confirm) { | 
|                             uni.setLocale(e.code); | 
|                             this.showLanguageDropdown = false; | 
|                         } | 
|                     } | 
|                 }) | 
|             } else { | 
|                 uni.setLocale(e.code); | 
|                 this.$i18n.locale = e.code; | 
|                 this.showLanguageDropdown = false; | 
|             } | 
|         }, | 
|     } | 
| } | 
| </script> | 
|   | 
| <style>     | 
|     .helloText{ | 
|         font-family: a2; | 
|         font-size: 20px; | 
|         margin-top: 10px; | 
|         margin-bottom: 5px; | 
|     } | 
|     .introText{ | 
|         font-family: a3; | 
|         font-size: 15px; | 
|         color: #ababab;         | 
|     } | 
|     .textType3{ | 
|         font-family: a4; | 
|     } | 
|     .bodyView{ | 
|         display: flex; | 
|         flex-direction: column; | 
|         background-image: url("/static/img/login_backg.png"); | 
|         background-repeat: no-repeat; | 
|         background-size: cover; | 
|         background-position: center; | 
|         height: 100vh; | 
|         width: 100%; | 
|     } | 
|     .topView{ | 
|         flex: 7; | 
|     } | 
|     .topView image{ | 
|         width: 100%; | 
|     } | 
|     .logoView{ | 
|         flex: 1; | 
|         display: flex; | 
|         justify-content: flex-end; | 
|         align-items: center; | 
|          | 
|     } | 
|     .logoView image{ | 
|         width: 33%;     | 
|         height: 50px; | 
|         margin-right: 20px; | 
|     } | 
|     .bottomView{ | 
|         flex: 15; | 
|         display: flex; | 
|         flex-direction: column; | 
|         justify-content: flex-start; | 
|         align-items: center; | 
|     } | 
|     .itemView{ | 
|         width: 90%; | 
|         height: 50px; | 
|         margin-bottom: 30px; | 
|     } | 
|     .langAndRemView{ | 
|         width: 90%;         | 
|         display: flex; | 
|         justify-content: space-between; | 
|         align-items: center; | 
|     } | 
|     .langView{ | 
|         width: 30%; | 
|     } | 
|     .textImage{ | 
|         width: 60%; | 
|         height: 42px; | 
|         object-fit: cover;     | 
|         margin-top: 20px; | 
|         margin-bottom: 30px; | 
|     } | 
|      | 
|     .input-wrapper { | 
|         /* #ifndef APP-NVUE */ | 
|         display: flex; | 
|         /* #endif */ | 
|         padding: 8px 13px; | 
|         flex-direction: row; | 
|         flex-wrap: nowrap; | 
|         background-color: #FFFFFF; | 
|         border-radius: 10px; | 
|         height: 45px; | 
|         align-items: center; | 
|         margin-top: 5px; | 
|     } | 
|      | 
|     .uni-input { | 
|         height: 28px; | 
|         line-height: 28px; | 
|         font-size: 15px; | 
|         padding: 0px; | 
|         flex: 1; | 
|         background-color: #FFFFFF; | 
|          | 
|     } | 
|      | 
|     .uni-icon { | 
|         font-family: uniicons; | 
|         font-size: 24px; | 
|         font-weight: normal; | 
|         font-style: normal; | 
|         width: 24px; | 
|         height: 24px; | 
|         line-height: 24px; | 
|         color: #999999; | 
|     } | 
|      | 
|     .uni-eye-active { | 
|         color: #007AFF; | 
|     } | 
|      | 
|     .eye-icon { | 
|         width: 20px; | 
|         height: 13px; | 
|         margin-left: 5px; | 
|     } | 
|     .loadingButton{ | 
|         background-color: #ffda1e; | 
|         font-family: a1; | 
|     } | 
|     .check { | 
|          | 
|         height: 100%; | 
|         display: flex; | 
|         font-size: 18px; | 
|         color: #606266; | 
|         justify-content: flex-start; | 
|         align-items: center; | 
|          | 
|     } | 
|     /* 语言选择下拉菜单 */ | 
|     .language-dropdown { | 
|         position: relative; | 
|         margin-bottom: 20rpx; | 
|         z-index: 10; | 
|     } | 
|      | 
|     .selected-language { | 
|         display: flex; | 
|         justify-content: space-between; | 
|         align-items: center; | 
|         padding: 15rpx 20rpx; | 
|         background-color: #f8f8f8; | 
|         border-radius: 8rpx; | 
|         border: 1px solid #e0e0e0; | 
|     } | 
|      | 
|     .language-options { | 
|         position: absolute; | 
|         bottom: 100%; | 
|         left: 0; | 
|         right: 0; | 
|         background-color: #ffffff; | 
|         border-radius: 8rpx; | 
|         box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); | 
|         border: 1px solid #e0e0e0; | 
|         margin-bottom: 5rpx; | 
|     } | 
|      | 
|     .language-option { | 
|         display: flex; | 
|         justify-content: space-between; | 
|         align-items: center; | 
|         padding: 15rpx 20rpx; | 
|         border-bottom: 1px solid #f0f0f0; | 
|     } | 
|      | 
|     .language-option:last-child { | 
|         border-bottom: none; | 
|     } | 
|      | 
|     .language-option:active { | 
|         background-color: #f5f5f5; | 
|     } | 
| </style> |