本文作者:程序员飞云
使用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/netrsakeypairconst 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"); } });};
// 获取cookiefunction 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>
评论