zoukankan      html  css  js  c++  java
  • vue-cli脚手架搭建项目及Axios封装

    四、安装vue-cli脚手架构建工具

    全局安装,命令行输入

    npm install -g vue-cli

    命令行输入vue -V查看版本号,出现版本号即为安装成功

    五、vue-cli搭建项目

    进入你的项目目录,创建一个基于 webpack 模板的新项目: vue init webpack 项目名

    vue init webpack demo

    其中demo是项目名称,可以根据自己的项目定义名称,按Enter键后,待下载完模板会进入一系列配置问题

    说明:

    Project name:项目名称

    • Project description:项目描述
      Author:作者
      Vue build:打包方式(standalone和runtime),按回车选择默认的就好
      Install vue-router?:是否安装路由?肯定是需要用到的,按 y 回车
      Use ESLint to lint your code?:是否启用eslint代码检测规则?目前不需要,按 n 回车
      Setup unit tests with Karma + Mocha?:是否进行单元测试?目前不需要,按 n 回车
      Setup e2e tests with Nightwatch?:是否进行端对端测试?目前不需要,按 n 回车

    配置完成后我们会在自己的项目目录看到我们的项目文件demo,我们可以将终端定位到当前项目,并在命令行输入下面的命令行,项目启动成功。在浏览器地址栏中输入localhost:8080则可以访问项目

    npm run dev

    六、vue项目目录介绍

    1、build:构建脚本目录

        1)build.js ==> 生产环境构建脚本;

        2)check-versions.js ==> 检查npm,node.js版本;

        3)utils.js ==> 构建相关工具方法;

        4)vue-loader.conf.js ==> 配置了css加载器以及编译css之后自动添加前缀;

        5)webpack.base.conf.js ==> webpack基本配置;

        6)webpack.dev.conf.js ==> webpack开发环境配置;

        7)webpack.prod.conf.js ==> webpack生产环境配置;

    2、config:项目配置

        1)dev.env.js ==> 开发环境变量;

        2)index.js ==> 项目配置文件;

        3)prod.env.js ==> 生产环境变量;

    3、node_modules:npm 加载的项目依赖模块

    4、src:这里是我们要开发的目录,基本上要做的事情都在这个目录里。里面包含了几个目录及文件:

        1)assets:资源目录,放置一些图片或者公共js、公共css。这里的资源会被webpack构建;

        2)components:组件目录,我们写的组件就放在这个目录里面;

        3)router:前端路由,我们需要配置的路由路径写在index.js里面;

        4)App.vue:根组件;

        5)main.js:入口js文件;

    5、static:静态资源目录,如图片、字体等。不会被webpack构建

    6、babelrc:babel编译参数

    7、editorconfig:代码格式

    8、gitignore:git上传需要忽略的文件配置

    9、postcssrc.js:转换css的工具

    10、index.html:首页入口文件,可以添加一些 meta 信息等、

    11、package.json:npm包配置文件,定义了项目的npm脚本,依赖包等信息

    12、README.md:项目的说明文档,markdown 格式

    七、修改port端口号

    为了避免端口冲突,也可以修改port,打开config/index.js文件,修改port参数

    八、安装element-ui框架

    【1】安装

    npm install element-ui -S

    【2】在main.js文件中引入

    import ElementUI from 'element-ui'
    
    import 'element-ui/lib/theme-chalk/index.css'
    
    Vue.use(ElementUI)

    九、安装sass

    【1】安装

    npm install --save-dev css-loader
    npm install --save-dev sass-loader
    npm install --save-dev style-loader
    
    //sass-loader依赖于node-sass
    npm install --save-dev node-sass

    【2】配置

    在webpack.base.conf.js文件夹下配置

    rules:[
        ....
        {
            test: /.sass$/,
            loaders: ['style', 'css', 'sass']
        }
    ]

    【3】测试

    在要用到scss的组件里面的style标签上加上 lang='scss'

    在app.vue文件定义一个背景颜色变量,应用到css样式中,背景变成灰色,说明已成功配置好sass

    十、配置本地代理

    1、在项目找到config/index.js文件对proxyTable进行配置,配置完成后需要npm run dev重启一下项目

     proxyTable: {
          '/api': {           // 配置后台代理
            target: 'http://192.168.37.56:8090',
            secure: false,
            pathRewrite: {
              '^/api': ''
            },
            changeOrigin: true
          },
          "/socket": {       // 配置webSocket
            target: 'http://192.168.37.56:8090',
            secure: false,
            pathRewrite: {
              '^/socket': ''
            },
            changeOrigin: true,
            ws: true
          },
        }

    说明:

    • target:本地测试环境请求后台接口的域名ip
    • secure:https需要配置的参数
    • pathRewrite:代替targe里面的地址,比如我们需要调用"http:192.168.37.56:8090/user/add"接口,我们可以直接写成"/api/user/add"
    • changeOrigin:接口跨域需要配置的参数

    2、config/index.js配置参数的详细解析

    'use strict'
    const path = require('path')
    
    module.exports = {
      // 开发环境
      dev: {
        assetsSubDirectory: 'static', // 编译输出的二级目录
        assetsPublicPath: '/',  // 编译发布的根目录,可配置为资源服务器域名或CDN域名
        proxyTable: {}, // 配置后台代理
        host: 'localhost', // 运行测试页面的域名ip
        port: 8080,  // 运行测试页面的端口
        autoOpenBrowser: false, // 项目运行时是否自动打开浏览器
        errorOverlay: true, // 浏览器错误提示
        notifyOnErrors: true, // 跨平台错误提示
        poll: false, // 使用文件系统获取文件改动的通知devServer.watchOptions
        devtool: 'cheap-module-eval-source-map', // 增加调试,该属性为原始源代码
        cacheBusting: true, // 使缓存失效
        cssSourceMap: true // 代码压缩后bug定位将非常困难,引入SourceMap记录压缩前后的位置信息记录,当产生错误时直接定位到压缩前的位置
      },
      // 生产环境
      build: {
        index: path.resolve(__dirname, '../dist/index.html'), // 编译输入的index.html文件
        assetsRoot: path.resolve(__dirname, '../dist'), // 编译输出的静态资源路径(项目打包时的文件)
        assetsSubDirectory: 'static', // 编译输出的二级目录
        assetsPublicPath: '/', // 编译发布的根目录,可配置为资源服务器域名或CDN域名
        productionSourceMap: true, // 是否开启cssSourceMap
        devtool: '#source-map', // 增加调试,该属性为原始源代码
        productionGzip: false, // 是否开启gzip
        productionGzipExtensions: ['js', 'css'], // 需要使用gzip压缩文件的扩展名
        bundleAnalyzerReport: process.env.npm_config_report // 打包分析
      }
    }

    十一、axios的封装

    【1】安装

    npm install axios --save-dev复制代码

    【2】在项目的src目录下新建一个services文件夹,然后在里面新建一个ajax.js和一个getData.js文件。ajax.js文件用来封装我们的axios,getData.js用来统一管理我们的接口。

    【3】ajax.js 封装axios

    import axios from "axios";
    import store from "@/store";
    import { Message } from "element-ui";
    let router = import("@/router");
    
    axios.defaults.baseURL = "/api";
    axios.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8";
    axios.defaults.headers["X-Requested-With"] = "XMLHttpRequest";
    axios.defaults.headers["Cache-Control"] = "no-cache";
    axios.defaults.headers["pragma"] = "no-cache";
    
    let source = axios.CancelToken.source();
    
    //请求添加token
    axios.interceptors.request.use(request => {
        request.headers["demo-auth"] = store.state.loginInfo ? store.state.loginInfo.userId : ""; // 已将userId保存在store中
        return request;
    })
    
    //切换页面取消请求
    axios.interceptors.request.use(request => {
        request.cancelToken = source.token;
        return request;
    });
    router.then(lib => {
        lib.default.beforeEach((to, from, next) => {
            source.cancel()
            source = axios.CancelToken.source();
            next()
        })
    })
    
    //登录过期跳转
    axios.interceptors.response.use(response => {
        let data = response.data;
        if (
            [10002].includes(data.ret)
        ) {
            router.then(lib => lib.default.push({ name: "login" })); // 跳转到登录页面
            Message.warning(data.msg);
        }
        return response;
    })
    
    //返回值解构
    axios.interceptors.response.use(response => {
        let data = response.data;
        let isJson = (response.headers["content-type"] || "").includes("json");
        if (isJson) {
            if (data.code === 200) {
                return Promise.resolve({
                    data: data.data,
                    msg: data.msg,
                    code: data.code,
                });
            }
            return Promise.reject(
                data.msg ||
                "网络错误"
            );
        } else {
            return data;
        }
    }, err => {
        let isCancel = axios.isCancel(err);
        if (isCancel) {
            return new Promise(() => { });
        }
        return Promise.reject(
            err.response.data &&
            err.response.data.msg ||
            "网络错误"
        );
    })
    
    export function post(url, data, otherConfig) {
        return axios.post(url, data, otherConfig);
    }
    
    export function get(url, data, otherConfig) {
        return axios.get(url, { params: data, ...otherConfig });
    }

    【4】getData.js 接口管理

    import { get, post } from "@/services/ajax";
    
    //获取程序配置
    export function getConfig() {
        return get("static/config.json", null, { baseURL: "./" });
    }
    
    // 查找货物已占用位置
    export function queryGoodsLabel(params) {
        return get("/goods/queryGoodsLabel", params);
    }
    
    // 更换货物已占用位置
    export function switchLabel(params) {
        return post("/goods/switchLabel", params);
    }
    }

    【5】在页面中调用

    import { queryGoodsLabel, switchLabel } from '@/services/getData.js'
    export default {
            data() {
                return {}
            },
            methods: {
                changePlace(row) {
                    this.params = {
                        id: row.id,
                        customsListNumber: row.customsListNumber,
                    }
    
                    // 查找货物已占用位置
                    queryGoodsLabel(this.params).then(res => {
                        this.$refs.positionDialog.refill(res.data.split(","), true);
                    }).catch(err => {
    
                    })
                },
                change(data) {
                    this.params.labels = data.join(',')
    
                    // 更换货物已占用位置
                    switchLabel(this.params).then(res => {
                        this.$Message.success('更换位置成功')
                    }).catch(err => {
                        this.$Message.error(err)
                    })
                }
            },
        }
     
    sunshine15666
  • 相关阅读:
    Fiddler抓包9-保存会话(save)
    Selenium2+python自动化61-Chrome您使用的是不受支持的命令行标记:--ignore-certificate-errors
    Fiddler抓包8-打断点(bpu)
    Fiddler抓包7-post请求(json)
    Java图片验证码
    servlet过滤器
    servlet监听器实现在线人数统计
    基于MVC模式的数据库综合练习
    JSTL详解
    初识EL表达式
  • 原文地址:https://www.cnblogs.com/xiaolucky/p/11579929.html
Copyright © 2011-2022 走看看