1、app.vue
<script setup>import LoginVue from '@/views/Login.vue'
</script><template><LoginVue/>
</template>
2、Login.vue
<script setup>
import { User, Lock } from "@element-plus/icons-vue";
import { ElMessage } from 'element-plus';import { ref } from "vue";
//控制注册与登录表单的显示, 默认false显示登录 true时显示注册
const isRegister = ref(false);//定义数据模型
const registerData = ref({username: "",password: "",rePassword: "",
});
//校验密码的函数
const checkRePassword = (rule, value, callback) => {if (value === "") {callback(new Error("请再次确认密码"));} else if (value !== registerData.value.password) {callback(new Error("请确保两次输入的密码一样"));} else {callback();}
};
//定义表单校验规则
const rules = {username: [{ required: true, message: "请输入用户名", trigger: "blur" },{ min: 5, max: 16, message: "长度为5~16位非空字符", trigger: "blur" },],password: [{ required: true, message: "请输入密码", trigger: "blur" },{ min: 5, max: 16, message: "长度为5~16位非空字符", trigger: "blur" },],rePassword: [{ validator: checkRePassword, trigger: "blur" }],
};// 调用后台接口,完成注册和登录
import {userRegisterService,userLoginService} from '@/api/user.js'
const register=async()=>{// registerData是一个响应式对象,如果要获取值,需要.valuelet result=await userRegisterService(registerData.value);// alert(result.msg?result.msg:'注册成功')ElMessage.success(result.msg?result.msg:'注册成功')
}// 绑定数据,复用注册表单的数据模型
//表单数据校验,复用注册表单的数据校验
//登录函数
const login=async()=>{let result=await userLoginService(registerData.value);// alert(result.msg?result.msg:'登录成功')ElMessage.success(result.msg?result.msg:'登录成功')
}
// 定义函数,清空数据模型的数据
const clearRegisterData = ()=>{registerData.value={username:'',password:'',rePassword:''}
}
</script><template>
<!-- 登录和注册是同一个页面 --><el-row class="login-page"><el-col :span="12" class="bg"></el-col><el-col :span="6" :offset="3" class="form">
<!-- 注册表单 --><el-form ref="form" size="large" autocomplete="off" v-if="isRegister" :model="registerData" :rules="rules"><el-form-item><h1>注册</h1></el-form-item><!-- 用户名 --><el-form-item prop="username"><el-input :prefix-icon="User" placeholder="请输入用户名" v-model="registerData.username"></el-input></el-form-item><!-- 密码 --><el-form-item prop="password"><el-input :prefix-icon="Lock" type="password" placeholder="请输入密码" v-model="registerData.password" ></el-input></el-form-item><!-- 确认密码 --><el-form-item prop="rePassword"><el-input :prefix-icon="Lock" type="password" placeholder="请输入再次密码" v-model="registerData.rePassword" ></el-input></el-form-item><!-- 注册按钮 --><el-form-item><el-button class="button" type="primary" auto-insert-space @click="register">注册</el-button></el-form-item><el-form-item class="flex"><el-link type="info" :underline="false" @click="isRegister = false;clearRegisterData()">← 返回</el-link></el-form-item></el-form><!-- 登录表单 --><el-form ref="form" size="large" autocomplete="off" v-else :model="registerData" :rules="rules"><el-form-item><h1>登录</h1></el-form-item><el-form-item prop="username"><el-input :prefix-icon="User" placeholder="请输入用户名" v-model="registerData.username" ></el-input></el-form-item><el-form-item prop="password"><el-input name="password" :prefix-icon="Lock" type="password" placeholder="请输入密码" v-model="registerData.password"></el-input></el-form-item><el-form-item class="flex"><div class="flex"><el-checkbox>记住我</el-checkbox><el-link type="primary" :underline="false">忘记密码?</el-link></div></el-form-item><!-- 登录按钮 --><el-form-item><el-button class="button" type="primary" auto-insert-space @click="login">登录</el-button></el-form-item><el-form-item class="flex"><el-link type="info" :underline="false" @click="isRegister = true;clearRegisterData()">注册 →</el-link></el-form-item></el-form></el-col></el-row>
</template><style lang="scss" scoped>
/* 样式 */
.login-page {height: 100vh;background-color: #fff;.bg {background: url("@/assets/logo2.png") no-repeat 60% center / 240px auto,url("@/assets/login_bg.jpg") no-repeat center / cover;border-radius: 0 20px 20px 0;}.form {display: flex;flex-direction: column;justify-content: center;user-select: none;.title {margin: 0 auto;}.button {width: 100%;}.flex {width: 100%;display: flex;justify-content: space-between;}}
}
</style>
3、api文件夹下的user.js
// 导入request.js请求工具
import request from '@/utils/request.js'//提供调用注册接口的函数
export const userRegisterService=(registerData)=>{// 借助于URLsearchParams完成传递const params=new URLSearchParams();for(let key in registerData){params.append(key,registerData[key]);}return request.post('/user/register',params);
}//提供调用登录接口的函数
export const userLoginService=(loginData)=>{const params=new URLSearchParams();for(let key in loginData){params.append(key,loginData[key])}return request.post('/user/login',params)
}
4、utils文件夹下的request.js
//定制请求的实例//导入axios npm install axios
import axios from 'axios';
import { ElMessage } from 'element-plus';
//定义一个变量,记录公共的前缀 , baseURL
const baseURL = '/api';
const instance = axios.create({baseURL})//添加响应拦截器
instance.interceptors.response.use(result=>{// 判断业务状态码if(result.data.code===0){return result.data;}//操作失败// alert(result.data.msg?result.data.msg:'服务异常')ElMessage.error(result.data.msg?result.data.msg:'服务异常')//异步操作的状态转换为失败return Promise.reject(result.data)},err=>{alert('服务异常');return Promise.reject(err);//异步的状态转化成失败的状态}
)export default instance;//向外暴露