2人参与 • 2025-04-24 • Javascript
环境准备
使用 vue cli 或 vite 创建项目,推荐组合:vue3 + element plus + vue router
npm create vue@latest npm install element-plus @element-plus/icons-vue vue-router
import { createapp } from 'vue' import elementplus from 'element-plus' import router from './router' import 'element-plus/dist/index.css' const app = createapp(app) app.use(elementplus) app.use(router) app.mount('#app')
<template> <div class="login-container"> <el-form ref="formref" :model="form" :rules="rules"> <h2 class="title">校园交易平台</h2> <el-form-item prop="username"> <el-input v-model="form.username" prefix-icon="user" placeholder="请输入手机号" /> </el-form-item> <el-form-item prop="password"> <el-input v-model="form.password" prefix-icon="lock" type="password" show-password placeholder="请输入密码" @keyup.enter="handlelogin" /> </el-form-item> <el-button type="primary" :loading="loading" @click="handlelogin" > 登录 </el-button> <div class="links"> <router-link to="/register">立即注册</router-link> <router-link to="/forgot">忘记密码?</router-link> </div> </el-form> </div> </template>
<script setup> import { ref, reactive } from 'vue' import { userouter } from 'vue-router' import { elmessage } from 'element-plus' const form = reactive({ username: '', password: '' }) const rules = reactive({ username: [ { required: true, message: '请输入手机号', trigger: 'blur' }, { pattern: /^1[3-9]\d{9}$/, message: '手机号格式错误' } ], password: [ { required: true, message: '请输入密码', trigger: 'blur' }, { min: 6, max: 16, message: '长度6-16位' } ] }) const loading = ref(false) const formref = ref(null) const router = userouter() const handlelogin = async () => { try { await formref.value.validate() loading.value = true // 模拟api请求 await new promise(resolve => settimeout(resolve, 1000)) sessionstorage.setitem('token', 'demo_token') elmessage.success('登录成功') router.replace('/dashboard') } catch (error) { console.error('登录失败:', error) } finally { loading.value = false } } </script>
<style scoped> .login-container { height: 100vh; display: grid; place-items: center; background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); } .title { text-align: center; margin-bottom: 2rem; color: #2c3e50; font-size: 1.8rem; } :deep(.el-form) { width: 400px; padding: 2rem; background: rgba(255,255,255,0.95); border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); } .el-button { width: 100%; margin-top: 1rem; } .links { margin-top: 1.5rem; display: flex; justify-content: space-between; a { color: #409eff; text-decoration: none; transition: color 0.3s; &:hover { color: #66b1ff; } } } </style>
// router/index.js router.beforeeach((to) => { const isauthenticated = sessionstorage.getitem('token') if (to.meta.requiresauth && !isauthenticated) { return '/login' } if (to.path === '/login' && isauthenticated) { return '/dashboard' } })
密码加密传输(使用crypto-js)
添加验证码功能
请求限流与防重放攻击
import cryptojs from 'crypto-js' const encryptpassword = (password) => { return cryptojs.sha256(password).tostring() }
<template> <div class="oauth-login"> <el-divider>第三方登录</el-divider> <div class="oauth-buttons"> <el-button @click="handlewechatlogin"> <svg-icon icon-class="wechat" /> 微信登录 </el-button> </div> </div> </template>
表单验证优化
异步验证手机号是否注册
密码强度实时检测
const checkusername = async (rule, value, callback) => { if (!value) return callback(new error('请输入手机号')) if (!/^1[3-9]\d{9}$/.test(value)) return callback(new error('格式错误')) try { const { data } = await api.checkusername(value) if (!data.exist) callback(new error('该用户未注册')) } catch (error) { callback(new error('验证失败')) } }
自动填充最近登录账号
记住密码功能(加密存储)
加载状态管理
// 自动填充 const lastusername = localstorage.getitem('lastusername') if (lastusername) form.username = lastusername // 记住密码 const savepassword = ref(false) watch(savepassword, (val) => { if (val) { localstorage.setitem('remembered', json.stringify(form)) } else { localstorage.removeitem('remembered') } })
try { const res = await loginapi(formdata) if (res.code === 1001) { elmessage.warning('该账号已被冻结') } } catch (err) { elmessage.error({ message: `登录失败: ${err.message}`, grouping: true // 相同错误合并显示 }) }
跨域问题处理
// vite.config.js export default defineconfig({ server: { proxy: { '/api': { target: 'http://backend.example.com', changeorigin: true, rewrite: (path) => path.replace(/^\/api/, '') } } } })
@media (max-width: 768px) { .login-container { padding: 1rem; :deep(.el-form) { width: 100%; margin: 0 1rem; } } }
浏览器兼容问题
使用@vitejs/plugin-legacy处理es6+语法
添加autoprefixer自动补全css前缀
到此这篇关于使用vue开发登录页面的完整指南的文章就介绍到这了,更多相关vue开发登录页面内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论