From da05dcffeabcb3c460e45666a4804f4ea5a4145a Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期三, 25 二月 2026 17:02:17 +0800
Subject: [PATCH] #

---
 pages/login/login.vue |  934 ++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 585 insertions(+), 349 deletions(-)

diff --git a/pages/login/login.vue b/pages/login/login.vue
index a0d860e..f015b1e 100644
--- a/pages/login/login.vue
+++ b/pages/login/login.vue
@@ -1,437 +1,673 @@
 <template>
 	<view class="bodyView">
+		<view>
+			<u-navbar
+				:fixed="true"
+				:title="$t('page.login')"
+				rightIcon="setting"
+				left-icon=""
+				:placeholder="true"
+				@rightClick="openSettings"
+			></u-navbar>
+		</view>
 		<view class="topView">
-			<image src="/static/img/login_top.png" mode="aspectFill">
-			</image>
+			<u--image
+				width="100%"
+				src="/static/img/login_top.png"
+				mode="aspectFill"
+			></u--image>
 		</view>
 		<view class="logoView">
-			<image src="/static/img/newLogo.png" mode="aspectFit">
-			</image>
+			<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
+				class="itemView"
+				style="margin-bottom: 20px"
+			>
+				<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>
-				<u-input clearable class="" v-model="user.userName" focus :placeholder="$t('login.inputUser')" />
+				<text class="textType3">{{ $t('login.user') }}:</text>
+				<u-input
+					clearable
+					class=""
+					v-model="user.userName"
+					focus
+					:placeholder="$t('login.inputUser')"
+				/>
 			</view>
 			<view class="itemView">
-				<view class="textType3">{{$t('login.pwd')}}:</view>
+				<text class="textType3">{{ $t('login.pwd') }}:</text>
 
-				<u-input :password="showPassword" v-model="user.password" :placeholder="$t('login.inputPwd')"
-					suffixIcon="map-fill" suffixIconStyle="color: #909399">
+				<u-input
+					:password="showPassword"
+					v-model="user.password"
+					:placeholder="$t('login.inputPwd')"
+					suffixIcon="map-fill"
+					suffixIconStyle="color: #909399"
+				>
 					<template slot="suffix">
-						<u-icon :name="pwdIcon" @click="changePassword"></u-icon>
+						<u-icon
+							:name="pwdIcon"
+							@click="changePassword"
+						></u-icon>
 					</template>
 				</u-input>
-
-
 			</view>
 			<view class="langAndRemView">
 				<view class="check">
 					<view>
-						<view>{{$t('login.remPwd')}}</view>
+						<text>{{ $t('login.remPwd') }}</text>
 					</view>
 					<view>
-						<u-switch space="2" size="20" v-model="remberPassword" activeColor="#f9ae3d"
-							inactiveColor="rgb(230, 230, 230)">
-						</u-switch>
-						<!-- <switch :checked='remberPassword' color="#FFCC33" style="transform:scale(0.7)"
-							@change="remberChange" /> -->
+						<u-switch
+							space="2"
+							size="20"
+							v-model="remberPassword"
+							activeColor="#f9ae3d"
+							inactiveColor="rgb(230, 230, 230)"
+						></u-switch>
 					</view>
 				</view>
 				<view class="langView">
 					<!-- 璇█閫夋嫨涓嬫媺鑿滃崟 -->
 					<view class="language-dropdown">
-						<view class="selected-language" @click="toggleLanguageDropdown">
-							<text>{{getCurrentLanguageText()}}</text>
-							<u-icon name="list" size="14" color="#707070"></u-icon>
+						<view
+							class="selected-language"
+							@click="toggleLanguageDropdown"
+						>
+							<text>{{ getCurrentLanguageText() }}</text>
+							<u-icon
+								name="list"
+								size="14"
+								color="#707070"
+							></u-icon>
 						</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>
-								<u-icon name="checkbox-mark" color="#007AFF"
-									v-if="item.code == applicationLocale"></u-icon>
+						<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>
+								<u-icon
+									name="checkbox-mark"
+									color="#007AFF"
+									v-if="item.code == applicationLocale"
+								></u-icon>
 							</view>
 						</view>
 					</view>
 				</view>
 			</view>
 			<view class="itemView">
-				<u-button class="loadingButton" @click="onLogin()" :loading="loading">{{btnText}}</u-button>
+				<u-button
+					class="loadingButton"
+					@click="onLogin()"
+					:loading="loading"
+				>
+					{{ btnText }}
+				</u-button>
 			</view>
 		</view>
+		<u-popup
+			:show="showAuth"
+			@close="showAuth = false"
+			mode="center"
+			:round="14"
+			:customStyle="{ width: '500rpx' }"
+		>
+			<view class="settings-popup">
+				<view class="settings-title">
+					<text class="settings-title-text">
+						{{ $t('settings.authTitle') || '韬唤楠岃瘉' }}
+					</text>
+				</view>
+				<view class="settings-item">
+					<u-input
+						v-model="authPassword"
+						type="password"
+						border="surround"
+						:placeholder="
+							$t('settings.inputAuthPwd') || '璇疯緭鍏ョ鐞嗗憳瀵嗙爜'
+						"
+					/>
+				</view>
+				<view class="settings-buttons">
+					<u-button
+						size="medium"
+						@click="showAuth = false"
+					>
+						{{ $t('common.cancel') || '鍙栨秷' }}
+					</u-button>
+					<view style="width: 20px"></view>
+					<u-button
+						size="medium"
+						type="primary"
+						@click="checkAuth"
+					>
+						{{ $t('common.confirm') || '纭' }}
+					</u-button>
+				</view>
+			</view>
+		</u-popup>
+		<u-popup
+			:show="showSettings"
+			@close="showSettings = false"
+			mode="center"
+			:round="14"
+			:closeOnClickOverlay="false"
+			:customStyle="{ width: '600rpx' }"
+		>
+			<view class="settings-popup">
+				<view class="settings-title">
+					<text class="settings-title-text">
+						{{ $t('settings.title') || '璁剧疆' }}
+					</text>
+				</view>
+				<view class="settings-item">
+					<text class="settings-label">
+						{{ $t('settings.ip') || 'IP鍦板潃' }}:
+					</text>
+					<u-input
+						v-model="settings.ip"
+						border="surround"
+					/>
+				</view>
+				<view class="settings-item">
+					<text class="settings-label">
+						{{ $t('settings.port') || '绔彛' }}:
+					</text>
+					<u-input
+						v-model="settings.port"
+						border="surround"
+					/>
+				</view>
+				<view class="settings-item">
+					<text class="settings-label">
+						{{ $t('settings.project') || '椤圭洰鍚�' }}:
+					</text>
+					<u-input
+						v-model="settings.project"
+						border="surround"
+					/>
+				</view>
+				<view class="settings-buttons">
+					<u-button
+						size="medium"
+						@click="showSettings = false"
+					>
+						{{ $t('common.cancel') || '鍙栨秷' }}
+					</u-button>
+					<view style="width: 20px"></view>
+					<u-button
+						size="medium"
+						type="primary"
+						@click="saveSettings"
+					>
+						{{ $t('common.confirm') || '纭' }}
+					</u-button>
+				</view>
+			</view>
+		</u-popup>
 		<u-toast ref="uToast"></u-toast>
 	</view>
 </template>
 
 <script>
-	import md5 from '../../static/js/md5.js'
-	import {
-		request
-	} from '../../common/request.js'
-	export default {
-		data() {
-			return {
-				showPassword: true,
-				loading: false,
-				showLanguageDropdown: false,
-				loginButton: 'login.login',
-				systemLocale: '',
-				applicationLocale: '',
-				remberPassword: true,
-				user: {
-					userName: '',
-					password: '',
+import md5 from '../../static/js/md5.js'
+import { login } from './api.js'
+export default {
+	data() {
+		return {
+			showPassword: true,
+			loading: false,
+			showLanguageDropdown: false,
+			loginButton: 'login.login',
+			systemLocale: '',
+			applicationLocale: '',
+			remberPassword: true,
+			user: {
+				userName: '',
+				password: ''
+			},
+			passwordIcon: 'eye-off',
+			showSettings: false,
+			settings: {
+				ip: '',
+				port: '',
+				project: ''
+			},
+			showAuth: false,
+			authPassword: ''
+		}
+	},
+	computed: {
+		locales() {
+			return [
+				{
+					text: this.$t('locale.auto'),
+					code: 'auto'
 				},
-				passwordIcon: 'eye-off'
+				{
+					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)
+		},
+		pwdIcon() {
+			return this.passwordIcon
+		}
+	},
+	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: {
+		openSettings() {
+			this.showAuth = true
+			this.authPassword = ''
+		},
+		checkAuth() {
+			// Default password: admin or 123456. Ideally from config.
+			if (
+				this.authPassword === 'admin' ||
+				this.authPassword === '123456'
+			) {
+				this.showAuth = false
+				this.loadSettings()
+			} else {
+				this.$refs.uToast.show({
+					type: 'error',
+					message: this.$t('settings.authError') || '瀵嗙爜閿欒'
+				})
 			}
 		},
-		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);
-			},
-			pwdIcon() {
-				return this.passwordIcon;
+		loadSettings() {
+			this.showSettings = true
+			let settings = uni.getStorageSync('app_settings')
+			if (!settings) {
+				settings = {
+					ip: '127.0.0.1',
+					port: '8080',
+					project: 'jshdasrs'
+				}
 			}
+			this.settings = settings
 		},
-		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;
+		saveSettings() {
+			uni.setStorageSync('app_settings', this.settings)
+			console.log(this.settings)
+			this.showSettings = false
+			this.$refs.uToast.show({
+				type: 'success',
+				message: this.$t('settings.saved') || '璁剧疆宸蹭繚瀛�'
 			})
+		},
+		async onLogin() {
+			try {
+				const res = await login(
+					{
+						username: this.user.userName,
+						password: md5.hex_md5(this.user.password)
+					},
+					{ custom: { catch: true } }
+				)
 
-			this.user = uni.getStorageSync('user')
-			if (!this.user) {
-				this.user = {
-					userName: '',
-					password: ''
+				this.loading = true
+				this.loginButton = 'login.loging'
+				uni.setStorageSync('token', res.data.accessToken)
+				uni.setStorageSync('userData', res.data.username)
+				if (this.remberPassword) {
+					uni.setStorageSync('user', this.user)
+				} else {
+					uni.removeStorageSync('user')
 				}
+				this.goHome()
+			} catch (e) {
+				// 鎷︽埅鍣ㄥ凡澶勭悊 toast
 			}
 		},
-		methods: {
-			async onLogin() {
-				const {
-					code,
-					data,
-					msg
-				} = await request('/login.action', {
-					username: this.user.userName,
-					password: md5.hex_md5(this.user.password),
-
-				}, 'GET')
-				if (code === 200) {
-					this.loading = true;
-					this.loginButton = 'login.loging';
-					uni.setStorageSync('token', data.accessToken);
-					uni.setStorageSync('userData', data.username);
-					if (this.remberPassword) {
-						uni.setStorageSync('user', this.user);
-					} else {
-						uni.removeStorageSync('user');
-					}
-					this.goHome()
-				} else {
-					this.$refs.uToast.show({
-						type: 'error',
-						message: "璇锋鏌ユ帴鍙h繛鎺�",
-						position: 'top'
-
-					});
-				}
-
-			},
-			goHome() {
+		goHome() {
+			setTimeout(() => {
+				this.$refs.uToast.show({
+					type: 'success',
+					message: '鐧诲綍鎴愬姛',
+					position: 'top'
+				})
 				setTimeout(() => {
-					this.$refs.uToast.show({
-						type: 'success',
-						message: "鐧诲綍鎴愬姛",
-						position: 'top'
-
-					});
-					setTimeout(() => {
-						uni.$u.route({
-							url: 'pages/index/index',
-							params: {
-								name: 'lisa'
-							}
-						})
-
-					}, 300)
-				}, 700)
-			},
-			remberChange(e) {
-				this.remberPassword = !this.remberPassword
-			},
-			// 鏄剧ず/闅愯棌瀵嗙爜
-			changePassword() {
-				this.passwordIcon = !this.showPassword ? 'eye-off' : 'eye'
-				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);
-							}
+					uni.$u.route({
+						type: 'reLaunch',
+						url: 'pages/home/home',
+						params: {
+							name: 'lisa'
 						}
 					})
-				} 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;
-							}
+				}, 300)
+			}, 700)
+		},
+		remberChange(e) {
+			this.remberPassword = !this.remberPassword
+		},
+		// 鏄剧ず/闅愯棌瀵嗙爜
+		changePassword() {
+			this.passwordIcon = !this.showPassword ? 'eye-off' : 'eye'
+			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(e.code);
-					this.$i18n.locale = e.code;
-					this.showLanguageDropdown = false;
-				}
-			},
+					}
+				})
+			} 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 lang="scss" scoped>
-	.helloText {
-		font-family: a2;
-		font-size: 20px;
-		margin-top: 10px;
-		margin-bottom: 5px;
-	}
+.helloText {
+	font-family: a2;
+	font-size: 20px;
+	margin-top: 10px;
+	margin-bottom: 5px;
+}
 
-	.introText {
-		font-family: a3;
-		font-size: 15px;
-		color: #ababab;
-	}
+.introText {
+	font-family: a3;
+	font-size: 15px;
+	color: #ababab;
+}
 
-	.textType3 {
-		font-family: a4;
-	}
+.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%;
-	}
+.bodyView {
+	flex: 1;
+	flex-direction: column;
+	width: 750rpx;
+}
 
-	.topView {
-		flex: 7;
-	}
+.bgImage {
+	position: fixed;
+	top: 0;
+	left: 0;
+	bottom: 0;
+	right: 0;
+}
 
-	.topView image {
-		width: 100%;
-	}
+.topView {
+	flex: 7;
+}
 
-	.logoView {
-		flex: 1;
-		display: flex;
-		justify-content: flex-end;
-		align-items: center;
+.topView image {
+	width: 100%;
+}
 
-	}
+.logoView {
+	flex: 1;
+	display: flex;
+	justify-content: flex-end;
+	align-items: flex-end;
+}
 
-	.logoView image {
-		width: 33%;
-		height: 50px;
-		margin-right: 20px;
-	}
+.logoView image {
+	width: 33%;
+	height: 50px;
+	margin-right: 20px;
+}
 
-	.bottomView {
-		flex: 15;
-		display: flex;
-		flex-direction: column;
-		justify-content: flex-start;
-		align-items: center;
-	}
+.bottomView {
+	flex: 15;
+	display: flex;
+	flex-direction: column;
+	justify-content: flex-start;
+	align-items: center;
+}
 
-	.itemView {
-		width: 90%;
-		height: 50px;
-		margin-bottom: 30px;
-	}
+.itemView {
+	width: 90%;
+	margin-bottom: 5px;
+}
 
-	.langAndRemView {
-		width: 90%;
-		display: flex;
-		justify-content: space-between;
-		align-items: center;
-	}
+.langAndRemView {
+	width: 90%;
+	display: flex;
+	flex-direction: row;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 5px;
+}
 
-	.langView {
-		width: 30%;
-	}
+.langView {
+	width: 30%;
+}
 
-	.textImage {
-		width: 60%;
-		height: 42px;
-		object-fit: cover;
-		margin-top: 20px;
-		margin-bottom: 30px;
-	}
+.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;
-	}
+.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-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-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;
+}
 
-	.uni-eye-active {
-		color: #007AFF;
-	}
+.eye-icon {
+	width: 20px;
+	height: 13px;
+	margin-left: 5px;
+}
 
-	.eye-icon {
-		width: 20px;
-		height: 13px;
-		margin-left: 5px;
-	}
+.loadingButton {
+	background-color: #ffda1e;
+	font-family: a1;
+}
 
-	.loadingButton {
-		background-color: #ffda1e;
-		font-family: a1;
-	}
+.check {
+	height: 100%;
+	display: flex;
+	flex-direction: row;
+	font-size: 18px;
+	color: #606266;
+	justify-content: flex-start;
+	align-items: center;
+}
 
-	.check {
+/* 璇█閫夋嫨涓嬫媺鑿滃崟 */
+.language-dropdown {
+	position: relative;
+	margin-bottom: 20rpx;
+	z-index: 10;
+}
 
-		height: 100%;
-		display: flex;
-		font-size: 18px;
-		color: #606266;
-		justify-content: flex-start;
-		align-items: center;
+.selected-language {
+	display: flex;
+	flex-direction: row;
+	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-dropdown {
-		position: relative;
-		margin-bottom: 20rpx;
-		z-index: 10;
-	}
+.language-option {
+	display: flex;
+	flex-direction: row;
+	justify-content: space-between;
+	align-items: center;
+	padding: 15rpx 20rpx;
+	border-bottom: 1px solid #f0f0f0;
+}
 
-	.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-option:last-child {
+	border-bottom: none;
+}
 
-	.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:active {
+	background-color: #f5f5f5;
+}
 
-	.language-option {
-		display: flex;
-		justify-content: space-between;
-		align-items: center;
-		padding: 15rpx 20rpx;
-		border-bottom: 1px solid #f0f0f0;
-	}
+.settings-popup {
+	padding: 20px;
+	background-color: #ffffff;
+	border-radius: 10px;
+	display: flex;
+	flex-direction: column;
+}
 
-	.language-option:last-child {
-		border-bottom: none;
-	}
+.settings-title {
+	margin-bottom: 20px;
+	align-items: center;
+	justify-content: center;
+}
 
-	.language-option:active {
-		background-color: #f5f5f5;
-	}
-</style>
\ No newline at end of file
+.settings-title-text {
+	font-size: 18px;
+	font-weight: bold;
+}
+
+.settings-item {
+	margin-bottom: 15px;
+}
+
+.settings-label {
+	margin-bottom: 5px;
+	font-size: 14px;
+	color: #606266;
+}
+
+.settings-buttons {
+	display: flex;
+	flex-direction: row;
+	justify-content: center;
+	margin-top: 10px;
+}
+</style>

--
Gitblit v1.9.1