<template> <div class="container-wrapper"> <github-corner class="github-corner" /> <img class="qr-code" v-show="showIndex == 1" src="../../assets/images/evm-mp.jpg" /> <img class="qr-code" v-show="showIndex == 2" src="../../assets/images/evm-qq-group.png" /> <div :class="['container', isActive ? 'right-panel-active' : '']"> <div class="form-container sign-up-container"> <form action="#"> <h1>注册</h1> <div class="social-container"> <a href="#" class="social" @mouseenter="onMouseEnter(1)" @mouseleave="onMouseLeave"><i class="fab fa-weixin"></i></a> <a href="#" class="social" @mouseenter="onMouseEnter(2)" @mouseleave="onMouseLeave"><i class="fab fa-qq"></i></a> <a href="https://gitee.com/scriptiot/evm" target="_blank" class="social"><i class="fab fa-github-alt"></i></a> </div> <span>完善用户基本信息</span> <input type="text" v-model="post.account" placeholder="账号" /> <input type="text" v-model="post.username" placeholder="用户名" /> <input type="password" v-model="post.password" placeholder="密码" /> <button @click.prevent="doRegister">注册</button> </form> </div> <div class="form-container sign-in-container"> <form action="#"> <h1>登录</h1> <div class="social-container"> <a href="#" class="social" @mouseenter="onMouseEnter(1)" @mouseleave="onMouseLeave"><i class="fab fa-weixin"></i></a> <a href="#" class="social" @mouseenter="onMouseEnter(2)" @mouseleave="onMouseLeave"><i class="fab fa-qq"></i></a> <a href="https://gitee.com/scriptiot/evm" target="_blank" class="social"><i class="fab fa-github-alt"></i></a> </div> <span>请输入账号密码</span> <input type="text" v-model="user.account" autocomplete="off" placeholder="账号" /> <input type="password" v-model="user.password" autocomplete="off" placeholder="密码" /> <!-- <a href="#">忘记密码?</a> --> <button @click.prevent="login">登录</button> </form> </div> <div class="overlay-container"> <div class="overlay"> <div class="overlay-panel overlay-left"> <h1>欢迎回来!</h1> <p>请您先填写个人信息,进行操作。</p> <button class="ghost" @click="isActive = false">登录</button> </div> <div class="overlay-panel overlay-right"> <h1>EVM应用商店</h1> <p>注册账号</p> <button class="ghost" @click="isActive = true">注册</button> </div> </div> </div> </div> <p style="position: absolute;bottom: 0px;text-align: center;">Copyright © 武汉市字节码科技有限公司</p> </div> </template> <script> import GithubCorner from '@/components/GithubCorner' import { doLogin, getUser, doRegister } from "@/api/app-store" import { strTrim } from "@/utils/index" let loading = null; export default { name: "Login", components: { GithubCorner }, data() { return { isActive: false, showIndex: 0, user: { account: "", password: "", }, post: { account: "", username: "", password: "" } }; }, computed: {}, methods: { onMouseEnter(index) { this.showIndex = index; }, onMouseLeave() { this.showIndex = -1; }, getUserPermission() { getUser() .then((res) => { this.$store.dispatch("user/setRole", res.data.role); sessionStorage.setItem("user", JSON.stringify(res.data)); this.$router.push({ path: "/home" }); }) .catch((err) => { this.$message.error(err.message); }) .finally(() => { if (loading) loading.close(); }); }, login() { if (!this.user.account || this.user.account.length == 0) return this.$message.error("账号不能为空"); if (!this.user.password || this.user.password.length == 0) return this.$message.error("密码不能为空"); loading = this.$loading({ lock: true, text: "Loading", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }); doLogin({ account: strTrim(this.user.account), password: strTrim(this.user.password), }) .then((res) => { if (res.code == 200) { this.$store.dispatch("user/setToken", res.data.token); this.$store.dispatch("user/setName", res.data.username); this.getUserPermission(); } }) .catch((err) => { if (err.code == 404) this.$message.error("账号不存在"); else if (err.code == 4003) this.$message.error("密码错误"); else if (err.code == 4006) this.$message.error("账号被禁用"); else this.$message.error(err.message); if (loading) loading.close(); }); }, doRegister() { if (!this.post.account || this.post.account.length == 0) return this.$message.error("账号不能为空"); if (!this.post.password || this.post.password.length == 0) return this.$message.error("密码不能为空"); doRegister(this.post) .then((res) => { console.log(res); this.user.account = this.post.account this.user.password = this.post.password this.$message.success("注册成功,请登录!"); }) .catch((err) => { this.$message.error(err.message); }); }, }, created() {}, mounted() {}, beforeMount() {}, }; </script> <style lang="scss" scoped> * { box-sizing: border-box; } body { background: #f6f5f7; display: flex; justify-content: center; align-items: center; flex-direction: column; font-family: "Montserrat", sans-serif; height: 100vh; margin: -20px 0 50px; } h1 { font-weight: bold; margin: 0; } h2 { text-align: center; } p { font-size: 14px; font-weight: 100; line-height: 20px; letter-spacing: 0.5px; margin: 20px 0 30px; } span { font-size: 12px; } a { color: #333; font-size: 14px; /* text-decoration: none; */ margin: 15px 0; } button { border-radius: 20px; border: 1px solid #3c97bf; background-color: #3c97bf; color: #ffffff; font-size: 12px; font-weight: bold; padding: 12px 45px; letter-spacing: 1px; text-transform: uppercase; transition: transform 80ms ease-in; } button:active { transform: scale(0.95); } button:focus { outline: none; } button.ghost { background-color: transparent; border-color: #ffffff; } form { background-color: #ffffff; display: flex; align-items: center; justify-content: center; flex-direction: column; padding: 0 50px; height: 100%; text-align: center; } input { background-color: #eee; border: none; padding: 12px 15px; margin: 8px 0; width: 100%; } .container-wrapper { width: 100%; height: 100vh; display: flex; align-items: center; justify-content: center; } .container-wrapper > .qr-code { top: 10px; height: auto; width: 150px; position: absolute; } .container { background-color: #fff; border-radius: 10px; box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); position: relative; overflow: hidden; width: 768px; max-width: 100%; min-height: 480px; } .form-container { position: absolute; top: 0; height: 100%; transition: all 0.6s ease-in-out; } .sign-in-container { left: 0; width: 50%; z-index: 2; } .container.right-panel-active .sign-in-container { transform: translateX(100%); } .sign-up-container { left: 0; width: 50%; opacity: 0; z-index: 1; } .container.right-panel-active .sign-up-container { transform: translateX(100%); opacity: 1; z-index: 5; animation: show 0.6s; } @keyframes show { 0%, 49.99% { opacity: 0; z-index: 1; } 50%, 100% { opacity: 1; z-index: 5; } } .overlay-container { position: absolute; top: 0; left: 50%; width: 50%; height: 100%; overflow: hidden; transition: transform 0.6s ease-in-out; z-index: 100; } .container.right-panel-active .overlay-container { transform: translateX(-100%); } .overlay { background: #3c97bf; background: -webkit-linear-gradient(to right, #3c97bf, #13dbe2); background: linear-gradient(to right, #3c97bf, #13dbe2); background-repeat: no-repeat; background-size: cover; background-position: 0 0; color: #ffffff; position: relative; left: -100%; height: 100%; width: 200%; transform: translateX(0); transition: transform 0.6s ease-in-out; } .container.right-panel-active .overlay { transform: translateX(50%); } .overlay-panel { position: absolute; display: flex; align-items: center; justify-content: center; flex-direction: column; padding: 0 40px; text-align: center; top: 0; height: 100%; width: 50%; transform: translateX(0); transition: transform 0.6s ease-in-out; } .overlay-left { transform: translateX(-20%); } .container.right-panel-active .overlay-left { transform: translateX(0); } .overlay-right { right: 0; transform: translateX(0); } .container.right-panel-active .overlay-right { transform: translateX(20%); } .social-container { margin: 20px 0; } .social-container a { border: 1px solid #dddddd; border-radius: 50%; display: inline-flex; justify-content: center; align-items: center; margin: 0 5px; height: 40px; width: 40px; } footer { background-color: #222; color: #fff; font-size: 14px; bottom: 0; position: fixed; left: 0; right: 0; text-align: center; z-index: 999; } footer p { margin: 10px 0; } footer i { color: red; } footer a { color: #3c97bf; text-decoration: none; } </style>