git remote add origin git@gitee.com:xinmomoyan/vue-shop.git
1. 前端项目初始化

vue ui 进入图形化创建项目



至此1.2.3步骤已完成,脚手架已完成创建



以上完成了4.5步骤
2. 登录与退出

清除无效的页面,保留最基础的页面
App.vue
<template>
<div id="app">初始页面</div>
</template>
<script>
export default {
name: "app",
};
</script>
<style></style>
index.js
import Vue from "vue";
import VueRouter from "vue-router";
Vue.use(VueRouter);
const routes = [];
const router = new VueRouter({
routes,
});
export default router;
删除了views包及HelloWorld.vue组件
登录组件创建Login.vue
<template>
<div>登录组件</div>
</template>
<script>
export default {};
</script>
<style lang="less" scoped></style>
App.vue根组件修改
<template>
<div id="app">
<!-- 路由占位符 -->
<router-view></router-view>
</div>
</template>
<script>
export default {
name: "app",
};
</script>
<style></style>
Index.vue路由组件修改
import Vue from "vue";
import VueRouter from "vue-router";
import Login from "../components/Login";
Vue.use(VueRouter);
const routes = [
{ path: "/", redirect: "/login" },
{ path: "/login", component: Login },
];
const router = new VueRouter({
routes,
});
export default router;
登录组件布局
<template>
<div class="login_container">登录组件</div>
</template>
<script>
export default {};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
}
</style>

安装插件less-load、less


关闭项目重新启动,此时渲染成功

新建一个全局样式表
/*全局样式表*/
html,
body,
#app {
height: 100%;
margin: 0;
padding: 0;
}



新建Login.vue登录页面的白色区域盒子
<template>
<div class="login_container">
<div class="login_box"></div>
</div>
</template>
<script>
export default {};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
</style>


登录头像区域绘制
<template>
<div class="login_container">
<div class="login_box">
<div class="avatar_box">
<img src="../assets/logo.png" alt="" />
</div>
</div>
</div>
</template>
<script>
export default {};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
height: 100%;
width: 100%;
border-radius: 50%;
background-color: #eee;
}
}
</style>

登录组件表单布局
import Vue from "vue";
import { Button, Form, FormItem, Input } from "element-ui";
Vue.use(Button);
Vue.use(Form);
Vue.use(FormItem);
Vue.use(Input);

<template>
<div class="login_container">
<div class="login_box">
<!-- 头像区域 -->
<div class="avatar_box">
<img src="../assets/logo.png" alt="" />
</div>
<!-- 表单区域 -->
<el-form ref="form" label-width="0px" class="login_form">
<!-- 用户名 -->
<el-form-item>
<el-input></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item>
<el-input></el-input>
</el-form-item>
<!-- 按钮区域 -->
<el-form class="btns">
<el-form-item>
<!-- 登录 -->
<el-button type="primary">登录 </el-button>
<!-- 重置 -->
<el-button type="info">重置 </el-button>
</el-form-item>
</el-form>
</el-form>
</div>
</div>
</template>
<script>
export default {};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
height: 100%;
width: 100%;
border-radius: 50%;
background-color: #eee;
}
}
.btns {
display: flex;
justify-content: flex-end;
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>

iconfont图标库
打开官网添加至项目



import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import "./plugins/element.js";
//导入全局样式表
import "./assets/css/global.css";
import "./assets/fonts/iconfont.css";
Vue.config.productionTip = false;
new Vue({
router,
render: (h) => h(App),
}).$mount("#app");

<template>
<div class="login_container">
<div class="login_box">
<!-- 头像区域 -->
<div class="avatar_box">
<img src="../assets/logo.png" alt="" />
</div>
<!-- 表单区域 -->
<el-form ref="form" label-width="0px" class="login_form">
<!-- 用户名 -->
<el-form-item>
<el-input prefix-icon="iconfont icon-yonghu"></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item>
<el-input prefix-icon="iconfont icon-mima3"></el-input>
</el-form-item>
<!-- 按钮区域 -->
<el-form class="btns">
<el-form-item>
<!-- 登录 -->
<el-button type="primary">登录 </el-button>
<!-- 重置 -->
<el-button type="info">重置 </el-button>
</el-form-item>
</el-form>
</el-form>
</div>
</div>
</template>
<script>
export default {};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
height: 100%;
width: 100%;
border-radius: 50%;
background-color: #eee;
}
}
.btns {
display: flex;
justify-content: flex-end;
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>


登录表单数据绑定
<template>
<div class="login_container">
<div class="login_box">
<!-- 头像区域 -->
<div class="avatar_box">
<img src="../assets/logo.png" alt="" />
</div>
<!-- 表单区域 -->
<el-form :model="loginForm" label-width="0px" class="login_form">
<!-- 用户名 -->
<el-form-item>
<el-input
v-model="loginForm.username"
prefix-icon="iconfont icon-yonghu"
></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item>
<el-input
v-model="loginForm.password"
prefix-icon="iconfont icon-mima3"
type="password"
></el-input>
</el-form-item>
<!-- 按钮区域 -->
<el-form class="btns">
<el-form-item>
<!-- 登录 -->
<el-button type="primary">登录 </el-button>
<!-- 重置 -->
<el-button type="info">重置 </el-button>
</el-form-item>
</el-form>
</el-form>
</div>
</div>
</template>
<script>
export default {
data() {
return {
// 这是登录表单的数据绑定对象
loginForm: {
username: "zs",
password: "123",
},
};
},
};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
height: 100%;
width: 100%;
border-radius: 50%;
background-color: #eee;
}
}
.btns {
display: flex;
justify-content: flex-end;
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>

登录表单验证
<template>
<div class="login_container">
<div class="login_box">
<!-- 头像区域 -->
<div class="avatar_box">
<img src="../assets/logo.png" alt="" />
</div>
<!-- 表单区域 -->
<el-form
:model="loginForm"
:rules="loginFormRules"
label-width="0px"
class="login_form"
>
<!-- 用户名 -->
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
prefix-icon="iconfont icon-yonghu"
></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
prefix-icon="iconfont icon-mima3"
type="password"
></el-input>
</el-form-item>
<!-- 按钮区域 -->
<el-form class="btns">
<el-form-item>
<!-- 登录 -->
<el-button type="primary">登录 </el-button>
<!-- 重置 -->
<el-button type="info">重置 </el-button>
</el-form-item>
</el-form>
</el-form>
</div>
</div>
</template>
<script>
export default {
data() {
return {
// 这是登录表单的数据绑定对象
loginForm: {
username: "zs",
password: "123",
},
// 这是表单的验证规则对象
loginFormRules: {
// 验证用户名是否合法
username: [
{ required: true, message: "请输入登录名称", trigger: "blur" },
{
min: 3,
max: 10,
message: "长度在 3 到 10 个字符",
trigger: "blur",
},
],
// 验证密码是否合法
password: [
{ required: true, message: "请输入登录密码", trigger: "blur" },
{
min: 6,
max: 10,
message: "长度在 6 到 10 个字符",
trigger: "blur",
},
],
},
};
},
};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
height: 100%;
width: 100%;
border-radius: 50%;
background-color: #eee;
}
}
.btns {
display: flex;
justify-content: flex-end;
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>

登录表单重置
<template>
<div class="login_container">
<div class="login_box">
<!-- 头像区域 -->
<div class="avatar_box">
<img src="../assets/logo.png" alt="" />
</div>
<!-- 表单区域 -->
<el-form
ref="loginFormRef"
:model="loginForm"
:rules="loginFormRules"
label-width="0px"
class="login_form"
>
<!-- 用户名 -->
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
prefix-icon="iconfont icon-yonghu"
></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
prefix-icon="iconfont icon-mima3"
type="password"
></el-input>
</el-form-item>
<!-- 按钮区域 -->
<el-form class="btns">
<el-form-item>
<!-- 登录 -->
<el-button type="primary">登录 </el-button>
<!-- 重置 -->
<el-button type="info" @click="resetLoginForm">重置 </el-button>
</el-form-item>
</el-form>
</el-form>
</div>
</div>
</template>
<script>
export default {
data() {
return {
// 这是登录表单的数据绑定对象
loginForm: {
username: "zs",
password: "123",
},
// 这是表单的验证规则对象
loginFormRules: {
// 验证用户名是否合法
username: [
{ required: true, message: "请输入登录名称", trigger: "blur" },
{
min: 3,
max: 10,
message: "长度在 3 到 10 个字符",
trigger: "blur",
},
],
// 验证密码是否合法
password: [
{ required: true, message: "请输入登录密码", trigger: "blur" },
{
min: 6,
max: 10,
message: "长度在 6 到 10 个字符",
trigger: "blur",
},
],
},
};
},
methods: {
// 点击重置按钮,重置登录表单
resetLoginForm() {
// console.log(this);
this.$refs.loginFormRef.resetFields();
},
},
};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
height: 100%;
width: 100%;
border-radius: 50%;
background-color: #eee;
}
}
.btns {
display: flex;
justify-content: flex-end;
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>

登录表单预验证
<template>
<div class="login_container">
<div class="login_box">
<!-- 头像区域 -->
<div class="avatar_box">
<img src="../assets/logo.png" alt="" />
</div>
<!-- 表单区域 -->
<el-form
ref="loginFormRef"
:model="loginForm"
:rules="loginFormRules"
label-width="0px"
class="login_form"
>
<!-- 用户名 -->
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
prefix-icon="iconfont icon-yonghu"
></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
prefix-icon="iconfont icon-mima3"
type="password"
></el-input>
</el-form-item>
<!-- 按钮区域 -->
<el-form class="btns">
<el-form-item>
<!-- 登录 -->
<el-button type="primary" @click="login">登录 </el-button>
<!-- 重置 -->
<el-button type="info" @click="resetLoginForm">重置 </el-button>
</el-form-item>
</el-form>
</el-form>
</div>
</div>
</template>
<script>
export default {
data() {
return {
// 这是登录表单的数据绑定对象
loginForm: {
username: "zs",
password: "123",
},
// 这是表单的验证规则对象
loginFormRules: {
// 验证用户名是否合法
username: [
{ required: true, message: "请输入登录名称", trigger: "blur" },
{
min: 3,
max: 10,
message: "长度在 3 到 10 个字符",
trigger: "blur",
},
],
// 验证密码是否合法
password: [
{ required: true, message: "请输入登录密码", trigger: "blur" },
{
min: 6,
max: 10,
message: "长度在 6 到 10 个字符",
trigger: "blur",
},
],
},
};
},
methods: {
// 点击重置按钮,重置登录表单
resetLoginForm() {
// console.log(this);
this.$refs.loginFormRef.resetFields();
},
login() {
// 预验证,接收参数是一个回调函数,第一个参数是一个验证结果是否成功的布尔值
this.$refs.loginFormRef.validate((valid) => {
console.log(valid);
});
},
},
};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
height: 100%;
width: 100%;
border-radius: 50%;
background-color: #eee;
}
}
.btns {
display: flex;
justify-content: flex-end;
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>

登录表单根据预验证的结果决定是否发起请求
import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import "./plugins/element.js";
import "./assets/css/global.css";
import "./assets/fonts/iconfont.css";
import axios from "axios";
// 配置请求的根路径
axios.defaults.baseURL = "http://127.0.0.1:8888/api/private/v1/";
Vue.prototype.$http = axios;
Vue.config.productionTip = false;
new Vue({
router,
render: (h) => h(App),
}).$mount("#app");
<template>
<div class="login_container">
<div class="login_box">
<!-- 头像区域 -->
<div class="avatar_box">
<img src="../assets/logo.png" alt="" />
</div>
<!-- 表单区域 -->
<el-form
ref="loginFormRef"
:model="loginForm"
:rules="loginFormRules"
label-width="0px"
class="login_form"
>
<!-- 用户名 -->
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
prefix-icon="iconfont icon-yonghu"
></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
prefix-icon="iconfont icon-mima3"
type="password"
></el-input>
</el-form-item>
<!-- 按钮区域 -->
<el-form class="btns">
<el-form-item>
<!-- 登录 -->
<el-button type="primary" @click="login">登录</el-button>
<!-- 重置 -->
<el-button type="info" @click="resetLoginForm">重置</el-button>
</el-form-item>
</el-form>
</el-form>
</div>
</div>
</template>
<script>
export default {
data() {
return {
// 这是登录表单的数据绑定对象
loginForm: {
username: "zs",
password: "123",
},
// 这是表单的验证规则对象
loginFormRules: {
// 验证用户名是否合法
username: [
{ required: true, message: "请输入登录名称", trigger: "blur" },
{
min: 3,
max: 10,
message: "长度在 3 到 10 个字符",
trigger: "blur",
},
],
// 验证密码是否合法
password: [
{ required: true, message: "请输入登录密码", trigger: "blur" },
{
min: 6,
max: 10,
message: "长度在 6 到 10 个字符",
trigger: "blur",
},
],
},
};
},
methods: {
// 点击重置按钮,重置登录表单
resetLoginForm() {
// console.log(this);
this.$refs.loginFormRef.resetFields();
},
login() {
// 预验证,接收参数是一个回调函数,第一个参数是一个验证结果是否成功的布尔值
this.$refs.loginFormRef.validate(async (valid) => {
if (!valid) return;
const { data: res } = await this.$http.post("login", this.loginForm);
if ((res.meta.status = 200)) return console.log("登录失败");
console.log("登录c成功");
});
},
},
};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
height: 100%;
width: 100%;
border-radius: 50%;
background-color: #eee;
}
}
.btns {
display: flex;
justify-content: flex-end;
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>

<template>
<div class="login_container">
<div class="login_box">
<!-- 头像区域 -->
<div class="avatar_box">
<img src="../assets/logo.png" alt="" />
</div>
<!-- 表单区域 -->
<el-form
ref="loginFormRef"
:model="loginForm"
:rules="loginFormRules"
label-width="0px"
class="login_form"
>
<!-- 用户名 -->
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
prefix-icon="iconfont icon-yonghu"
></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
prefix-icon="iconfont icon-mima3"
type="password"
></el-input>
</el-form-item>
<!-- 按钮区域 -->
<el-form class="btns">
<el-form-item>
<!-- 登录 -->
<el-button type="primary" @click="login">登录</el-button>
<!-- 重置 -->
<el-button type="info" @click="resetLoginForm">重置</el-button>
</el-form-item>
</el-form>
</el-form>
</div>
</div>
</template>
<script>
export default {
data() {
return {
// 这是登录表单的数据绑定对象
loginForm: {
username: "zs",
password: "123",
},
// 这是表单的验证规则对象
loginFormRules: {
// 验证用户名是否合法
username: [
{ required: true, message: "请输入登录名称", trigger: "blur" },
{
min: 3,
max: 10,
message: "长度在 3 到 10 个字符",
trigger: "blur",
},
],
// 验证密码是否合法
password: [
{ required: true, message: "请输入登录密码", trigger: "blur" },
{
min: 6,
max: 10,
message: "长度在 6 到 10 个字符",
trigger: "blur",
},
],
},
};
},
methods: {
// 点击重置按钮,重置登录表单
resetLoginForm() {
// console.log(this);
this.$refs.loginFormRef.resetFields();
},
login() {
// 预验证,接收参数是一个回调函数,第一个参数是一个验证结果是否成功的布尔值
this.$refs.loginFormRef.validate(async (valid) => {
if (!valid) return;
// const { data: res } = await this.$http.post("login", this.loginForm);
// if ((res.meta.status = 200)) return this.$message.error("登录失败!");
if (100 == 100) return this.$message.error("登录失败!");
this.$message.success("登录成功");
});
},
},
};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
height: 100%;
width: 100%;
border-radius: 50%;
background-color: #eee;
}
}
.btns {
display: flex;
justify-content: flex-end;
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>

生成代码片段工具
https://snippet-generator.app/

将代码模板代码复制到在线工具
<template>
<div>
</div>
</template>
<script>
export default {};
</script>
<style lang="less" scoped>
</style>




<template>
<div>Home组件</div>
</template>
<script>
export default {};
</script>
<style lang="less" scoped></style>

<template>
<div class="login_container">
<div class="login_box">
<!-- 头像区域 -->
<div class="avatar_box">
<img src="../assets/logo.png" alt="" />
</div>
<!-- 表单区域 -->
<el-form
ref="loginFormRef"
:model="loginForm"
:rules="loginFormRules"
label-width="0px"
class="login_form"
>
<!-- 用户名 -->
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
prefix-icon="iconfont icon-yonghu"
></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
prefix-icon="iconfont icon-mima3"
type="password"
></el-input>
</el-form-item>
<!-- 按钮区域 -->
<el-form class="btns">
<el-form-item>
<!-- 登录 -->
<el-button type="primary" @click="login">登录</el-button>
<!-- 重置 -->
<el-button type="info" @click="resetLoginForm">重置</el-button>
</el-form-item>
</el-form>
</el-form>
</div>
</div>
</template>
<script>
export default {
data() {
return {
// 这是登录表单的数据绑定对象
loginForm: {
username: "zs1",
password: "123456",
},
// 这是表单的验证规则对象
loginFormRules: {
// 验证用户名是否合法
username: [
{ required: true, message: "请输入登录名称", trigger: "blur" },
{
min: 3,
max: 10,
message: "长度在 3 到 10 个字符",
trigger: "blur",
},
],
// 验证密码是否合法
password: [
{ required: true, message: "请输入登录密码", trigger: "blur" },
{
min: 6,
max: 10,
message: "长度在 6 到 10 个字符",
trigger: "blur",
},
],
},
};
},
methods: {
// 点击重置按钮,重置登录表单
resetLoginForm() {
// console.log(this);
this.$refs.loginFormRef.resetFields();
},
login() {
// 预验证,接收参数是一个回调函数,第一个参数是一个验证结果是否成功的布尔值
this.$refs.loginFormRef.validate(async (valid) => {
if (!valid) return;
// const { data: res } = await this.$http.post("login", this.loginForm);
// if ((res.meta.status = 200)) return this.$message.error("登录失败!");
if (10 == 100) return this.$message.error("登录失败!");
this.$message.success("登录成功");
// 1. 登录成功后,将token保存到sessionStorage中
// 1.1 项目中除了登录之外的其它api必须登录后才能访问
// 1.2 token只在网页打开期间有效
// window.sessionStorage.setItem("token", res.data.token);
window.sessionStorage.setItem("token", "aaabbb");
// 2. 通过编程式导航,跳转到后台主要,路径是/home
this.$router.push("/home");
});
},
},
};
</script>
<style lang="less" scoped>
.login_container {
background-color: #2b4b6b;
height: 100%;
}
.login_box {
width: 450px;
height: 300px;
background-color: #fff;
border-radius: 3px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.avatar_box {
height: 130px;
width: 130px;
border: 1px solid #eee;
border-radius: 50%;
padding: 10px;
box-shadow: 0 0 10px #ddd;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
img {
height: 100%;
width: 100%;
border-radius: 50%;
background-color: #eee;
}
}
.btns {
display: flex;
justify-content: flex-end;
}
.login_form {
position: absolute;
bottom: 0;
width: 100%;
padding: 0 20px;
box-sizing: border-box;
}
</style>


路由导航守卫
import Vue from "vue";
import VueRouter from "vue-router";
import Login from "../components/Login";
import Home from "../components/Home";
Vue.use(VueRouter);
const routes = [
{ path: "/", redirect: "/login" },
{ path: "/login", component: Login },
{ path: "/home", component: Home },
];
const router = new VueRouter({
routes,
});
//路由导航守卫
router.beforeEach((to, from, next) => {
//to,将要访问的路径
//from,代表从哪个路径跳转而来
//next,是一个函数,表示放行
// next() 放行 next('/login') 强制跳转
if (to.path === "/login") return next();
//获取token
const tokenStr = window.sessionStorage.getItem("token");
if (!tokenStr) return next("/login");
next();
});
export default router;


退出功能
<template>
<div>
<el-button type="info" @click="logout"> 退出</el-button>
</div>
</template>
<script>
export default {
methods: {
logout() {
window.sessionStorage.clear();
this.$router.push("/login");
},
},
};
</script>
<style lang="less" scoped></style>

浙公网安备 33010602011771号