vue真实企业实战分享(下)

简介: 笔记

5. 可以愉快的调接口了


login.vue 代码添加

<script>
// 此为全局定义的过渡方法
import { loadingShow } from "../../common/js/common.js";
import url from "../../request/url.js";
import { postRequest } from "../../request/api.js";
export default {
  name: "login",
  props: {
    msg: String,
  },
  data() {
    return {
      userName: "",
      password: "",
      verify: "",
    };
  },
  methods: {
    // 登录方法
    loginFn() {
      if (!this.userName) {
        this.msgFn("warning", "请输入账号名");
        return;
      } else if (!this.password) {
        this.msgFn("warning", "请输入密码");
        return;
      } else {
        // 加载动画
        loadingShow();
        let data = {
          userName: this.userName,
          passWord: this.password
        };
        postRequest(url.login, data).then(
          (res) => {
            // 动画隐藏
            loadingHide();
            if (res.code == 500) {
              this.msgFn("error", res.msg);
              return;
            }
            // token 存入sessionStorage
            sessionStorage.setItem("token", res.token);
            // 页面跳转
            setTimeout(() => {
              this.$router.push("/home/studentData");
            }, 500);
          },
          (error) => {
            console.log(error);
          }
        );
      }
    },
    // 弹窗
    msgFn(type, text) {
      this.$message({
        message: text,
        type: type,
      });
    },
  },
  created() {
  },
};
</script>


6. main.js中 你需要的配置


  • 引入element ui中的元素并注册
  • 一些全局的动画配置
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import {
  Button,
  Container,
  Header,
  Aside,
  Main,
  Footer,
  Input,
  Loading,
  Message,
  Menu,
  Submenu,
  MenuItem,
  MenuItemGroup,
  Dropdown,
  DropdownMenu,
  Table,
  TableColumn,
  DropdownItem,
  Form,
  FormItem,
  Select,
  Option,
  OptionGroup,
  DatePicker,
  Pagination,
  MessageBox,
  Popover,
  Tag,
  Switch,
  Dialog
} from 'element-ui';
Vue.use(global)
Vue.use(Button)
Vue.use(Container)
Vue.use(Header)
Vue.use(Aside)
Vue.use(Main)
Vue.use(Footer)
Vue.use(Input)
Vue.use(Menu)
Vue.use(Submenu)
Vue.use(MenuItem)
Vue.use(MenuItemGroup)
Vue.use(Dropdown)
Vue.use(Table)
Vue.use(TableColumn)
Vue.use(DropdownMenu)
Vue.use(DropdownItem)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Select)
Vue.use(Option)
Vue.use(OptionGroup)
Vue.use(DatePicker)
Vue.use(Pagination)
Vue.use(Popover)
Vue.use(Dialog);
Vue.use(Tag)
Vue.use(Switch)
Vue.use(Loading.directive);
// 添加全局方法
Vue.prototype.$loading = Loading.service;
Vue.prototype.$message = Message;
Vue.prototype.$confirm = MessageBox.confirm;
Vue.prototype.$msgbox = MessageBox;
Vue.config.productionTip = false;
let vue = new Vue({
  router,
  render: h => h(App)
}).$mount('#app')
export default vue;


7. 配置路由拦截

  • 如果内容不多,可以放在main.js中
  • 记得要引入 router
router.beforeEach((to, from, next) => {
  // 以token为例
  let token = sessionStorage.getItem('token');
  // 需要验证之后才能进入 requireAuth
  if (to.meta.requireAuth) {
    if (token) {
      next();
      // 顺利进入
    } else {
      // 跳入到指定页面
      next({
        path: '/login'
      })
    }
  } else {
    // 顺利进入
    next();
  }
})


8. 全局方法配置


  • 存放目录,如下(架构师说的,我又思考了一下,放这里是有道理的)

8.png

给大家一个全局方法做参考,后续的按照这个来就是(依旧很贴心)

import vue from '../../main.js'
// 遮罩层控制
export function loadingShow(close){
    const loadingFade =  vue.$loading({
      lock: true,
      text: 'Loading',
      spinner: 'el-icon-loading',
      background: 'rgba(0, 0, 0, 0.7)'
    })
    if(close){
        loadingFade.close();
    }
  }


9. 父页面配置(home.vue)


  • 我感觉大家可能会需要,所以代码还是贴出来(有一种需要是作者感觉你会需要)
<template>
  <div class="container-big">
    <el-container class="container">
      <el-aside width="220px">
        <el-menu class="menu" :default-active="index">
          <el-submenu index="1">
            <template slot="title"><i class="el-icon-s-home"></i>首页</template>
            <el-menu-item index="1-1" @click="toRoute('/home/studentData', '学生数据')"
              >学生数据</el-menu-item
            >
          </el-submenu>
          <el-submenu index="2">
            <template slot="title"
              ><i class="el-icon-s-cooperation"></i>教务处 / 管理</template
            >
            <el-submenu index="2-2">
              <template slot="title">角色管理</template>
              <el-menu-item
                index="2-2-1"
                @click="toRoute('/home/teacherData', '老师管理')"
              >
                老师管理</el-menu-item
              >
              <el-menu-item
                index="2-2-2"
                @click="toRoute()"
              >
                老师审核</el-menu-item
              >
            </el-submenu>
            <el-submenu index="2-3">
              <template slot="title">其它管理</template>
              <el-menu-item
                index="2-3-1"
                @click="
                  toRoute()
                "
              >
                教务管理</el-menu-item
              >
              <el-menu-item
                index="2-3-3"
                @click="
                  toRoute(
                    '/home/shopList',
                    ' / 运营管理 / 店铺管理 / 店铺列表',
                    '店铺列表',
                    '2-3-3'
                  )
                "
              >
                扫厕所管理</el-menu-item
              >
            </el-submenu>
          </el-submenu>
        </el-menu>
      </el-aside>
      <el-container>
        <el-header style="text-align: right; font-size: 14px">
          <div class="opration">
            <el-dropdown>
              <i class="el-icon-setting" style="margin-right: 15px"> 操作 </i>
              <el-dropdown-menu slot="dropdown">
                <el-dropdown-item @click.native="logOut()"
                  >退出登录</el-dropdown-item
                >
              </el-dropdown-menu>
            </el-dropdown>
            <span>{{ userName }}</span>
          </div>
          <div class="router-con">
            <div>
              <span>xxx公司运营管理系统</span>
            </div>
            <h2>{{pageName}}</h2>
          </div>
        </el-header>
        <el-main>
          <router-view></router-view>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>
<script>
export default {
  name: "home",
  data() {
    return {
      userName: "",
      index: "1-1",
      pageName: ''
    };
  },
  created() {
    // 可以在此取权限相关数据
  },
  methods: {
    // 跳转各个页面
    toRoute(url, name) {
      this.$router.push(url);
      this.pageName = name;
    },
    // 退出登录
    logOut() {
      // 跳转至登录页面
      this.$router.push("/login");
      // 一般需要在此清除用户的一些缓存数据
    },
  },
};
</script>
<style lang="scss" scope>
.logo {
  overflow: hidden;
  padding: 10px 0px 10px 20px;
  cursor: pointer;
  img {
    float: left;
    margin-top: 10px;
  }
  p {
    float: left;
    margin: 12px 0 0 12px;
    color: #fff;
    font-weight: 600;
    font-size: 20px;
    vertical-align: middle;
    animation: fade-in;
    animation-duration: 0.3s;
  }
}
.el-submenu .el-menu-item {
  text-align: left;
  height: 40px;
  line-height: 40px;
  // margin-left: 10px;
}
.menu {
  .el-submenu {
    .el-submenu__title {
      padding-left: 30px;
    }
    .el-menu {
      .el-submenu__title {
        padding-left: 50px !important;
      }
    }
  }
}
.el-header {
  color: #333;
  border-bottom: 1px solid #d3d3d3;
  background: #fff;
  padding: 0;
  box-shadow: darkgrey 5px 0 5px 1px; //边框阴影
  .opration {
    height: 60px;
    line-height: 60px;
    padding: 0 20px;
    cursor: pointer;
  }
  .router-con {
    height: 60px;
    // width: 100%;
    padding: 20px;
    border-bottom: 1px solid #d3d3d3;
    text-align: left;
    div {
      margin-bottom: 10px;
    }
  }
}
.container-big {
  width: 100%;
  height: 100%;
}
.container {
  width: 100%;
  height: 100%;
  .el-main {
    margin-top: 100px;
    background: #f2f2f2;
  }
}
.el-aside {
  color: #333;
  height: 100%;
  background: #001529;
  overflow-y: auto;
  overflow-x: hidden;
  .el-menu {
    border: none;
    background: #001529;
    li {
      .el-submenu__title {
        color: #f5f5f5;
        text-align: left;
      }
      .el-submenu__title:hover {
        color: #333;
      }
      ul {
        li {
          color: #dcdcdc;
          .el-menu-item-group__title {
            // color: #dcdcdc;
          }
        }
        li.is-active {
          color: #409eff;
        }
        li:hover {
          color: #333;
        }
      }
    }
  }
}
</style>

代码中写了详细的注释,在这里不多做解释

可以全部复制丢你的文件里即可看到效果(很贴心吧)


10. FAQ:你可能会碰到的问题及解决方案


某些东西安装出错

某些东西未生效(请注意版本问题)

vue.config.js文件不生效(此文件做出了任何改变,一定要重启服务,重新编译)

某些组件样式不对(查看 main.js 中的引入与注册是否做好了)

报某些模块找不到(查看文件存放路径与引入路径是否正确)



目录
相关文章
|
9天前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
107 2
|
3月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
534 0
|
3月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
2月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
105 0
|
2月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
237 1
|
3月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
365 17
|
3月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
211 1
|
3月前
|
JavaScript API 开发者
Vue框架中常见指令的应用概述。
通过以上的详细解析,你应该已经初窥Vue.js的指令的威力了。它们是Vue声明式编程模型的核心之一,无论是构建简单的静态网站还是复杂的单页面应用,你都会经常用到。记住,尽管Vue提供了大量预定义的指令,你还可以创建自定义指令以满足特定的需求。为你的Vue应用程序加上这些功能增强器,让编码变得更轻松、更愉快吧!
71 1
|
3月前
|
存储 JavaScript 前端开发
如何高效实现 vue 文件批量下载及相关操作技巧
在Vue项目中,实现文件批量下载是常见需求。例如文档管理系统或图片库应用中,用户可能需要一次性下载多个文件。本文介绍了三种技术方案:1) 使用`file-saver`和`jszip`插件在前端打包文件为ZIP并下载;2) 借助后端接口完成文件压缩与传输;3) 使用`StreamSaver`解决大文件下载问题。同时,通过在线教育平台的实例详细说明了前后端的具体实现步骤,帮助开发者根据项目需求选择合适方案。
301 0
|
3月前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
133 0