前言
该文主要记录在项目实战需要用到的一部分知识。以及项目中遇到的问题。
定义别名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| // 定义路径 const path = require('path') // resolve函数 function resolve(dir) { return path.join(__dirname, dir) } module.exports = { configureWebpack: { resolve: { alias: { '@': resolve('src') } } }, }
|
api.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| // 新建 src/api目录 // 先引用 import request from '@/utils/request' // 查询 export function fetchList(data) { return request({ url: '/articles', method: 'get', params: data }); } // 查询单条 export function fetchArticle(id) { return request({ url: `/articles/${id}`, method: 'get', }) } // 创建 export function createArticle(data) { return request({ url: '/articles', method: 'post', data }) } // 修改 export function updateArticle(id, data) { return request({ url: `/articles/${id}`, method: 'put', data }) } // 使用api // 先引用 import {fetchList} from '@/api/api' // 查询 fetchList({currentPage:this.page.currentPage,pageSize:this.page.pageSize, content:this.form.content,title:this.form.title}).then(res=>{}) // 或者在封装里面写好要查询的,不过在调用时就要传递的就固定了(实参里的对象值就要固定了) // 推荐上面的,因为只params需要的对象data里面只有一个时,可以直接写this.对象名 export default {fetchList} // 这个可加可不加(目前不清楚) // 注意这个封装做完后,需要从新启动项目(否者没有用)
|
Echarts
1 2 3 4 5 6 7 8 9 10
| // 安装 yarn add echarts // 使用 import * as echarts from 'echarts'; // 使用api的名字 import {productsChart as xinmingzi} from "@/api/charts"; // 必须使用id,和要渲染的元素给定宽高次才可以出现图表 <div id="chart" style="width=100%;height=500px"></div> // js下面Echarts // (赋值需要放到mounted里面,需要找到当前的Dom)
|
axios
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| import axios from 'axios' import {MessageBox, Message} from 'element-ui' // import store from '@/store' // import { getToken } from '@/utils/auth'
// 创建axios实例 const service = axios.create({ // 接口不用写'/api'了 baseURL: '/api', // url = base url + request url // withCredentials: true, // 当跨域请求时,发送 cookies timeout: 5000 // 请求超时时间 })
// request 请求 service.interceptors.request.use( config => { // do something 在发送请求前 const token = localStorage.token
if (token) { // 让每个请求携带token config.headers['token'] = token } return config }, error => { // do something 当请求错误 console.log(error) // for debug return Promise.reject(error) } )
// respone 响应 service.interceptors.response.use( /** * 如果你想获取 http 信息,例如 headers 或 status * 请 return response => response */
/** * 下面的注释为通过response自定义code来标示请求状态,当code返回如下情况为权限有问题,登出并返回到登录页 * 如通过xmlhttprequest 状态码标识 逻辑可写在下面error中 */ response => { const res = response.data
// 如果返回的自定义code不是20000, 认定为error。 if (res.code !== 20000) { Message({ message: res.message || 'Error', type: 'error', duration: 5 * 1000 })
// 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了; if (res.code === 50008 || res.code === 50012 || res.code === 50014) { // 重新登录 MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { // 为了重新实例化vue-router对象 避免bug localStorage.removeItem('token') location.reload() }) } return Promise.reject(new Error(res.message || 'Error')) } else { return res } }, error => { console.log('err' + error) // for debug Message({ message: error.message, type: 'error', duration: 5 * 1000 }) return Promise.reject(error) } )
export default service
|
七牛上传
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| // 地址(文档表单上传) // 需要参数 http://up-z2.qiniup.com // 请求地址 key = xxx // 上传的名字 token = uploadToken // 需要带上token // 测试接口使用post,以及选择from Data,file选择上传图片文件
//安装uuid yarn add uuid // 引用 import {v4 as uuidv4} from 'uuid'; // 图片上传 // element ui中:data='xxx',上传表单
<el-upload class="upload-demo" :limit="1" action="http://up-z2.qiniup.com" :before-upload="beforeUpload" // 上传图片之前,判断文件类型,和七牛云参数赋值 :on-success="handleSuccess" // 图片上传成功,赋值给表单 :on-error="handleAvatarError" // 图片post上传失败,提示; :on-exceed="handleExceed" // 图片上传过载提示;(只上传1个等) :before-remove="beforeRemove" // 上传文件后点击删除上传文件,提示是否删除,(注意异步) :on-remove="handleRemove" // 删除成功后,表单赋值为空,提示成功; :on-preview="handlePreview" // 图片放大(注意使用element ui的放大标签) :data="qiniuFrom" :file-list="fileList" list-type="picture"> <el-button size="small" type="primary">点击上传</el-button> </el-upload>
|
表单重置无效
1 2 3 4 5 6 7 8 9 10
| // 将赋值放在mounted后,原因是使用模态框,赋值在Dom生成之前 // 表单重置是在mounted上设置为初始值,在这之前赋值会导致重置无效 // 必须先打开模态框,再赋值没有影响 this.formVisible = true // 值会立刻改变,但是 DOM 是异步更新的 // 保险放在上方,异步请求本就是慢一点,并且可以使用nextTick方法保险; // 使用nextTick方法是在里面等DOM加载完之后,再执行; this.$nextTick(() => {}) // 里面赋值在外面找不到的bug,在函数里面赋值 this.$nextTick(() => {}) // 外面打印不出结果
|