vue-pure-admin项目的学习

前言

感谢作者的开源,让我们有机会学习
项目地址: 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

### 回答1: vue-pure-admin 是一个基于Vue.js和Element UI的开源后台管理系统模板。它提供了一系列功能丰富的组件和布局,使开发者可以快速搭建并定制自己的后台管理系统。 vue-pure-admin 具有以下特点: 1. 简洁易用:vue-pure-admin 的用户界面设计简洁清晰,使用者可以快速上手。同时,它提供了丰富的示例代码和文档,开发者可以轻松定制和扩展。 2. 响应式设计:vue-pure-admin 支持响应式布局,可以在不同设备上自动适应和展示,使用户能够在不同屏幕尺寸下方便地管理数据。 3. 多功能组件:vue-pure-admin 包含了许多实用的组件,如表格、表单、图表等,使开发人员能够快速构建各种复杂的后台管理界面。 4. 扩展性强:vue-pure-admin 的各个组件和布局都采用模块化设计,开发者可以根据自己的需求和喜好进行二次开发和定制。因此,它非常适用于中小型企业和个人开发者。 总之,vue-pure-admin 是一个功能强大且易于使用的后台管理系统模板,它提供了丰富的组件和布局,可以帮助开发者快速搭建自己的后台管理系统。无论是开发大型企业内部管理系统,还是个人项目的后台部分,vue-pure-admin 都是一个不错的选择。 ### 回答2: vue-pure-admin 是一个基于 Vue.js 和 Element UI 的纯净后台管理系统模板。它提供了丰富的组件和功能,可以帮助开发者快速构建出美观、易用的后台管理界面。 vue-pure-admin 的特点之一是纯净,它遵循了最简约的设计风格,界面简洁大方,没有赘余的元素,使用户能够专注于核心功能的实现。同时,它具有响应式布局,支持多种设备和屏幕的展示,并且可以进行自定义的布局设置。 此外,vue-pure-admin 还提供了丰富的功能模块,包括权限管理、用户管理、角色管理等,既可以满足普通后台管理系统的需求,也可以作为基础模板进行扩展和定制。它还支持多语言和主题切换,在不同的国家和地区都可以方便地使用。 使用 vue-pure-admin 开发后台管理系统,可以大大提高开发效率和用户体验。它的文档详细清晰,提供了示例代码和接口说明,方便开发者快速上手。同时,它还积极维护和更新,有一个活跃的开源社区,提供了技术支持和问题解答。 总的来说,vue-pure-admin 是一个功能强大、易用的后台管理系统模板,适用于各种规模的项目。它通过简洁的设计和丰富的功能,帮助开发者快速构建出符合现代标准的后台管理界面。 ### 回答3: vue-pure-admin是一个基于vue.js开发的开源后台管理系统模板。它提供了丰富的功能和样式组件,可以帮助开发者快速搭建美观、实用的后台管理系统。 首先,vue-pure-admin具有简单易用的特点。它使用vue.js作为前端框架,通过组件化的方式进行开发,代码结构清晰,易于理解和维护。开发者可以根据自己的需求,选择需要的组件和功能进行集成。 其次,vue-pure-admin提供了丰富的功能和组件。它包含了常见的后台管理系统的基本功能,如用户管理、角色管理、权限管理等。同时,它还提供了各种实用的组件,如表格、图表、表单等,可以满足不同项目的需求。开发者可以根据自己的需求,灵活使用这些组件,快速构建出符合要求的后台管理系统。 另外,vue-pure-admin还具有良好的可扩展性。它使用了模块化的开发方式,开发者可以方便地添加自己的功能和组件。同时,它也考虑到了多语言和多主题的需求,提供了相应的解决方案。这样一来,开发者可以根据自己的项目需求进行定制化,使得后台管理系统更加符合项目需求。 总结来说,vue-pure-admin是一个简单易用、功能丰富、可扩展的开源后台管理系统模板。它提供了各种实用的功能和组件,帮助开发者快速搭建美观、实用的后台管理系统。无论是小型项目还是大型项目,都可以使用vue-pure-admin来提高开发效率,减少重复代码的编写。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无知的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值