New file |
| | |
| | | <template> |
| | | <view class="bodyView"> |
| | | <view class="topView"> |
| | | <cover-image src="/static/img/login_top.png"> |
| | | </cover-image> |
| | | </view> |
| | | <view class="logoView"> |
| | | <cover-image src="/static/img/newLogo.png"> |
| | | </cover-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" :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; |
| | | }) |
| | | }, |
| | | methods:{ |
| | | 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: a3; |
| | | } |
| | | .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 cover-image{ |
| | | width: 100%; |
| | | height: 100%; |
| | | |
| | | object-fit: cover; |
| | | } |
| | | .logoView{ |
| | | flex: 1; |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | align-items: center; |
| | | |
| | | } |
| | | .logoView cover-image{ |
| | | width: 33%; |
| | | height: 35px; |
| | | object-fit: cover; |
| | | 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; |
| | | |
| | | } |
| | | .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> |