vue-pure-admin项目的学习

2023-11-09

前言

感谢作者的开源,让我们有机会学习
项目地址: vue-pure-admin
只是记录自己的学习,有问题地方感谢指正
只会记录一些自己目前感觉有用的知识点
代码demo都是基于vue3、ts、element plus

目录结构

-src
 --api			存放与请求有关的文件
 --assets		存放静态文件(图标、文字)
 --components	存放全局公共组件
 --config		项目配置
 --directives	全局指令
 --layout		全局布局
 --plugins		插件
 --router		路由
 --store		vuex
 --style		全局样式
 --utils		全局工具方法
 --views		页面

登录页

登录页小功能

项目效果如下,感觉挺不错的
在这里插入图片描述
demo

<template>
  <div class="login">
    <div class="user">
      <div ref="nameRef" class="user_name">用户名</div>
      <input
        class="input"
        type="text"
        v-model="userName"
        @focus="onUserFocus(nameRef)"
        @blur="onUserBlur(nameRef, userName)"
      />
    </div>
  </div>
</template>

<script  lang="ts">
import { defineComponent, ref } from "vue";
export default defineComponent({
  setup() {
    let nameRef = ref(null);
    let userName = ref("");

    return {
      userName,
      nameRef,
      onUserFocus,
      onUserBlur,
    };
  },
});

//获取焦点事件
const onUserFocus = (dom) => {
  dom.classList.remove("blur_name");
  dom.classList.add("focus_name");
};

//失去焦点事件
const onUserBlur = (dom, value) => {
  if (!value) {
    dom.classList.add("blur_name");
  }
};
</script>

<style scoped lang="scss">
.login {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 300px;
  height: 150px;
  margin-left: 100px;
}
.user {
  width: 100%;
  position: relative;
  display: grid;
}
.user_name {
  color: gray;
  position: relative;
  left: 20px;
  top: 10px;
  font-size: 18px;
}
.focus_name {
  transform: translateY(-20px);
  transition: 0.3s;
  font-size: 14px;
  color: blueviolet;
}
.blur_name {
  transform: translateY(0px);
  transition: 0.3s;
  font-size: 18px;
}

.input {
  position: absolute;
  top: 0;
  left: 0;
  border: none;
  border-bottom: 1px solid gray;
  outline: none;
  background: none;
  padding: 0.5rem 0.7rem;
  font-size: 1.2rem;
  color: #555;
}
</style>

效果
在这里插入图片描述
备注(踩坑)

  • 原理差不多,与源代码有些区别
  • 不要使用封装好的input框,要使用原始的input框。我使用position和z-index属性可以使文字和输入框在一块,但是会无法触发获取焦点事件
  • 使用原生输入框的话,需要解决的问题是前台如何进行登陆校验。
  • 试了一下el-input,打算修改placeholder的样式来实现,但是placeholder从输入框里跑出去看不见了

首页

全屏

使用了vueuse包里的useFullscreen功能
vueuse:VueUse不是Vue.use,它是为Vue 2和3服务的一套Vue Composition API的常用工具集,是目前世界上Star最高的同类型库之一。它的初衷就是将一切原本并不支持响应式的JS API变得支持响应式,省去程序员自己写相关代码。

vueuse官方文档

页面跳转,顶部进度条

在这里插入图片描述
依赖包:NProgress
官方文档

菜单标签

项目效果
在这里插入图片描述
这块的功能涉及路由和菜单比较复杂,就简单写了个类似的demo,代码如下:

组件代码

<template>
  <div @mouseover="handleOver(tagRef)" @mouseout="handleOut(tagRef)">
    <div
      class="tag"
      ref="tagRef"
      :class="tagOptions.isActive ? 'active' : 'common'"
    >
      <!-- 文字 -->
      <div>{{ tagOptions.message }}</div>
      <!-- 关闭按钮 -->
      <i
        v-show="tagOptions.showIcon"
        class="el-icon-close close-btn"
        @click="closeTag"
      ></i>
    </div>
    <!-- 底部线条 -->
    <div
      ref="tagBottomRef"
      class="tag-bottom"
      :style="{
        width: tagOptions.isActive || tagOptions.isMove ? '94%' : '0%',
      }"
    ></div>
  </div>
</template>

<script lang="ts">
import { defineComponent, onMounted, reactive, ref, watch } from "vue";
export default defineComponent({
  props: {
    //是否激活,默认不激活
    active: {
      type: Boolean,
      default: false,
    },
    //是否显示按钮,默认不显示
    icon: {
      type: Boolean,
      default: false,
    },
    //信息
    message: {
      type: String,
      default: "",
    },
    //路由地址
    url: {
      type: String,
      default: "",
    },
  },
  setup(props, context) {
    let tagOptions = reactive({
      //是否激活
      isActive: false,
      //是否显示按钮
      showIcon: false,
      //消息
      message: "",
      //路由地址
      url: "",
      isMove: false,
    });

    let tagRef = ref(null);

    let tagBottomRef = ref(null);

    //监听激活状态
    watch(
      () => props.active,
      (nval) => {
        tagOptions.isActive = nval;
        tagOptions.isMove = false;
        tagOptions.showIcon = false;
      }
    );

    //页面渲染完成进行赋值
    onMounted(() => {
      tagOptions.isActive = props.active;
      tagOptions.showIcon = props.icon;
      tagOptions.message = props.message;
      tagOptions.url = props.url;
    });
    //鼠标移入事件
    const handleOver = (dom) => {
      //鼠标移入时,如果不是激活状态,显示底部边框、关闭按钮
      if (!props.active) {
        tagOptions.showIcon = true;
        tagOptions.isMove = true;
      }
    };

    //鼠标移出事件
    const handleOut = (dom) => {
      //鼠标移出时,如果不是激活状态,隐藏底部边框、关闭按钮
      if (!props.active) {
        tagOptions.showIcon = false;
        tagOptions.isMove = false;
      }
    };

    //关闭事件
    const closeTag = () => {
      context.emit("close");
    };

    return {
      tagOptions,
      tagRef,
      tagBottomRef,
      handleOver,
      handleOut,
      closeTag,
    };
  },
});
</script>

<style scoped lang="scss">
.tag {
  display: flex;
  height: 20px;
  line-height: 20px;
  margin: 0 2px;
  cursor: pointer;
}

// 激活样式
.active {
  background: #eaf4fe;
  color: #8590ff;
  border-top-right-radius: 5px;
  border-top-left-radius: 5px;
  padding: 6px 10px;
}

//平常样式
.common {
  padding: 6px 10px;
  color: #9c9e9c;
}

//底部线条样式
.tag-bottom {
  height: 2px;
  width: 0%;
  margin: 0 3%;
  background: #1890ff;
  transition: width 1s;
}

// 按钮样式
.close-btn {
  margin-left: 5px;
  font-size: 12px;
  line-height: 20px;
  color: #8590ff;
  font-weight: 600;
}
</style>

实例

<template>
  <div class="tag_list">
    <my-tag
      v-for="item in menuList"
      :key="item.url"
      :message="item.message"
      :active="isActive == item.url"
      @click="change(item)"
      @close="closeItem(index, item)"
    ></my-tag>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref } from "vue";
import MyTag from "./my-tag.vue";
export default defineComponent({
  components: { MyTag },
  setup() {
    let isActive = ref("news");
    let menuList = ref([
      {
        message: "首页",
        url: "home",
      },
      {
        message: "新闻",
        url: "news",
      },
      {
        message: "我的",
        url: "my",
      },
    ]);

    //切换菜单
    const change = (item) => {
      isActive.value = item.url;
      console.log(isActive.value)
    };

    //关闭菜单
    const closeItem = (index, item) => {
      console.log(`你关闭了${item.message}`);
    };

    return {
      isActive,
      menuList,
      change,
      closeItem,
    };
  },
});
</script>

<style scoped lang="scss">
.tag_list {
  display: flex;
}
</style>

效果
在这里插入图片描述
备注(踩坑)

  • 右侧按钮最开始用的是v-if 但是鼠标移入移出都会创建、销毁影响性能。另一个是会造成页面的闪烁,导致图标点不了,换成v-show就很好的解决了这个问题
  • 文字下面的线条,最开始是用的border-bottom也能实现这个效果,但是线条没有动画效果。后来发现这个线条实际上是一个单独的小div,换成div后,线条的效果就很不错了。

中英文切换

传送门

流程图

滴滴开源流程图

编辑器

wangEditor

组件

视频组件

传送门

拖拽组件

传送门

图片裁剪

这个目前用不到,不踩坑了,有需要使用的,可以去看官方文档

传送门

系统管理

table表格

这个表格挺有用的,是一个专门的表格组件,有丰富的功能

官方地址:vxe-table

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue-pure-admin项目的学习 的相关文章

随机推荐

  • 2021最新版IDEA右侧Maven模块以及View下的Maven Project不见了解决方法

    问题描述 重新启动了一下IDEA后发现许多jar包找不到 想使用Maven进行依赖刷新 却找不到项目右侧的Maven Project 网上搜索了很多解决方法 如清除IDEA缓存 重启电脑 删除隐藏文件等等 都没有效果 将正确的解决方法记录在
  • Redis集群模式使用Lua脚本的限制

    问题复现 ERR bad lua script for redis cluster all the keys that the script uses should be passed using the KEYS array and KE
  • chapter15:springboot与监控管理

    Spring Boot与监控管理视频 1 简介 通过引入spring boot starter actuator 可以使用SpringBoot为我们提供的准生产环境下的应用监控和管理功能 我们可以通过http jmx ssh协议来进行操作
  • js宏观任务、微观任务

    js运行机制分为同步异步 异步又分为宏观事件和微观事件 同步异步 js是一门单线程语言 因此js在同一个时间里只能做一件事 单线程意味着 如果在同个时间有多个任务的话 这些任务就需要排队 前一个执行完成才能执行下一个任务 同步任务 同步任务
  • Linux之内核级防火墙selinux模块

    一 什么是selinux SELinux Security Enhanced Linux 是美国国家安全局 NSA 对于强制访问控制的实现 是 Linux历史上最杰出的新安全子系统 NSA是在Linux社区的帮助下开发了一种访问控制体系 在
  • c语言小游戏——扫雷

    扫雷是一款经典的单人益智游戏 玩家需要在一个由许多方块组成的棋盘上找出所有的地雷 而不触发任何一颗地雷 int input 0 do menu printf 请选择 gt scanf d input 输入1进入游戏 输入0退出游戏 输入其他
  • 我们总结了每个技术开发团队都会遇到的 4 个难题

    我们整理了一篇 每个技术团队都会遇到的4个难题 帮助即将从校园进入公司实习的后端程序员 以实践的视角 看看一个后端技术团队会遇到的一些难题 虽然 技术上的难题远不止于此 但如果能从这篇文章中获得一些职业体感 也许对你的实习面试会有所帮助 从
  • Python图像处理-3.pil裁剪、旋转粘贴图片

    from PIL import Image import matplotlib pyplot as plt pil im1 Image open pic1 png plt figure girlfriend1 plt imshow pil
  • c++中创建与调用dll

    文章目录 1 dll的创建 2 dll的使用 3 仅使用dll 显式链接 4 一点小的建议 好处想必不用说了 所谓的黑盒复用 实现模块化的同时避免源代码暴露等 可以将某一通用功能做成模块 方便复用 同时软件更新时如果只更新了几个模块 可以更
  • zookeeper

    先说 Paxos 它是一个基于消息传递的一致性算法 Leslie Lamport 在 1990 年提出 近几年被广泛应用于分布式计算中 Google 的 Chubby Apache 的 Zookeeper 都是基于它的理论来实现的 pxos
  • Vuejs学习八:map()函数

    定义 map 函数定义在JS的array中 它返回一个新的数组 数组中的元素为原生数据用函数处理后的值 map 不会对空数组进行检测 map 不会改变原始数组 let temp that caseTagsList map item gt i
  • WebSocket菜鸟教程二

    websocket服务器 多窗口显示数据案例 注意事项 1 因为WebSocket存在一段时间后自动断开链接的问题 故采用每次读写操作都重新链接的方式 2 服务端总链接数量有限 因此每次重新链接前应先关闭之前的链接 而不能直接创建链接 3
  • mysql(二)Explain详解

    目录 Explain用法 Explain的列详解 id select type table partitions type possible keys key key len ref rows filtered explain命令是查看My
  • vue路由监听失效

    场景 vue 2 6 10 vue router 3 0 2 写法一 watch route to from debugger 亲测 监听失效 写法二 watch route handler function val oldVal cons
  • 前、中、后缀表达式及其转换

    文章目录 一 前缀表达式 1 1 定义 1 2 求值 二 中缀表达式 2 1 定义 2 2 求值 三 后缀表达式 3 1 定义 3 2 求值 四 转换 4 1 中缀表达式转后缀表达式 4 2 中缀表达式转前缀表达式 一 前缀表达式 1 1
  • 多种子区域生长的图像分割

    基于多种子区域生长的图像分割 区域生长原理 步骤 理论基础 matlab代码 区域生长原理 步骤 1 选取区域生长的起始点 种子 2 确定区域生长的规则 3 确定结束生长的条件 4 寻找符合生长条件的点 纳入生长区域 5 以新纳入的点作为种
  • 前端--HTML

    文章目录 HTML结构 快速生成代码框架 HTML常见标签 表格标签 编写简历信息 填写简历信息 Emmet 快捷键 HTML 特殊字符 一 HTML结构 1 认识HTML标签 HTML 代码是由 标签 构成的 形如 hello 标签名 b
  • idea:spring框架的@Resource注解爆红解决方法

    idea spring框架的 Resource注解爆红的解决方法 如图所示 只需在pom xml中加入以下依赖 maven的中央仓库该依赖
  • sqlserver中分区函数 partition by的用法

    partition by关键字是分析性函数的一部分 它和聚合函数不同的地方在于它能返回一个分组中的多条记录 而聚合函数一般只有一条反映统计值的记录 partition by用于给结果集分组 如果没有指定那么它把整个结果集作为一个分组 cre
  • vue-pure-admin项目的学习

    前言 感谢作者的开源 让我们有机会学习 项目地址 vue pure admin 只是记录自己的学习 有问题地方感谢指正 只会记录一些自己目前感觉有用的知识点 代码demo都是基于vue3 ts element plus 目录结构 src a