当前位置: 首页 > news >正文

前端:第八章-用户认证模块

第八章:用户认证模块

🎯本章目标:开发登录、注册页面,实现 Token 认证和表单验证。


8.1 登录页面开发

8.1.1 创建登录页面

创建src/views/login/index.vue

<template> <div> <!-- 左侧装饰区域 --> <div> <div> <h1>智能知识管理平台</h1> <p> 收集知识 → 组织知识 → 智能检索 → AI 辅助 </p> <div> <div> <el-icon :size="24"><Folder /></el-icon> <span>多知识库管理</span> </div> <div> <el-icon :size="24"><Search /></el-icon> <span>智能语义搜索</span> </div> <div> <el-icon :size="24"><ChatDotRound /></el-icon> <span>AI 知识问答</span> </div> </div> </div> </div> <!-- 右侧登录表单 --> <div> <div> <!-- Logo --> <div> <el-icon :size="40"><Collection /></el-icon> <span>知识管理</span> </div> <!-- 标题 --> <div> <h2>欢迎回来</h2> <p>请登录您的账号</p> </div> <!-- 登录表单 --> <el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" @submit.prevent="handleLogin" > <!-- 用户名 --> <el-form-item prop="username"> <el-input v-model="loginForm.username" placeholder="请输入用户名或邮箱" prefix-icon="User" size="large" clearable /> </el-form-item> <!-- 密码 --> <el-form-item prop="password"> <el-input v-model="loginForm.password" type="password" placeholder="请输入密码" prefix-icon="Lock" size="large" show-password @keyup.enter="handleLogin" /> </el-form-item> <!-- 记住我 & 忘记密码 --> <div> <el-checkbox v-model="loginForm.remember">记住我</el-checkbox> <router-link to="/forgot-password"> 忘记密码? </router-link> </div> <!-- 登录按钮 --> <el-form-item> <el-button type="primary" size="large" :loading="loading" @click="handleLogin" > 登 录 </el-button> </el-form-item> </el-form> <!-- 注册链接 --> <div> <span>还没有账号?</span> <router-link to="/register"> 立即注册 </router-link> </div> </div> </div> </div> </template> <script setup lang="ts"> import { ref, reactive, onMounted } from 'vue' import { useRouter, useRoute } from 'vue-router' import { ElMessage } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import { Folder, Search, ChatDotRound, Collection } from '@element-plus/icons-vue' import { useUserStore } from '@/stores/user' import { login as loginApi } from '@/api/user' const router = useRouter() const route = useRoute() const userStore = useUserStore() // 本地存储键名 const REMEMBER_KEY = 'knowledge_remember_user' // 表单引用 const loginFormRef = ref<FormInstance>() // 加载状态 const loading = ref(false) // 表单数据 const loginForm = reactive({ username: '', password: '', remember: false, }) // 表单验证规则 const loginRules: FormRules = { username: [ { required: true, message: '请输入用户名或邮箱', trigger: 'blur' }, ], password: [ { required: true, message: '请输入密码', trigger: 'blur' }, { min: 6, max: 20, message: '密码长度在 6 到 20 个字符', trigger: 'blur' }, ], } // 页面加载时读取记住的用户信息 onMounted(() => { const savedUser = localStorage.getItem(REMEMBER_KEY) if (savedUser) { try { const { username, password, remember } = JSON.parse(savedUser) loginForm.username = username || '' loginForm.password = password || '' loginForm.remember = remember || false } catch { localStorage.removeItem(REMEMBER_KEY) } } }) // 登录处理 async function handleLogin() { if (!loginFormRef.value) return try { await loginFormRef.value.validate() loading.value = true const result = await loginApi({ username: loginForm.username, password: loginForm.password, remember: loginForm.remember, }) // 处理"记住我":保存或清除用户名密码 if (loginForm.remember) { localStorage.setItem(REMEMBER_KEY, JSON.stringify({ username: loginForm.username, password: loginForm.password, remember: true, })) } else { localStorage.removeItem(REMEMBER_KEY) } // 保存登录状态 userStore.login(result.accessToken, result.refreshToken, result.user) ElMessage.success('登录成功') // 跳转到之前的页面或首页 const redirect = route.query.redirect as string router.push(redirect || '/') } catch (error) { console.error('登录失败:', error) } finally { loading.value = false } } </script> <style scoped> .login-container { @apply min-h-screen flex; } /* 左侧装饰区域 */ .login-banner { @apply hidden lg:flex lg:w-1/2 bg-gradient-to-br from-primary to-primary-dark; @apply items-center justify-center p-12; } .banner-content { @apply text-white text-center; } .banner-title { @apply text-4xl font-bold mb-4; } .banner-subtitle { @apply text-lg text-white/80 mb-8; } .banner-features { @apply flex flex-col gap-4 items-center; } .feature-item { @apply flex items-center gap-3 text-white/90; } /* 右侧登录表单 */ .login-form-container { @apply flex-1 flex items-center justify-center p-8; @apply bg-gray-50; } html.dark .login-form-container { @apply bg-slate-900; } .login-form-wrapper { @apply w-full max-w-md; } .login-logo { @apply flex items-center justify-center gap-3 mb-8; } .logo-icon { @apply text-primary; } .logo-text { @apply text-2xl font-bold text-gray-900; } html.dark .logo-text { @apply text-gray-100; } .login-header { @apply text-center mb-8; } .login-title { @apply text-2xl font-bold text-gray-900 mb-2; } html.dark .login-title { @apply text-gray-100; } .login-subtitle { @apply text-gray-500; } .login-form { @apply space-y-4; } .login-options { @apply flex justify-between items-center mb-4; } .forgot-link { @apply text-sm text-primary hover:text-primary-hover; } .login-btn { @apply w-full; } .login-footer { @apply text-center mt-6 text-gray-500; } .register-link { @apply text-primary hover:text-primary-hover ml-1; } </style>
http://www.jsqmd.com/news/490609/

相关文章:

  • 当机器人画个圆,它心里在想啥
  • 黑体字合集适配设计/办公/自媒体全场景安装教程
  • 京津冀地区靠谱的预应力波纹管服务商,天津隆德信费用高吗? - mypinpai
  • 【Java SE】super 关键字详解
  • 聊聊好用的OA软件精品定制,南京阔友信息技术有限公司口碑如何? - 工业推荐榜
  • 什么是HTTP检测?实用指南在此
  • COMSOL 6.1光镊捕获小球与光力求解
  • 超级扩展与优化方案:从入门到专家的企业级漏洞治理全景实战课程体系
  • 聚焦品质:评测国内几家知名浮动球阀制造厂家,市场上热门的浮动球阀品牌有哪些行业优质分析亮相 - 品牌推荐师
  • 【2026年滴滴春招- 3月15日 -第一题- 划分】(题目+思路+JavaC++Python解析+在线测试)
  • 探寻2026年用友系统供应商,哪家能提供优质服务和解决方案 - myqiye
  • 全面入门 ASP.NET:从 Web Pages 到 MVC 与 Web Forms 的系统教程
  • 盘点全国靠谱的本地上门名包回收公司,哪家值得推荐? - 工业品网
  • 数字化转型之路:如何挑选好用的订货管理系统助力企业增长
  • 深聊2026年热锻造制造商,交货准时和性价比如何 - 工业设备
  • 基于S-S或LCC-S结构的WPT无线电能传输电路模型,采用输出电压闭环PI控制。 另附带电路...
  • 2026年出入口安防设备选购指南,沧州北京天津太原靠谱厂家推荐 - 工业品牌热点
  • 2026年3月广州仲裁律师专业靠谱推荐榜 五大资深律师实力上榜 - 外贸老黄
  • 2026标准气企业选择有门道,看齐行业优质标准,标准气品牌优选品牌推荐与解析 - 品牌推荐师
  • 多功能数字货币交易所系统源码(秒合约 币币交易 C2C 质押理财完整版)
  • PSRR 仿真教程,怎么仿真电路的psrr 两个电路案例,一个是16分频的分频器
  • 速看!2026防腐防锈圆顶通风口定制厂家优质分析,国内头部圆顶通风口品牌推荐分析精选综合实力推荐企业 - 品牌推荐师
  • 2026年京津冀地区优质锚具厂商排名,推荐技术强售后好的靠谱生产厂 - mypinpai
  • 2026南京高功率密度电源定制,这些源头厂家有实力,模块电源/光伏电源/电源模块,高功率密度电源产品口碑推荐 - 品牌推荐师
  • Phi-3-vision-128k-instruct开发者案例:基于vLLM API构建多租户图文问答SaaS服务
  • 算法设计与分析-习题5.1
  • 轻量级AI助手!Qwen2.5-0.5B-Instruct快速部署与体验全攻略
  • Phi-3-vision-128k-instruct一文详解:Phi-3多模态家族中128K上下文的技术突破点
  • 聊聊德阳市双级活塞推料离心机厂家,靠谱的有哪些? - 工业推荐榜
  • MedGemma-X开箱即用体验:预装环境,零配置快速体验智能诊断