PengJack
7/17/2019 - 9:51 AM

工作常用代码

工作常用代码

// 1: 动态获取 baseUrl

let baseURL;
if (window.location.host.startsWith('localhost')) {
  baseURL = 'https://dev.utcook.com';
} else {
  baseURL = window.location.origin;
}

// 2: axios 实例、请求拦截、响应拦截

import axios from 'axios';
import configs from '../configs';


/****** 创建axios实例 ******/
const service = axios.create({
    baseURL: process.env.BASE_URL,  // api的base_url
    timeout: 5000  // 请求超时时间
});

/****** request拦截器==>对请求参数做处理 ******/
service.interceptors.request.use(config => {
    app.$vux.loading.show({
        text: '数据加载中……'
    });
 
    config.method === 'post'
        ? config.data = qs.stringify({...config.data})
        : config.params = {...config.params};
    config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
 
    return config;
}, error => {  //请求错误处理
    app.$vux.toast.show({
        type: 'warn',
        text: error
    });
    Promise.reject(error)
});


/****** respone拦截器==>对响应做处理 ******/
service.interceptors.response.use(
    response => {  //成功请求到数据
        app.$vux.loading.hide();
        //这里根据后端提供的数据进行对应的处理
        if (response.data.result === 'TRUE') {
            return response.data;
        } else {
            app.$vux.toast.show({  //常规错误处理
                type: 'warn',
                text: response.data.data.msg
            });
        }
    },
    error => {  //响应错误处理
        console.log('error');
        console.log(error);
        console.log(JSON.stringify(error));
 
        let text = JSON.parse(JSON.stringify(error)).response.status === 404
            ? '404'
            : '网络异常,请重试';
        app.$vux.toast.show({
            type: 'warn',
            text: text
        });
 
        return Promise.reject(error)
    }
);


// 把 axios 实例 export 出去
export default service;


//api.js 接口调用方式
import service from './request'
 
export const getPersonInfo = data => {
    return service({
        url: '/person_pay/getpersoninfo',
        method: 'post',
        data
    })
};


//index.vue 在组件中使用
import {getPersonInfo} from '../axios/api.js'
export default {
    created: async function () {
        const params = {
            card_no: '111'
        };
        let res = await getPersonInfo(params);
        console.log(res);
    }
}

// 3 登出
const logout = () => {
  console.log('登出');
  window.location.href = baseURL + '/logout';
};















// antd 中 Select 下拉菜单,动态加载后台数据,当滚动到底的时候就去请求下一页数据,如果没有新数据了就不再请求

handleSelectScroll = e => {
    e.persist();
    let target = e.target;
    if (target.scrollTop + target.offsetHeight === target.scrollHeight) {
      // 如果数据已经全部加载完成了,就不再请求
      if (this.state.productInfo.length !== this.totalProduct) {
        this.params.page += 1;
        iotService.listProductInfo(this.params).then(res => {
          if (res.status === 200 && res.data) {
            let newProductInfo = this.state.productInfo.concat(
              res.data.data.productInfo,
            );
            this.setState({ productInfo: newProductInfo });
          }
        });
      }
    }
  };
  
  <FormItem label="产品" {...formItemLayout}>
                {getFieldDecorator('product', {
                  rules: [
                    {
                      required: true,
                      message: '请选择一款产品',
                    },
                  ],
                })(
                  <Select
                    placeholder="请选择产品"
                    onPopupScroll={this.handleSelectScroll}
                  >
                    {productInfo.length > 0 &&
                      productInfo.map(product => (
                        <Option
                          key={product.productKey}
                          value={product.productKey}
                        >
                          {product.productName}
                        </Option>
                      ))}
                  </Select>,
                )}
              </FormItem>
  
  
  
  
  /**
 * 验证长度和特殊字符
 * 空字符串默认允许通过校验
 * rules: [
 *  {
 *    min: 4,// 最小长度
 *    max: 64, // 最大长度
 *    allowedChars: '*-.', // 允许的特殊字符
 *    lenMsg: '产品名称限制 2-15个字',
 *    charMsg: '产品名称由中文、英文字母、数字和下划线组成',
 *    allowChinese: false, // 如果允许中文,可以不配,不允许中文,指定为 false
 *  }
 * ]
 *
 * @param rule
 * @param value
 * @param callback
 * @returns {*}
 */
export const isStringValid = (rule, value = '', callback) => {
  if (value === '') {
    callback();
  } else {
    let newValue = value;
    if (rule.allowChinese !== false) {
      const chineseReg = /[^\x00-\xff]/g;
      newValue = value.replace(chineseReg, 'aa');
    }
    const min = rule.min;
    const max = rule.max;
    const len = newValue.length;

    const reg = new RegExp(`[A-Za-z0-9${rule.allowedChars}]`, 'g');
    const replacedValue = newValue.replace(reg, '');
    if (replacedValue.length > 0) {
      callback(rule.charMsg);
    } else if (len < min || len > max) {
      callback(rule.lenMsg);
    } else {
      callback();
    }
  }
};

<FormItem label="DeviceName" {...formItemLayout}>
                {getFieldDecorator('deviceName', {
                  rules: [
                    {
                      validator: isStringValid,
                      min: 4,
                      max: 32,
                      allowedChars: '-.@:',
                      allowChinese: false,
                      charMsg:
                        'DeviceName 只能包含英文字母、数字、连字符、下划线、@符号、点号、英文冒号',
                      lenMsg: 'DeviceName长度为4-32个字符',
                    },
                  ],
                })(<Input placeholder="请输入DeviceName" allowClear />)}
              </FormItem>