From fe75cffbf3bae6777aa2794fd89fa5dc37f5df8d Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 15 七月 2025 10:11:23 +0800
Subject: [PATCH] 项目初始化

---
 src/pages_template/pages/login/index2.vue |  662 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 662 insertions(+), 0 deletions(-)

diff --git a/src/pages_template/pages/login/index2.vue b/src/pages_template/pages/login/index2.vue
new file mode 100644
index 0000000..17922c7
--- /dev/null
+++ b/src/pages_template/pages/login/index2.vue
@@ -0,0 +1,662 @@
+<template>
+	<view>
+		<view class="normal-login-container " v-if="page == 'login'">
+			<view class="left" @click="back">
+				<image src="../../../static/uview/demo/backTop.png" mode="" style="height: 30rpx;"></image>
+			</view>
+			<view class="scale-in-center">
+				<view class="logo-content align-center justify-center flex">
+					<text class="title">宸ヤ綔浜哄憳鍏ュ彛</text>
+				</view>
+				<view class="login-form-content">
+					<view class="input-item flex align-center">
+						<view class="iconfont icon-user icon"></view>
+						<input v-model="loginForm.username" class="input" type="text" placeholder="璇疯緭鍏ヨ处鍙�"
+							maxlength="30" />
+					</view>
+					<view class="input-item flex align-center">
+						<view class="iconfont icon-password icon"></view>
+						<input v-model="loginForm.password" type="password" class="input" placeholder="璇疯緭鍏ュ瘑鐮�"
+							maxlength="20" />
+					</view>
+					<view class="input-item flex align-center" style="width: 60%;margin: 0px;" v-if="captchaEnabled">
+						<view class="iconfont icon-code icon"></view>
+						<input v-model="loginForm.code" type="number" class="input" placeholder="璇疯緭鍏ラ獙璇佺爜"
+							maxlength="4" />
+						<view class="login-code">
+							<image :src="codeUrl" @click="getCode" class="login-code-img"></image>
+						</view>
+					</view>
+					<view class="action-btn">
+						<button @click="handleLogin" class="login-btn cu-btn block bg-blue lg round">鐧诲綍</button>
+					</view>
+				</view>
+			</view>
+		</view>
+
+
+		<!-- 鐧诲綍 -->
+		<view v-else>
+			<view class="container">
+				<view class="cover slide-top1" :style="'animation-play-state:' + play[2]">
+					<view class="masking slide-top" :class="[collapsedClass, { animating: isAnimating }]"
+						ref="fixedViewRef" :style="'animation-play-state:' + play[0]">
+						<uni-row>
+							<text class="text-first">娆㈣繋浣跨敤</text>
+							<text class="text-second">鏍″洯璁垮</text>
+							<text class="text-third">棰勭害绯荤粺</text>
+							<view :class="{ active: isActive === true, button: isActive !== true }" @click="startplay"
+								:style="'animation-play-state:' + play[1]">
+								<uni-row>
+									<text class="text-fifth">璁垮鐧诲綍</text>
+								</uni-row>
+							</view>
+							<view class="shadow1" :style="'animation-play-state:' + play[1]" />
+							<view class="shadow2" :style="'animation-play-state:' + play[1]" />
+							<view class="shadow3" :style="'animation-play-state:' + play[1]" />
+
+							<image
+								style="width: 100%;height: 1050rpx;opacity: 0.05;border-radius: 0 0 400rpx 400rpx;position: absolute;"
+								src="../../../static/uview/common/gray-logo.png"></image>
+							<text class="text-forth" @click="login()">璐﹀彿瀵嗙爜鐧诲綍</text>
+						</uni-row>
+					</view>
+				</view>
+				<view class="sec-masking">
+					<uni-row>
+						<text class="text-sixth">鐗堟湰鍙�: v1.0</text>
+					</uni-row>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script setup>
+import { ref, reactive, computed, onMounted } from 'vue'
+import useUserStore from '@/store/modules/user'
+import tab from '@/plugins/tab'
+import modal from '@/plugins/modal'
+
+const src = ref("staticimagessoutheast.jpg")
+const isActive = ref(false)
+const isFixedViewVisible = ref(true)
+const animationType = ref("up") // 鍙�夊�硷細right 鎴� up
+const isAnimating = ref(false) // 鎺у埗鍔ㄧ敾鎵ц鐘舵��
+const play = ref(["paused", "paused", "paused"])
+const page = ref("index")
+
+const codeUrl = ref("")
+const captchaEnabled = ref(true)
+const loginForm = reactive({
+	username: "admin",
+	password: "admin123",
+	code: "",
+	uuid: ''
+})
+
+const collapsedClass = computed(() => {
+	return isFixedViewVisible.value ? "" : `collapsed-${animationType.value}`;
+})
+
+onMounted(() => {
+	getCode()
+})
+
+const login = () => {
+	play.value[2] = "running"
+	setTimeout(() => { page.value = 'login' }, 1000)
+}
+
+const back = () => {
+	page.value = 'index'
+	play.value[0] = "paused"
+	play.value[1] = "paused"
+	play.value[2] = "paused"
+}
+const startplay = () => {
+	play.value[1] = "running"
+	isActive.value = true;
+	setTimeout(() => { isActive.value = false; }, 300);
+	if (isAnimating.value) { return; }
+	isAnimating.value = false; // 寮�濮嬪姩鐢绘墽琛�
+	play.value[0] = "running"
+	isFixedViewVisible.value = !isFixedViewVisible.value;
+	setTimeout(() => { uni.navigateBack({ delta: 1 }); }, 1000)
+}
+
+// 鑾峰彇鍥惧舰楠岃瘉鐮�
+const getCode = () => {
+	let res = {}
+	captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled
+	if (captchaEnabled.value) {
+		codeUrl.value = 'data:image/gif;base64,' + res.img
+		loginForm.uuid = res.uuid
+	}
+}
+
+// 鐧诲綍鏂规硶
+const handleLogin = async () => {
+	if (loginForm.username === "") {
+		modal.msgError("璇疯緭鍏ユ偍鐨勮处鍙�")
+	} else if (loginForm.password === "") {
+		modal.msgError("璇疯緭鍏ユ偍鐨勫瘑鐮�")
+	} else if (loginForm.code === "" && captchaEnabled.value) {
+		modal.msgError("璇疯緭鍏ラ獙璇佺爜")
+	} else {
+		modal.loading("鐧诲綍涓紝璇疯�愬績绛夊緟...")
+		pwdLogin()
+	}
+}
+
+// 瀵嗙爜鐧诲綍
+const pwdLogin = async () => {
+	useUserStore().login(loginForm).then(() => {
+		modal.closeLoading()
+		loginSuccess()
+	}).catch(() => {
+		if (captchaEnabled.value) {
+			getCode()
+		}
+	})
+}
+
+// 鐧诲綍鎴愬姛鍚庯紝澶勭悊鍑芥暟
+const loginSuccess = (result) => {
+	// 璁剧疆鐢ㄦ埛淇℃伅
+	useUserStore().getInfo().then(res => {
+		tab.reLaunch('/pages/index')
+	})
+}
+</script>
+<style lang="scss">
+page {
+	background-color: #ffffff;
+}
+
+.left {
+	display: flex;
+	width: 50rpx;
+	height: 50rpx;
+	position: fixed;
+	top: 0px;
+	padding: 10rpx;
+}
+
+.cover {
+	position: absolute;
+	width: 100%;
+	height: 1250rpx;
+	z-index: 9997;
+}
+
+.normal-login-container {
+	width: 100%;
+	margin-top: 200rpx;
+
+	.logo-content {
+		width: 100%;
+		font-size: 21px;
+		text-align: center;
+		padding-top: 15%;
+
+		image {
+			border-radius: 4px;
+		}
+
+		.title {
+			margin-left: 10px;
+		}
+	}
+
+	.login-form-content {
+		text-align: center;
+		margin: 20px auto;
+		margin-top: 15%;
+		width: 80%;
+
+		.input-item {
+			margin: 20px auto;
+			background-color: #f5f6f7;
+			height: 45px;
+			border-radius: 20px;
+
+			.icon {
+				font-size: 38rpx;
+				margin-left: 10px;
+				color: #999;
+			}
+
+			.input {
+				width: 100%;
+				font-size: 14px;
+				line-height: 20px;
+				text-align: left;
+				padding-left: 15px;
+			}
+
+		}
+
+		.login-btn {
+			margin-top: 40px;
+			height: 45px;
+		}
+
+		.xieyi {
+			color: #333;
+			margin-top: 20px;
+		}
+
+		.login-code {
+			height: 38px;
+			float: right;
+
+			.login-code-img {
+				height: 38px;
+				position: absolute;
+				margin-left: 10px;
+				width: 200rpx;
+			}
+		}
+	}
+}
+
+
+
+
+
+
+
+
+
+.container {
+	position: relative;
+}
+
+.active {
+	position: absolute;
+	width: 280rpx;
+	height: 280rpx;
+	left: 50%;
+	margin-left: -140rpx;
+	top: 533rpx;
+	bottom: 533rpx;
+	border-radius: 50%;
+	z-index: 9999;
+
+	background: linear-gradient(180deg,
+			rgba(110, 109, 122, 0.595),
+			rgba(46, 87, 190, 0.714) 70.792%,
+			rgb(17, 120, 222) 100%);
+	box-shadow: inset 0 0 10px 5px rgba(101, 97, 97, 0.5);
+}
+
+.masking {
+	position: absolute;
+	top: -200rpx;
+	width: 100%;
+	height: 1250rpx;
+	background-color: #9acafc;
+	border-radius: 0 0 400rpx 400rpx;
+	box-shadow: 0px 5px 8px rgba(0, 0, 0, 0.27);
+	transition: transform 0.3s ease-out;
+	z-index: 9998;
+	padding: 200rpx 0 0 0;
+}
+
+.collapsed-up {
+	transform: translateY(-100%);
+}
+
+.button {
+	position: absolute;
+	width: 280rpx;
+	height: 280rpx;
+	left: 50%;
+	margin-left: -140rpx;
+	top: 533rpx;
+	bottom: 533rpx;
+	border-radius: 50%;
+	transition: background-color 0.3s;
+	z-index: 9999;
+
+	background: linear-gradient(180deg,
+			rgba(60, 53, 239, 0.595),
+			rgba(63, 117, 255, 0.714) 70.792%,
+			rgb(70, 161, 253) 100%);
+	// box-shadow: 0px 0px 62rpx rgba(1, 7, 22, 0.468);
+
+	box-shadow: 0 0 10px rgba(0, 0, 0, .3) inset;
+
+}
+
+.shadow1 {
+	position: absolute;
+	width: 280rpx;
+	height: 280rpx;
+	left: 50%;
+	margin-left: -140rpx;
+	top: 533rpx;
+	bottom: 533rpx;
+	border-radius: 50%;
+	border-width: 4rpx;
+	border-color: rgb(70, 161, 253);
+	transition: background-color 0.3s;
+	z-index: 9998;
+	background-color: rgba(70, 161, 253, 0);
+
+	// box-shadow: 0px 0px 62rpx rgba(1, 7, 22, 0.468);
+
+	box-shadow: 0 0 10px rgba(0, 0, 0, .3) inset;
+	-webkit-animation-name: 'ripple1';
+	/*鍔ㄧ敾灞炴�у悕锛屼篃灏辨槸鎴戜滑鍓嶉潰keyframes瀹氫箟鐨勫姩鐢诲悕*/
+	-webkit-animation-duration: 0.3s;
+	/*鍔ㄧ敾鎸佺画鏃堕棿*/
+	-webkit-animation-timing-function: ease;
+	/*鍔ㄧ敾棰戠巼锛屽拰transition-timing-function鏄竴鏍风殑*/
+	-webkit-animation-delay: 0s;
+	/*鍔ㄧ敾寤惰繜鏃堕棿*/
+	-webkit-animation-direction: normal;
+	/*瀹氫箟鍔ㄧ敾鏂瑰紡*/
+}
+
+.shadow2 {
+	position: absolute;
+	width: 280rpx;
+	height: 280rpx;
+	left: 50%;
+	margin-left: -140rpx;
+	top: 533rpx;
+	bottom: 533rpx;
+	border-radius: 50%;
+	border-width: 4rpx;
+	border-color: rgb(70, 161, 253);
+	transition: background-color 0.3s;
+	z-index: 9998;
+	background-color: rgba(70, 161, 253, 0);
+
+	// box-shadow: 0px 0px 62rpx rgba(1, 7, 22, 0.468);
+
+	box-shadow: 0 0 10px rgba(0, 0, 0, .3) inset;
+	-webkit-animation-name: 'ripple2';
+	/*鍔ㄧ敾灞炴�у悕锛屼篃灏辨槸鎴戜滑鍓嶉潰keyframes瀹氫箟鐨勫姩鐢诲悕*/
+	-webkit-animation-duration: 0.4s;
+	/*鍔ㄧ敾鎸佺画鏃堕棿*/
+	-webkit-animation-timing-function: ease;
+	/*鍔ㄧ敾棰戠巼锛屽拰transition-timing-function鏄竴鏍风殑*/
+	-webkit-animation-delay: 0.1s;
+	/*鍔ㄧ敾寤惰繜鏃堕棿*/
+	-webkit-animation-direction: normal;
+	/*瀹氫箟鍔ㄧ敾鏂瑰紡*/
+}
+
+.shadow3 {
+	position: absolute;
+	width: 280rpx;
+	height: 280rpx;
+	left: 50%;
+	margin-left: -140rpx;
+	top: 533rpx;
+	bottom: 533rpx;
+	border-radius: 50%;
+	border-width: 4rpx;
+	border-color: rgb(70, 161, 253);
+	transition: background-color 0.3s;
+	z-index: 9998;
+	background-color: rgba(70, 161, 253, 0);
+
+	// box-shadow: 0px 0px 62rpx rgba(1, 7, 22, 0.468);
+
+	box-shadow: 0 0 10px rgba(0, 0, 0, .3) inset;
+	-webkit-animation-name: 'ripple3';
+	/*鍔ㄧ敾灞炴�у悕锛屼篃灏辨槸鎴戜滑鍓嶉潰keyframes瀹氫箟鐨勫姩鐢诲悕*/
+	-webkit-animation-duration: 0.5s;
+	/*鍔ㄧ敾鎸佺画鏃堕棿*/
+	-webkit-animation-timing-function: ease;
+	/*鍔ㄧ敾棰戠巼锛屽拰transition-timing-function鏄竴鏍风殑*/
+	-webkit-animation-delay: 0.2s;
+	/*鍔ㄧ敾寤惰繜鏃堕棿*/
+	-webkit-animation-direction: normal;
+	/*瀹氫箟鍔ㄧ敾鏂瑰紡*/
+}
+
+.button.disabled {
+	pointer-events: none;
+	/* 绂佺敤鎸夐挳鐨勭偣鍑讳簨浠� */
+	opacity: 0.5;
+	/* 鍗婇�忔槑鏁堟灉 */
+}
+
+.text-first {
+	position: absolute;
+	width: 256rpx;
+	height: 84rpx;
+	left: 50%;
+	transform: translateX(-50%);
+	top: 250rpx;
+	bottom: 986.67rpx;
+
+	color: rgb(255, 255, 255);
+	font-family: "Microsoft YaHei";
+	font-size: 64rpx;
+	font-weight: 400;
+	line-height: 84rpx;
+	letter-spacing: 0rpx;
+	text-align: center;
+}
+
+.text-second {
+	position: absolute;
+	width: 256rpx;
+	height: 84rpx;
+	left: 50%;
+	transform: translateX(-50%);
+	top: 350rpx;
+	bottom: 986.67rpx;
+
+	color: rgb(255, 255, 255);
+	font-family: "Microsoft YaHei";
+	font-size: 64rpx;
+	font-weight: 400;
+	line-height: 84rpx;
+	letter-spacing: 0rpx;
+	text-align: center;
+}
+
+.text-third {
+	position: absolute;
+	width: 200rpx;
+	height: 60rpx;
+	left: 50%;
+	transform: translateX(-50%);
+	top: 450rpx;
+	bottom: 615rpx;
+	margin: 0 auto;
+
+	color: rgb(255, 255, 255);
+	font-family: "Microsoft YaHei";
+	font-size: 50rpx;
+	font-weight: 400;
+	line-height: 60rpx;
+	letter-spacing: 0rpx;
+	text-align: center;
+}
+
+.text-forth {
+	position: absolute;
+	width: 180rpx;
+	height: 36rpx;
+	left: 0;
+	right: 0;
+	top: 948rpx;
+	bottom: 330rpx;
+	margin: 0 auto;
+
+	color: rgb(255, 255, 255);
+	font-family: "Microsoft YaHei";
+	font-size: 27rpx;
+	font-weight: 400;
+	line-height: 36rpx;
+	letter-spacing: 0rpx;
+	text-align: center;
+	text-decoration-line: underline;
+}
+
+.text-fifth {
+	position: absolute;
+	width: 120rpx;
+	height: 150rpx;
+	left: 0;
+	right: 0;
+	top: 60rpx;
+	bottom: 418rpx;
+	margin: 0 auto;
+
+	color: rgb(255, 255, 255);
+	font-family: "Microsoft YaHei";
+	font-size: 60rpx;
+	font-weight: 400;
+	line-height: 80rpx;
+	letter-spacing: 0rpx;
+	text-align: center;
+}
+
+.text-sixth {
+	position: absolute;
+	width: 100rpx;
+	height: 17rpx;
+	margin: 0 auto;
+	top: 710rpx;
+	left: 50%;
+	transform: translateX(-50%);
+	padding: 0 179rpx 7rpx 180rpx;
+	z-index: 9997;
+
+	color: rgb(15, 15, 15);
+	font-family: "Microsoft YaHei";
+	font-size: 17rpx;
+	font-weight: 400;
+	line-height: 17rpx;
+	letter-spacing: 0;
+	text-align: left;
+}
+
+.sec-masking {
+	position: fixed;
+	bottom: 0;
+	width: 100%;
+	height: 750rpx;
+	background-color: #ffffff;
+	z-index: 9996;
+}
+
+.slide-top {
+	-webkit-animation: slide-top 1s cubic-bezier(0.600, -0.280, 0.735, 0.045) both;
+	animation: slide-top 1s cubic-bezier(0.600, -0.280, 0.735, 0.045) both;
+}
+
+.slide-top1 {
+	-webkit-animation: slide-top1 1s cubic-bezier(0.600, -0.280, 0.735, 0.045) both;
+	animation: slide-top1 1s cubic-bezier(0.600, -0.280, 0.735, 0.045) both;
+}
+
+.scale-in-center {
+	animation: scale-in-center 0.4s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
+}
+
+@-webkit-keyframes slide-top {
+	0% {
+		-webkit-transform: translateY(0);
+		transform: translateY(0);
+	}
+
+	100% {
+		-webkit-transform: translateY(-1050px);
+		transform: translateY(-1050px);
+	}
+}
+
+@-webkit-keyframes slide-top1 {
+	0% {
+		-webkit-transform: translateY(0);
+		transform: translateY(0);
+	}
+
+	100% {
+		-webkit-transform: translateY(-1050px);
+		transform: translateY(-1050px);
+	}
+}
+
+@keyframes ripple1 {
+	0% {
+		transform: scale(1);
+	}
+
+	100% {
+		transform: scale(1.4);
+		opacity: 0;
+
+	}
+}
+
+@keyframes ripple2 {
+	0% {
+		transform: scale(1);
+	}
+
+	100% {
+		transform: scale(1.5);
+		opacity: 0;
+
+	}
+}
+
+@keyframes ripple3 {
+	0% {
+		transform: scale(1);
+	}
+
+	100% {
+		transform: scale(1.6);
+		opacity: 0;
+
+	}
+}
+
+@keyframes slide-top {
+	0% {
+		-webkit-transform: translateY(0);
+		transform: translateY(0);
+	}
+
+	100% {
+		-webkit-transform: translateY(-1050px);
+		transform: translateY(-1050px);
+	}
+}
+
+@keyframes slide-top1 {
+	0% {
+		-webkit-transform: translateY(0);
+		transform: translateY(0);
+	}
+
+	100% {
+		-webkit-transform: translateY(-1050px);
+		transform: translateY(-1050px);
+	}
+}
+
+@keyframes scale-in-center {
+	0% {
+		transform: scale(0);
+		opacity: 1;
+	}
+
+	100% {
+		transform: scale(1);
+		opacity: 1;
+	}
+}
+</style>
\ No newline at end of file

--
Gitblit v1.9.3