<file_sep>/* eslint-disable */
export const regPhone = /^1\d{10}$/ // 手机号
export const regEmail = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
// export const regEmail = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/ //邮箱
export const regpassword = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{8,20}$/ // 密码8-20位字符，包含大小写字母、数字
export const regIDCard = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/ // 身份证号
export const regCode = /^\d{6}$/ // 验证码
export const regSignPassword = /^\d{6}$/ // 签约密码
export const regName = /^[\u4e00-\u9fa5\.]{2,15}$/ // 姓名 2-15位汉字，可以包含“·”
// export const regComponyName = /^[\u4e00-\u9fa5]{2,50}$/ //公司、机构名称 2-50位汉字
export const regComponyName = null
export const regCreditCode = /^[0-9a-zA-Z]{18}$/ // 信用代码 18位数字，可以包含字母
export const regOrganizationcCode = /^[0-9a-zA-Z]{1,18}$/ // 机构代码 18位以内数字，可以包含字母
export const regBankCardNumber = /^([0-9]\d{10,24})$/ // 银行卡号\打款账号
export const regBankName = /.{2,50}/ // 开户支行
export const regDepartmentName = /^[\u4e00-\u9fa5]{2,10}$/ // 部门名称
export const regApplicationName = /^[A-Za-z0-9\u4e00-\u9fa5]{1,20}$/ // 应用名称
export const regSealName = /^[\u4e00-\u9fa5]{1,20}$/ // 印章名称，20字以内中文
export const regPostalCode = /^[[0-9]{6}$/ // 邮政编码
export const regPostalChinese = /^[\u4e00-\u9fa5]{1,50}$/ // 中文
/* eslint-disable */
<file_sep>import axios from 'axios'
import config from '../config/index'
import { getToken, setToken } from '@/utils/common'
const { WEB_API } = config
export const TOKEN_KEY = 'CLIENT_TOKEN'
const baseUrl = WEB_API || ''
// 创建一个独立的axios实例
const service = axios.create({
  baseURL: baseUrl,
  // 定义统一的请求头部
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
  },
  // 配置请求超时时间
  timeout: 60000
  // 如果用的JSONP，可以配置此参数带上cookie凭证，如果是代理和CORS不用设置
  // withCredentials: true
})

service.interceptors.request.use(config => {
  const token = getToken()
  if (token) {
    config.headers['exchange-token'] = token
  }
  config.headers.Accept = 'application/json'
  config.headers['Content-Type'] = 'application/json; charset=utf-8'
  if (config.type === 'download') {
    config.responseType = 'arraybuffer'
  }
  return config
}, err => {
  return Promise.reject(err)
})

service.interceptors.response.use(
  (response) => {
    // 关于文件下载的处理
    if (response.config.type === 'download') {
      const contentType = response.headers['content-type']
      const disposition = response.headers['content-disposition']
      let fileName = response.config.downloadName
      if (disposition) {
        if (disposition.split('fileName=').length > 1) {
          const name = disposition.split('fileName=')[1].replace(/"/g, '')
          if (name) {
            fileName = decodeURI(name)
          }
        }
      }
      const blob = new Blob([response.data], { type: contentType })
      const link = document.createElement('a')
      link.href = window.URL.createObjectURL(blob)
      link.download = fileName
      link.click()
      window.URL.revokeObjectURL(link.href)
      return response
    } else {
      const { data } = response
      if (data.code === 0) {
        return data
      } else {
        return Promise.reject(data)
      }
    }
  }, (error) => {
    if (error.response && error.response.status === 401) {
      setToken('')
    }
    return Promise.reject(error.response)
  }
)

export default service
<file_sep>export default {
  /**
   * @description 配置显示在浏览器标签的title
   */
  title: '北京国脉信安科技业务演示管理系统',
  /**
   * @description 默认打开的首页的路由name值，默认为home
   */
  homeName: 'homeIndex',
  /**
  * @description 请求接口地址
  */
  WEB_API: process.env.VUE_APP_WEB_API
}
<file_sep>const path = require('path')
const CompressionPlugin = require('compression-webpack-plugin')
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
const resolve = dir => {
  return path.join(__dirname, dir)
}
const theme = require('./src/config/theme')
const webTheme = theme[process.env.VUE_APP_WEB_THEME]
let str = ''
for (const key in webTheme) {
  str += `$${key}: ${webTheme[key]}; `
}
module.exports = {
  publicPath: process.env.VUE_APP_BASE_URL,
  lintOnSave: false,
  configureWebpack: config => {
    const newPlugins = [
      new CompressionPlugin({
        algorithm: 'gzip',
        test: /\.(js|css)$/, // 匹配文件名
        threshold: 10240, // 对超过10k的数据压缩
        deleteOriginalAssets: false, // 不删除源文件
        minRatio: 0.8 // 压缩比
      })
    ]
    config.plugins = [...config.plugins, ...newPlugins]
  },
  chainWebpack: config => {
    if (process.env.NODE_ENV === 'production') {
      config.plugin('webpack-report').use(BundleAnalyzerPlugin, [{ analyzerMode: 'static' }])
    }
    config.resolve.alias.set('@', resolve('src'))
  },
  css: {
    loaderOptions: {
      sass: {
        prependData: str
      },
      less: {
        globalVars: webTheme
      }
    }
  },
  devServer: {
    // proxy: {
    //   '^/api': {
    //     target: 'http://127.0.0.1:7001', // 目标代理接口地址
    //     secure: false,
    //     changeOrigin: true // 开启代理，在本地创建一个虚拟服务端
    //   }
    // }
  },
  productionSourceMap: false
}
<file_sep># spa-base-web （vue 脚手架基础架构）
#### 1、基于vue官方脚手架搭建 当前版本 @vue/cli 4.5.14 （需要 Node.js v10及以上）
#### 2、相关配置选项 Vue2.x、Babel、Vuex、Router、Eslint-Standard、CSS Pre-processors
#### 3、相关配置信息
- 环境变量
- ESlint检测
- proxy跨域
- Gzip压缩
- 打包压缩
- Css 样式预设
- mock数据
- sass样式、less样式提供统一的全局样式及全局变量

#### 4、src目录结构
- api  【web前端接口】
- assets
- - iconfont 【字体库】
- - images  【资源图片】
- components
- - common  【公共组件】
- config
- - index.js  【系统配置信息】
- - theme.js  【颜色主题变量配置】
- directive   【指令配置】
- layout
- - main.vue  【页面布局】
- mock        【mock数据】
- plugin      【插件配置】
- router    
- - index.js  【路由守卫、跳转等处理】    
- - routers.js【路由配置信息】 
- store       【Vuex配置信息】 
- style       【全局样式与自定义样式】 
- utils       【工具类】 
- views       【页面】 
<file_sep>import Mock from 'mockjs'
import {
  login,
  logout,
  currentUserInfo
} from './login'

// 配置Ajax请求延时，可用来测试网络延迟大时项目中一些效果
Mock.setup({
  timeout: 300
})
const BaseURL = process.env.VUE_APP_WEB_API
Mock.mock(BaseURL + '/api/user/login', 'post', login)
Mock.mock(BaseURL + '/api/user/logout', 'post', logout)
Mock.mock(BaseURL + '/api/user/current', 'get', currentUserInfo)
export default Mock
