vue2.0项目第一部分

news2024/11/26 5:43:05

论坛项目

后端管理系统

服务器地址:

http://172.16.11.18:9090

swagger地址:

http://172.16.11.18:9090/doc.html

前端h5地址:

http://172.16.11.18:9099/h5/#/

前端管理系统地址:

http://172.16.11.18:9099/admin/#/

搭建项目


vue create .   创建项目

搭建项目的架构(目录的相关)


分析系统结构


分析系统整个项目分为:

路由结构:一级路由一级二级路由涉及到重定向

根据分析安装路由:

用vue2所以对应使用 vue router@3

配置路由的入口文件初步代码(在router.js文件中):

//vue入口文件,创建路由以及导出路由
import Vue from "vue";
import VueRouter from "vue-router";
//注册
vue.use(VueRouter)
//创建路由实例
const router=new VueRouter({
    mode:"hash",
    routes:[],
    base:'/admin',
    //配置滚动的 --用户切换路由组件后回到顶部
    scrollBehavior(){
        return{x:0,y:0} //返回return 一个对象 回到(0,0)(左上角)坐标

    }
})
//暴露文件
export default router

引入使用路由文件(在main.js中)

import Vue from "vue";
import App from "./App.vue";

Vue.config.productionTip = false;
//引入路由文件
import router from "./router";

new Vue({
  router,
  render: (h) => h(App),
}).$mount("#app");

在router文件下创建 routers 放这些路径

配置静态路由文件(在routes.js文件中)

//路由配置
//同步引入 之间
import Admin from "../views/admin.vue"
import Login from "../views/login.vue"
import Error from "../views/error.vue"
export default [
    {
        path:"/",
        component:Admin   
    },
    {
        path:"/login",
        component:Login  
    },
    {
        path:"/error",
        component:Error  
    },
]

在views文件夹下面创建三个组件

在里面写各自的内容(这里以login.vue为举例)

在App.vue中配置一级路由出口

<template>
  <div id="app">
    <!-- 使用路由的内置组件 -->
    <router-view></router-view>
  </div>
</template>

测试项目路由是否正常

分析什么情况进error,用户在地址栏输入非路由路径 直接进入404

 {
    // 非路由直接进error
    path: "*",
    redirect: "/error",
  },

为了项目首次启动加载的问题。如果同步大量引入组件,vue项目首次启动需要加载同步组件进行编译,会造成白屏时间过长,需要降组件转化为异步懒加载方式。

export default [
  {
    path: "/",
    component: () => import("../views/admin.vue"),
    //按需组件加载  require()  了解
  },
  {
    path: "/login",
    component: () => import("../views/login.vue"),
  },
  {
    path: "/error",
    component: () => import("../views/error.vue"),
  },
  {
    // 非路由直接进error
    path: "*",
    redirect: "/error",
  },
];

实现登录流程


使用工具 apipost 测试 接口

测试接口完毕之后,在项目中实现network网络 请求封装

安装axios 请求插件

npm i axios

在utils工具类文件创建request.js 请求文件

实现axios 封装
/**
 * 网络请求axios  封装
 * **/

import axios from "axios";

//创建方式写法
// const http=axios.create({

// });

//设置axios的配置
//配置请求基本路径
axios.defaults.baseURL = "";
// 配置axios 超时
axios.defaults.timeout = 2000;
//配置请求头
axios.defaults.headers.post["Content-Type"] = "application/json";

//请求拦截器
//config 请求配置
axios.interceptors.request.use(
  (config) => {
    // 必带返回值
    return config;
  },
  (error) => {
    //请求报错
    return Promise.reject(error);
  }
);
//响应拦截器
axios.interceptors.response.use(
  (response) => {
    //响应成功
    return Promise.resolve(response);
  },
  (error) => {
    return Promise.reject(error);
  }
);

//封装get   post  请求

export const get = (url, data, type) => {
  return axios({
    method: "get",
    url: url,
    params: data,
    headers: type,
  });
};

export const post = (url, data, type) => {
  return axios({
    method: "post",
    url: url,
    data: data,
    headers: type,
  });
};

axios 二次封装文件完成之后,在network文件中按照模块化整理接口

使用captch 验证码 产生uuid值


封装了一个utils 工具类 产生uid值

/**
 * 通用的工具类
 * **/

export const getUuid = () => {
  //产生uuid值
  return "xxxxx-xxxxy-xxyxx-xyxxx".replace(/[xy]/g, (c) => {
    return (
      c === "x" ? Math.ceil(Math.random() * 16) || 0 : "a" || "b"
    ).toString(16);
  });
};

在login组件中使用uuid值展示验证码图片

<template>
  <div>
    账号:<input type="text" /> 密码:<input type="text" /> 验证码:<input type="text" />
    <img :src="captchUrl" alt="" />
    <button>登录</button>
  </div>
</template>

<script>
//引入utils
import { getUuid } from "../utils";
export default {
  data() {
    return {
      captchUrl: "http://172.16.11.18:9090/captcha.jpg",
      uuid: null,
    };
  },
  created() {
    //获取uuid值
    this.uuid = getUuid();
    this.captchUrl += `?uuid=${this.uuid}`;
  },
};
</script>

实现登录


定义登录接口(在network文件下的user.js文件里)

// 用户登录
export const userLogin = (data) => {
  return post("/sys/login", data);
};

在登录login组件中执行业务代码

methods: {
    async login() {
      let { username, password, captcha, uuid } = this;
      let res = await userLogin({
        uuid,
        username,
        password,
        captcha,
      });
      console.log(res);
    },
  },

登录之后实现跳转


封装一个H5缓存类(在utils下的index.js文件中)

//html5 缓存操做
export const findStorage = (key) => {
  if (key) return localStorage.getItem(key);
  return null;
};

export const setStorage = (key, data) => {
  localStorage.setItem(key, JSON.stringify(data));
};

export const removeStorage = (key) => {
  localStorage.removeItem(key);
};

登陆之后写入缓存(写在login.vue组件中的methods下)

 // 用户登录
    async login() {
      let { username, password, captcha, uuid } = this;
      let res = await userLogin({
        uuid,
        username,
        password,
        captcha,
      });
      console.log(res);
      //接入缓存
      setStorage("_token", res.data.token);
      //编程式路由导航$router
      this.$router.replace({ path: "/" });
    },

实现系统刷新 检测用户是否登录。


添加守卫做业务处理(那些路由需要处理,那些不需要处理,定义的是项目的白名单,写在router.js里面)

//设置守卫
//定义白名单
const whiteList = ["/login", "/error"];
router.beforeEach((to, from, next) => {
  //白名单路由不检测token直接放行
  //读取token
  let token = findStorage("_token");
  //判断token
  if (token) {
    //用户登录过
    //如果进入的是登录界面  直接到系统首页
    if (to.path == "/login") {
      next({ path: "/" });
    }
    next();
  } else {
    //用户未登录
    if (whiteList.indexOf(to.path) !== -1) {
      next();
    } else {
      next({ path: "/login", query: { redirect: to.path } });
    }
  }
});

注意;这块需要多思考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/331982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 变量提升

文章目录JavaScript 变量提升JavaScript 初始化不会提升在头部声明你的变量JavaScript 变量提升 JavaScript 中&#xff0c;函数及变量的声明都将被提升到函数的最顶部。 JavaScript 中&#xff0c;变量可以在使用后声明&#xff0c;也就是变量可以先使用再声明。 以下两个实…

前端面试题汇总

一&#xff1a;JavaScript 1、闭包是什么&#xff1f;利弊&#xff1f;如何解决弊端&#xff1f; 闭包是什么&#xff1a;JS中内层函数可以访问外层函数的变量&#xff0c;外层函数无法操作内存函数的变量的特性。我们把这个特性称作闭包。 闭包的好处&#xff1a; 隔离作用…

三、Linux文件 - Close函数讲解实战,文件权限

目录 1.Close函数 2.Linux文件权限 3.项目实战 3.1Close 项目实战1 3.2 文件权限项目实战 -Open函数设置权限 1.Close函数 参数说明 在Linux系统库的定义&#xff1a; int close(int fd) 包含的头文件 #include <unistd.h> 功能就是简单的关闭文件 注&#x…

荧光素标记PEG衍生物Fluorescein-PEG-Acid,FITC-PEG-COOH

英文名称&#xff1a;FITC-PEG-COOH&#xff0c;Fluorescein-PEG-Acid 中文名称&#xff1a;荧光素-聚乙二醇-羧基 荧光素标记的聚乙二醇PEG衍生物的荧光波长为495 nm&#xff0c;发射大约515 ~ 520 nm处有最大吸收。FITC组可以很容易地从它的黄色和绿色荧光。额外的功能&…

Python算法:深度优先搜索—DFS(模板及其样例)

深度优先搜索搜索 【介绍】 • 沿着一条路径一直搜索下去&#xff0c;在无法搜索时&#xff0c;回退到刚刚访问过的节点。 • 并且每个节点只能访问一次。 • 本质上是持续搜索&#xff0c;遍历了所有可能的情况&#xff0c;必然能得到解。 • 流程是一个树的形式&#xff0c;…

深度学习基础-机器学习基本原理

本文大部分内容参考《深度学习》书籍&#xff0c;从中抽取重要的知识点&#xff0c;并对部分概念和原理加以自己的总结&#xff0c;适合当作原书的补充资料阅读&#xff0c;也可当作快速阅览机器学习原理基础知识的参考资料。 前言 深度学习是机器学习的一个特定分支。我们要想…

项目管理的前路,前辈能给一些意见吗?

什么是项目管理&#xff1f;关于项目管理的解释主要是基于国际项目管理三大体系不同的解释及本领域权威专家的解释!!!! 项目管理就是以项目为对象的系统管理方法&#xff0c;通过一个临时性的、专门的柔性组织&#xff0c;对项目进行高效率的计划、组织、指导和控制&#xff0c…

活动目录(Active Directory)管理,AD自动化

每个IT管理员几乎每天都在Active Directory管理中面临许多挑战&#xff0c;尤其是在管理Active Directory用户帐户方面。手动配置用户属性非常耗时、令人厌烦且容易出错&#xff0c;尤其是在大型、复杂的 Windows 网络中。Active Directory管理员和IT经理大多必须执行重复和世俗…

关于Zebec生态的改进提案,即将上线的 Nautilus 链

概括 在最初作为 Solana 原生应用程序推出一年后&#xff0c;Zebec 团队已经能够通过在 BNB和NEAR区块链上成功部署来扩大其产品的范围。 凭借继续向尽可能多的公司/协议/基金提供薪资工具和基础设施的雄心勃勃的计划&#xff0c;我们决定采用最终将使 Zebec生态系统及其核心…

情人节又到了 程序员高逼格表白套路 附源码

又到了每月都有的情人节了&#xff08;笑&#xff09; 一个相当重要的日子&#xff1a;214&#xff0c;不知道是从啥时候开始兴起来的&#xff0c;单身的羡慕着有对象的&#xff0c;有对象的羡慕着单身的&#xff0c; 但也有很大一部分单身人士等待着表白的好机会&#xff0c;毕…

08.程序环境和预处理

1. 程序的翻译环境和执行环境在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境&#xff0c;它用于实际执行代码。2. 详解编译链接2.1 翻译环境 //.obg组成一个程序的每个源文…

力扣方法总结:其他数据结构(单调栈等)

单调栈 单调栈代码模板 找下一个更大&#xff08;不是大于等于&#xff09;元素 vector<int> nextGreaterElement(vector<int>& nums) {int n nums.size();vector<int> res(n, -1);stack<int> s;// 从后向前构建单调栈for (int i n - 1; i >…

在 Eclipse 中创建 Maven 项目

1.在 Eclipse 中配置 MavenEclipse 中默认自带 Maven 插件&#xff0c;但是自带的 Maven 插件不能修改本地仓库&#xff0c;所以通常我们不使用自带的 Maven &#xff0c;而是使用自己安装的&#xff0c;在 Eclipse 中配置 Maven 的步骤如下&#xff1a; 1) 点击 Eclipse 中的 …

C# 引用DLL 静态字段和非静态字段

再讲一下如何引用dll动态链接库&#xff1a;右键项目----添加 --项目引用----选择你要添加的dll即可。在依赖项这里就可以看到。再在要用的项目那里using一下这个dll的命名空间&#xff1a;using 生成dll;然后就可以使用以下所说的两种方法去调用dll里的函数了。切记&#xff0…

KDZD832 智能蓄电池活化仪

一、产品概述 KDZD832 智能蓄电池活化仪&#xff08;2V-24V 一体机&#xff0c;适用于 2V、6V、12V/24V 蓄电池&#xff0c;以下简称活化仪&#xff09;&#xff0c;是专用于日常维护中对落后蓄电池处理的便携式产品&#xff0c;它具有四种独立的使用方式&#xff1a;电池放电…

python爬虫--beautifulsoup模块简介

BeautifulSoup 的引入 我们学习了正则表达式的相关用法&#xff0c;但是一旦正则写的有问题&#xff0c;可能得到的就不是我们想要的结果了&#xff0c;而且对于一个网页来说&#xff0c;都有一定的特殊的结构和层级关系&#xff0c;而且很多标签都有 id 或 class 来对作区分&…

Vue3+node.js实现webScoket双向通信

Vue3 webScoket方法封装 Node.js webScoket 方法封装 1.先实现服务端node.js scoket方法的封装 先安装ws(基于node.js开发的webScoket 库) npm install ws 2.新建一个webScoket.js文件 3.代码逻辑实现 const Scoket require(ws) // 当前scoket对象 let scoket {} //当前…

C++STL剖析(四)—— stack和queue的概念和使用

文章目录1. stack的介绍2. stack的构造3. stack的使用&#x1f351; push&#x1f351; top&#x1f351; pop&#x1f351; empty&#x1f351; size&#x1f351; swap&#x1f351; emplace4. queue的介绍5. queue的构造6. queue的使用&#x1f351; push&#x1f351; size…

面试官:String、StringBuffer、StringBuilder有什么区别?

回答思路&#xff1a; 阐述String概念理解 存在问题和设计考量 总结体现的两个特性 StringBuilder/StringBuffer相同点和不同点 三者使用场景总结 回答总结&#xff1a; String是Java中非常常见且基础的类&#xff0c;用于字符串的构造和管理&#xff0c;它是Immutable类的经典…

SpringCloud之断路器聚合监控

一、Hystrix Turbine简介 看单个的Hystrix Dashboard的数据并没有什么多大的价值&#xff0c;要想看这个系统的Hystrix Dashboard数据就需要用到Hystrix Turbine。Hystrix Turbine将每个服务Hystrix Dashboard数据进行了整合。Hystrix Turbine的使用非常简单&#xff0c;只需要…