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

使用AI一步一步实现若依前端(9)

功能9:退出登录功能

功能8:页面权限控制
功能7:路由全局前置守卫
功能6:动态添加路由记录
功能5:侧边栏菜单动态显示
功能4:首页使用Layout布局
功能3:点击登录按钮实现页面跳转
功能2:静态登录界面
功能1:创建前端项目

前言

模板代码使用AI生成,基本可以实现大概的效果。想要精细化调整,可以等到功能实现完成后再进行重构。

一.操作步骤

1.使用AI生成模板代码

将现有的Navbar.vue的代码附上,然后让AI根据要求生成想要的代码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后在退出登录的方法里,调用userStore的logout方法,成功后使用location.href = '/index'

<template>
  <el-header class="navbar">
    <el-breadcrumb separator="/">
      <el-breadcrumb-item
        v-for="item in breadcrumbItems"
        :key="item.path"
        :to="item.path"
      >
        {{ item.title }}
      </el-breadcrumb-item>
    </el-breadcrumb>
    
    <div class="user-menu">
      <el-dropdown trigger="hover">
        <div class="avatar-container">
          <img 
            :src="avatarUrl" 
            alt="用户头像"
            class="avatar-image"
          />
        </div>
        
        <template #dropdown>
          <el-dropdown-menu class="dropdown-menu">
            <el-dropdown-item 
              @click="handleSettings"
              class="menu-item"
            >
              <span>个人设置</span>
            </el-dropdown-item>
            <el-dropdown-item 
              divided 
              @click="handleLogout"
              class="menu-item"
            >
              <span>退出登录</span>
            </el-dropdown-item>
          </el-dropdown-menu>
        </template>
      </el-dropdown>
    </div>
  </el-header>
</template>

<script setup>
import { ElHeader, ElBreadcrumb, ElBreadcrumbItem, ElDropdown, ElDropdownMenu, ElDropdownItem, ElMessageBox } from 'element-plus'

const breadcrumbItems = [
  { title: '首页', path: '/' },
  { title: '关于', path: '/about' }
]

// 请确保在 assets 目录下存在 user-avatar.png 图片文件
const avatarUrl = new URL('@/assets/images/profile.jpg', import.meta.url).href

import useUserStore from '@/stores/user'
const userStore = useUserStore()

const handleLogout = () => {
  // 处理退出登录逻辑
  ElMessageBox.confirm('确定注销并退出系统吗?', '提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    userStore.logout().then(() => {
      location.href = '/index';
    })
  }).catch(() => { });
}


const handleSettings = () => {
  // 处理设置逻辑
  console.log('打开设置页面')
}
</script>

<style scoped>
/* 导航栏整体样式 */
.navbar {
  background-color: #ffffff;
  border-bottom-width: 1px;
  border-bottom-style: solid;
  border-bottom-color: #e5e7eb;
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 64px;
  padding: 0 24px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}

/* 用户菜单容器 */
.user-menu {
  position: relative;
  z-index: 1000;
}

/* 头像容器 */
.avatar-container {
  position: relative;
  width: 40px;
  height: 40px;
  transition: all 0.3s ease;
}

/* 头像图片样式 */
.avatar-image {
  width: 100%;
  height: 100%;
  border-radius: 9999px;
  object-fit: cover;
  border: 2px solid #fff;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

/* 悬停效果 */
.avatar-container:hover .avatar-image {
  transform: scale(1.1);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}

/* 下拉菜单样式 */
.dropdown-menu {
  border: none !important;
  border-radius: 8px !important;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;
  margin-top: 12px !important;
  padding: 8px 0 !important;
}

/* 菜单项样式 */
.menu-item {
  font-size: 14px;
  color: #333 !important;
  transition: all 0.2s ease;
}

.menu-item:hover {
  background: #f5f7fa !important;
  color: #409eff !important;
  transform: translateX(4px);
}

/* 分割线样式 */
.el-dropdown-menu__item--divided {
  border-color: #ebeef5 !important;
}
</style>

2.userStore增加logout方法

暂时先简单的实现删除token。

const logout = async () => {
    await removeToken()
  }

二.功能验证

运行项目,浏览器访问http://localhost:5173/index
在这里插入图片描述

三.知识点拓展

1. 单文件组件 (SFC)

代码表现

<template>...</template>
<script setup>...</script>
<style scoped>...</style>

通俗解释
• 就像"网页三件套"(HTML+CSS+JS)的现代版升级
template 是组件的外观布局(类似HTML)
script 是组件的核心逻辑(类似JS)
style 是组件的化妆包(类似CSS)
scoped 表示这个化妆包只服务当前组件,不会影响其他组件


2. 组合式 API (Composition API)

代码表现

<script setup>
// 所有代码都写在这里
const handleLogout = () => {...}
</script>

通俗解释
• Vue 3 的代码组织新方式,类似搭积木
• 特点:
• 所有功能代码集中编写,不再分散在 options 中
• 使用普通变量和函数就能实现响应式
• 代码复用更方便(可以抽离为函数)


3. 组件通信

代码表现

import { ElHeader, ElBreadcrumb } from 'element-plus'

通俗解释
• 组件就像乐高积木,可以自由组合
• 第三方组件(如 Element Plus)需要先导入再使用
• 组件间通过 props(属性)和 events(事件)传递信息
• 例如:<el-breadcrumb> 接收到 separator="/" 属性后显示斜杠分隔符


4. 状态管理 (Pinia)

代码表现

import useUserStore from '@/stores/user'
const userStore = useUserStore()
userStore.logout()

通俗解释
• 专门管理需要全局共享的数据(比如用户登录状态)
• 相当于给组件们建立一个共享储物柜
• 使用流程:

  1. 定义储物柜(创建 store)
  2. 需要时打开储物柜(import store)
  3. 存取物品(读写状态)

5. 样式作用域

代码表现

<style scoped>
.avatar-image { ... }
</style>

通俗解释
• 给样式添加"防污染护盾"
• 带 scoped 的样式只影响当前组件
• 实现原理:自动给选择器添加唯一标识,如:

.avatar-image[data-v-f3f3eg9] { ... }

6. 响应式基础

代码表现

const avatarUrl = new URL(...) // 静态资源引用

潜在响应式用法

import { ref } from 'vue'

const count = ref(0) // 变成响应式数据
function add() {
  count.value++ // 修改时页面自动更新
}

通俗解释
• 让数据与界面保持同步的魔法
• 当数据变化时,界面会自动更新
• Vue 3 主要使用 ref()reactive() 实现


7. 生命周期

代码表现

// 隐含在组件初始化过程中

通俗解释
• 组件的"人生阶段":

  1. 出生(创建)
  2. 成长(更新)
  3. 消亡(销毁)
    • 常用钩子:
    onMounted:组件加载完成时(适合请求数据)
    onUpdated:数据更新时
    onUnmounted:组件销毁时(适合清理资源)

知识图谱

单文件组件
Template
Script
Style
组合式API
状态管理
生命周期
组件通信
样式作用域
Pinia
Props/Events

四.思考

相关文章:

  • 游戏引擎学习第150天
  • 洗鞋小程序(源码+文档+讲解+演示)
  • Spring(4)——响应相关
  • 如何测试 item_get_video 小红书接口返回数据的详细说明
  • 【统计至简】【古典概率模型】联合概率、边缘概率、条件概率、全概率
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-5.4.2用户画像聚合(Terms Aggregation + Cardinality)
  • SpringCloud——环境搭建
  • html css网页制作成品——糖果屋网页设计(4页)附源码
  • Java中数据库索引选择B+树而非红黑树的详细解析
  • 【前端拓展】Canvas性能革命!WebGPU + WebAssembly混合渲染方案深度解析
  • 【MySQL】增删改查进阶
  • 学习C2CRS Ⅲ (Response Generation Module)
  • 【编程向导】-JavaScript-基础语法-类型检测
  • 软考高级信息系统项目管理师笔记-第23章组织通用管理
  • redis趣味解读
  • SpringMVC工作原理
  • Python :Pandas
  • harmonyOS(鸿蒙)— 网络权限(解决app网络资源无法加载,图片无法显示)
  • 帕金森病如何 “偷走” 患者的正常生活?
  • gin框架
  • 怎样对一个网站做seo/怎么做网站优化排名
  • 潍坊网站制作多少钱/百度推广客服人工电话多少
  • 写作网站5秒不写就删除/全网引流推广
  • html css设计与构建网站/东莞网络推广平台
  • 建网站需要什么/账号权重查询入口
  • 站长之家关键词查询/搜图片找原图