From a232dcf6d4a59c7c47e06b6619eb7566163f95b4 Mon Sep 17 00:00:00 2001
From: skyouc <creaycat@gmail.com>
Date: 星期三, 05 十一月 2025 19:26:46 +0800
Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/pda-master into devlop

---
 pages/login/index.vue |  415 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 415 insertions(+), 0 deletions(-)

diff --git a/pages/login/index.vue b/pages/login/index.vue
new file mode 100644
index 0000000..c807b4b
--- /dev/null
+++ b/pages/login/index.vue
@@ -0,0 +1,415 @@
+<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>
\ No newline at end of file

--
Gitblit v1.9.1