前端记住密码功能
本文作者:程序员飞云
使用cookie来记住密码
1. 安装js-cookie依赖
"js-cookie": "^3.0.5"
2. 安装jsencrypt
存储用户密码,为了安全需要加密,获取密码需要解密
"jsencrypt": "^3.3.2"
3. 创建脚本
密钥对生成http://web.chacuo.net/netrsakeypair
import { JSEncrypt } from "jsencrypt";
// 密钥对生成http://web.chacuo.net/netrsakeypair
const publicKey =
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqjtN3wBrRUwGGijirOpW\n" +
"sISg9Q6BlzagJGAYh9+0cgahL28NUFL6wHmagpURrsWsHZP8dt/9DOfFrqS+/R7f\n" +
"VFyjclXH3XDDr4cP2+Wxgwn+PgJ3+TqkhHgdRzBQ4giCEGBJdsByUR8RN7iV+DQY\n" +
"vLQrFrmZm5Jc/FcCqLUeNJW+kSvb75qtQV5hQq4O+BQN1TGoQPDGrN+02mxmNV0O\n" +
"HI6U/iqTvPhDpHB6bM1jZUI7Jkeo8ySJblLmv/RtglPaV2TSDYiMWpFYy9VWmJcW\n" +
"b0gAfUOK340negeFGUXK5Xt+jnJZ7VrVM5wIKP7ls7WPPW3yfwrx7L0Sc1w1stge\n" +
"2QIDAQAB";
const privateKey =
"MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQCqO03fAGtFTAYa\n" +
"KOKs6lawhKD1DoGXNqAkYBiH37RyBqEvbw1QUvrAeZqClRGuxawdk/x23/0M58Wu\n" +
"pL79Ht9UXKNyVcfdcMOvhw/b5bGDCf4+Anf5OqSEeB1HMFDiCIIQYEl2wHJRHxE3\n" +
"uJX4NBi8tCsWuZmbklz8VwKotR40lb6RK9vvmq1BXmFCrg74FA3VMahA8Mas37Ta\n" +
"bGY1XQ4cjpT+KpO8+EOkcHpszWNlQjsmR6jzJIluUua/9G2CU9pXZNINiIxakVjL\n" +
"1VaYlxZvSAB9Q4rfjSd6B4UZRcrle36OclntWtUznAgo/uWztY89bfJ/CvHsvRJz\n" +
"XDWy2B7ZAgMBAAECggEBAJmAUH++CPy7yOTd6UizJuiVL+7J3eFUyKMEZBphhn0r\n" +
"rTzwjrjXmnTlMoZ9lSxb4w/o2cb3w19Xv9HzjKUCqa+QuXHoGAl+HXax+4L2ZFMd\n" +
"N70CzNxYHPG2ve/riYPI2D+cE6KZdnvf3863C8R8dbHzZMdhJTo7iM2iSCuI5mvT\n" +
"Ay3fPHvhgdkjDyOqr7jGJhrrgZvwr2piGYuPjpONGF42CfgqFNLybokxyD5JsT9d\n" +
"j9pvPeh5Z78vlh9O3driFHCfEYKi/W8xlhRW8SgTshMlJUrYZyalhlZZ7N29PthZ\n" +
"JgnKkrizm+XdqDPrEnM+J9ltPDPzWjgDXSxYRh8m9AECgYEA1NWgPPNe0e3JDkde\n" +
"mFBpgwl/tafqSyxXd52YLduaLNW8kQb104y4geON99xeue+Siy2pfgdnpvxV8bd3\n" +
"n1YIMdKKkeIfUUaJ4oxYiThfzVytK8svd7k7qtVY4/RlZZrrJqTEgoBFlAT42xyh\n" +
"+94I+lNQQ/olZu0yZ+fAHaZB0KkCgYEAzMG8/rCxjnvdyZzmppGH0n5EjisoU4fx\n" +
"H9NDfVYSZbcuKeLzIFXsOxEKooQn5cFyxDXBB5LQmkFejwMhA+qFDPk13tmALCHc\n" +
"ZZ9SoytzBaw8ZIzwDyI+TQKHLXcslUyth8Jgik2xQO7mNUE7prbc4Mb0CT31dS9y\n" +
"LU09roaWSrECgYEApV8f1HwdTux97lRSEfNZKHH3A0TnbWWUyOJw3iDl2LRyghVw\n" +
"aOHMc1BGfTKDf+HAcdgW/E/wn/UtKlWt4uZME7pN5TBXuSUf+iGmoWhmOAEspPyJ\n" +
"c3NAA2smWGkLaDlJQYuBDQ1yAqMiYc4LptJNE4Qst8Tjzue65LVTtzX5qZECgYEA\n" +
"w3sTXHSEj2tiSuEos02tRiCWgsRhM55NbfzcKgTKe6FuyT6KrwxZA+s5I/7XuFn/\n" +
"n6NSLlDUJvDRvedW1c5ISCKEc8ViwL9zEvIQiwcoQPo2jiif51Lh99O6CoYEYmVa\n" +
"JopEcMXLvBpYXe9xa7CZH1/SDCDC/qXVc7qScNS9F4ECgYEAiCEJYYLb5fA8Avx8\n" +
"1SIKF9/Yspc0twi+wvNVtQnLiA/xsnyQMgaMUl9PyV4IkyOiR7C82iy3q2iy7X3S\n" +
"wv2b+vgiX0KogJb2uyTeuGj+rNo53zF96iDlLhM5Hwr7xjXLvUhbhQxQJSWS4+Fz\n" +
"lUyPBMbw1c1PVs3WS7efadCNY5k=";
// 加密
export function encrypt(txt) {
const jsEncrypt = new JSEncrypt();
jsEncrypt.setPublicKey(publicKey);
return jsEncrypt.encrypt(txt);
}
// 解密
export function decrypt(text) {
const jsEncrypt = new JSEncrypt();
jsEncrypt.setPrivateKey(privateKey);
return jsEncrypt.decrypt(text);
}
4. 前端界面
<template>
<div class="login">
<el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
<h3 class="title">飞云定制旅游后台系统</h3>
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
type="text"
size="large"
auto-complete="off"
placeholder="账号"
@keyup.enter="handleLogin"
>
<template #prefix>
<svg-icon-index icon="user"/>
</template>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
type="password"
size="large"
auto-complete="off"
placeholder="密码"
@keyup.enter="handleLogin"
>
<template #prefix>
<svg-icon-index icon="password"/>
</template>
</el-input>
</el-form-item>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
<el-form-item style="width:100%;">
<el-button
size="large"
type="primary"
style="width:100%;"
@click="handleLogin"
>
<span>登 录</span>
</el-button>
<!-- @keyup.enter="handleLogin"-->
</el-form-item>
</el-form>
<!-- 底部 -->
<div class="el-login-footer">
<!-- <span></span>-->
</div>
</div>
</template>
<script setup>
import SvgIconIndex from "@/components/SvgIcon/SvgIconIndex.vue";
import {ref} from 'vue'
import requestUtil from '@/utils/request'
import store from "@/store";
import {ElMessage} from "element-plus";
import qs from "qs";
import router from "@/router";
import {decrypt, encrypt} from "@/utils/jsencrypt";
import Cookies from "js-cookie";
const loginRef = ref(null);
const loginForm = ref({
username: "",
password: "",
rememberMe: false
})
const loginRules = {
username: [{required: true, trigger: "blur", message: "请输入你的账号"}],
password: [{required: true, trigger: "blur", message: "请输入你的密码"}],
};
const handleLogin = () => {
loginRef.value.validate(async (valid) => {
// 记住密码,30天
if (loginForm.value.rememberMe) {
Cookies.set("username", loginForm.value.username, { expires: 30 });
Cookies.set("password", encrypt(loginForm.value.password), {
expires: 30,
});
Cookies.set("rememberMe", loginForm.value.rememberMe, {
expires: 30,
});
} else {
Cookies.remove("username");
Cookies.remove("password");
Cookies.remove("rememberMe");
}
if (valid) {
let res = await requestUtil.post(
"login?" +
qs.stringify(loginForm.value)
);
if (res.data.code === 0) {
store.commit('SET_TOKEN', res.data.data)
console.log(res.data.data)
ElMessage.success("登录成功")
await router.replace("/")
} else {
ElMessage.error(res.data)
}
} else {
console.log("error");
}
});
};
// 获取cookie
function getCookie() {
const username = Cookies.get("username");
const password = Cookies.get("password");
const rememberMe = Cookies.get("rememberMe");
loginForm.value = {
username: username === undefined ? loginForm.value.username : username,
password:
password === undefined ? loginForm.value.password : decrypt(password),
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
};
}
getCookie();
</script>
<style lang="scss" scoped>
a {
color: white
}
.login {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
background: url("https://gw.alipayobjects.com/zos/rmsportal/FfdJeJRQWjEeGTpqgBKj.png") 0% 0% / 100% 100%;
background-size: cover;
}
.title {
margin: 0px auto 30px auto;
text-align: center;
color: #707070;
}
.login-form {
border-radius: 6px;
background: #ffffff;
width: 400px;
padding: 25px 25px 5px 25px;
.el-input {
height: 40px;
input {
display: inline-block;
height: 40px;
}
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 0px;
}
}
.login-tip {
font-size: 13px;
text-align: center;
color: #bfbfbf;
}
.login-code {
width: 33%;
height: 40px;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
.el-login-footer {
height: 40px;
line-height: 40px;
position: fixed;
bottom: 0;
width: 100%;
text-align: center;
color: #fff;
font-family: Arial, cursive;
font-size: 12px;
letter-spacing: 1px;
}
.login-code-img {
height: 40px;
padding-left: 12px;
}
</style>
贡献者
flycodeu
版权所有
版权归属:flycodeu