Browse Source

Merge branch '2xinfeng-dev' of www.gitinn.com:proginn/proginn-frontend into dev

# Conflicts:
#	assets/css/job/_post_id.scss
#	layouts/default.vue
xinfeng 6 years ago
parent
commit
fc1618f7a9

+ 300 - 0
assets/css/job/index.scss

@@ -0,0 +1,300 @@
+@import "../scssCommon";
+
+.jobList {
+
+  .topArea {
+    position: relative;
+    width: 100%;
+    background-color: #fff;
+    margin-top: 10px;
+  }
+
+  .contentArea {
+    background-color: #f7f7f7;
+    width: 1000px;
+    margin: 0 auto;
+    box-sizing: border-box;
+
+    .selectArea {
+      display: flex;
+      padding: 45px 45px 45px 10px;
+      flex-direction: column;
+      background: #fff;
+
+      .selectContent {
+        margin-top: 30px;
+        &:first-child {
+          margin-top: 0;
+        }
+
+        .content {
+          width: 100%;
+          display: flex;
+          justify-content: flex-start;
+          align-items: center;
+          position: relative;
+
+
+          .left {
+            flex-shrink: 0;
+            width: 90px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            height: 38px;
+            align-self: flex-start;
+            p {
+              text-align: left;
+              height: 21px;
+              font-size: 15px;
+              color: rgba(46, 55, 67, 1);
+              line-height: 21px;
+              font-weight: 500;
+            }
+          }
+
+          .right {
+            flex-grow: 1;
+            display: flex;
+            justify-content: flex-start;
+            flex-wrap: wrap;
+            .cell {
+              width: 88px;
+              height: 38px;
+              border-radius: 2px;
+              border: 1px solid rgba(239, 239, 239, 1);
+              display: flex;
+              justify-content: center;
+              align-items: center;
+              margin-left: 10px;
+              cursor: pointer;
+
+              &:nth-child(8n+1), &:first-child {
+                margin-left: 0;
+              }
+              &:nth-child(n+9) {
+                margin-top: 10px;
+              }
+
+              p {
+                height: 20px;
+                font-size: 14px;
+                font-weight: 400;
+                color: rgba(85, 85, 85, 1);
+                line-height: 20px;
+              }
+              &.selected {
+                border: 1px solid rgba(48, 142, 255, 1);
+                p {
+                  color: rgba(48, 142, 255, 1);
+                  font-weight: 500;
+                  height: 21px;
+                  font-size: 15px;
+                  line-height: 21px;
+                }
+              }
+            }
+          }
+
+          .more {
+            position: absolute;
+            right: 0;
+            top: 0;
+            line-height: 38px;
+            color: #999;
+            cursor: pointer;
+          }
+        }
+
+        .smallContent {
+          background-color: #f7f7f7;
+          min-height: 50px;
+          width: 750px;
+          margin-top: 10px;
+          margin-left: 90px;
+          border-radius: 8px;
+          flex-grow: 1;
+          display: flex;
+          justify-content: flex-start;
+          flex-wrap: wrap;
+          padding: 20px;
+
+          .cell {
+            width: 88px;
+            height: 38px;
+            border-radius: 2px;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            margin-left: 10px;
+            cursor: pointer;
+
+            &:nth-child(8n+1), &:first-child {
+              margin-left: 0;
+            }
+            &:nth-child(n+9) {
+              margin-top: 10px;
+            }
+            p {
+              height: 20px;
+              font-size: 14px;
+              font-weight: 400;
+              color: rgba(85, 85, 85, 1);
+              line-height: 20px;
+            }
+            &.selected {
+              background-color: #dcefff;
+              p {
+                color: #2994f2;
+                font-weight: 500;
+                height: 21px;
+                font-size: 15px;
+                line-height: 21px;
+              }
+            }
+          }
+        }
+
+
+      }
+
+    }
+
+    .listArea {
+      //margin-top: 80px;
+
+      .sTitle {
+        height: 25px;
+        font-size: 18px;
+        font-weight: 500;
+        color: rgba(34, 34, 34, 1);
+        line-height: 25px;
+        margin-bottom: 14px;
+      }
+      .list {
+        .cell {
+          background: #FFF;
+          display: flex;
+          justify-content: center;
+          height: 180px;
+          width: 100%;
+          margin-top: 10px;
+          cursor: pointer;
+          flex-direction: column;
+          padding: 30px 20px;
+
+          .topArea {
+            width: 100%;
+            height: 24px;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+
+            .left {
+              height:24px;
+              font-size:17px;
+              font-weight:500;
+              color:rgba(34,34,34,1);
+              line-height:24px;
+            }
+            .right {
+              height:22px;
+              font-size:19px;
+              font-weight:bold;
+              color:rgba(255,51,30,1);
+              line-height:22px;
+            }
+          }
+          .workDesc {
+            margin-top: 5px;
+            flex-shrink: 0;
+            width: 90%;
+            height:25px;
+            line-height: 25px;
+            font-size:13px;
+            font-weight:500;
+            color:rgba(102,102,102,1);
+            text-align: left;
+            word-break: keep-all;
+            white-space: nowrap;
+            overflow: hidden;
+            text-overflow: ellipsis;
+          }
+          .labelList {
+            margin-top: 5px;
+            width: 100%;
+            display: flex;
+            .label {
+              margin-left: 10px;
+              background:rgba(238,238,238,1);
+              border-radius:1px;
+              box-sizing: content-box;
+              padding: 3px 10px;
+              &:nth-child(1) {
+                margin-left: 0;
+              }
+              p {
+                height:17px;
+                font-size:12px;
+                font-weight:400;
+                color:rgba(102,102,102,1);
+                line-height:17px;
+              }
+            }
+          }
+          .companyInfo {
+            margin-top: 20px;
+            display: flex;
+            width: 100%;
+            justify-content: flex-start;
+            align-items: center;
+            cursor: pointer;
+            .logo {
+              width:20px;
+              height:20px;
+              font-size: 0;
+              img {
+                width:20px;
+                height:20px;
+                border-radius: 2px;
+              }
+            }
+            .companyName {
+              margin-left: 7px;
+              height:18px;
+              font-size:13px;
+              font-weight:400;
+              color:rgba(51,51,51,1);
+              line-height:18px;
+              text-align: left;
+            }
+
+          }
+
+        }
+        .noneData {
+          min-height: 100px;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          p {
+            text-align: center;
+          }
+        }
+      }
+    }
+  }
+
+  .pagination {
+    margin-top: 70px;
+    text-align: center;
+  }
+
+}
+
+.main {
+  margin-top: 0 !important;
+  &.isMobile {
+    width: 100vw;
+  }
+}

BIN
assets/img/job/logo_icon_reverse2.jpg


+ 140 - 0
components/job/dealSeoFooter.js

@@ -0,0 +1,140 @@
+export default class DealSeoData {
+  constructor({ $axios, req, app, redirect }) {
+    this.$axios = $axios
+    this.req = req
+    this.app = app
+    this.redirect = redirect
+    this.selected = {
+      city: 0,
+      industry: 0,
+      techType: 0,
+    }
+    this.page = {
+      page: 1,
+      size: 10,
+      total: 0
+    }
+    this.finished = false
+    this.dataList = []
+    this.provinces = []
+  }
+  
+  async dealData() {
+    let { name, path, params, fullPath } = this.app.context.route
+    let res = await this.$axios.get('/api/kaifawu/get_options')
+    const { cities, industries, tech_types } = res.data.data || {}
+    let typeList = { city: cities, industry: industries, techType: tech_types }
+    this.typeList = typeList
+    //查找中文
+    let match = params.pathMatch || ''
+    let list = match.split('/').map(item => item.toLocaleLowerCase())
+    list.length = Math.min(list.length, 3) //防止url超出
+    let keys = Object.keys(typeList)
+    //3 * 3 * n的循环 n < 100
+    list.forEach(item => {
+      keys.forEach(keys => {
+        typeList[ keys ].forEach(typeItem => {
+          if (typeItem.slug === item) {
+            this.selected[ keys ] = typeItem.id
+            this.selected[ keys + 'Name' ] = typeItem.name
+          }
+        })
+      })
+    })
+    return {
+      footer: await this.getFooterData(),
+    }
+  }
+  
+  async getFooterData() {
+    //设置底部link列表
+    const typeList = this.typeList
+    const { city, industry, techType, cityName = "", industryName = "", techTypeName = "", proviceName } = this.selected
+    const { headers: { host } } = this.req
+    let footer = {
+      baseLink: "", link: [
+        { name: "", data: [] }, { name: "", data: [] },
+      ],
+    }
+    //设置baseLink
+    if (host.indexOf('local') !== -1) {
+      footer.baseLink = 'http://' + host
+    } else {
+      footer.baseLink = 'https://' + host
+    }
+    if (city && !industry && !techType) {
+      //只有城市的
+      footer.link[ 0 ].name = "热门城市技术解决方案"
+      footer.link[ 1 ].name = `${cityName}技术解决方案`
+      footer.link[ 0 ].data = typeList.city.map((item) => {
+        return { name: `${item.name}技术解决方案`, url: `/kaifain/${item.slug}/` }
+      })
+      footer.link[ 1 ].data = typeList.industry.map((item) => {
+        return { name: `${cityName}${item.name}技术解决方案`, url: `/kaifain/${city}/${item.slug}/` }
+      })
+    } else if (!city && industry && !techType) {
+      //只有行业的
+      footer.link[ 0 ].name = "其它行业领域技术解决方案"
+      
+      footer.link[ 1 ].name = `热门城市${industryName}技术解决方案`
+      footer.link[ 0 ].data = typeList.industry.map((item) => {
+        return { name: `${item.name}技术解决方案`, url: `/kaifain/${item.slug}/` }
+      })
+      footer.link[ 1 ].data = typeList.city.map((item) => {
+        return { name: `${item.name}${industryName}技术解决方案`, url: `/kaifain/${item.slug}/${industry}/` }
+      })
+    } else if (!city && !industry && techType) {
+      //只有技术分类
+      footer.link[ 0 ].name = `其他行业领域${techTypeName}技术解决方案`
+      footer.link[ 1 ].name = `热门城市${techTypeName}技术解决方案`
+      footer.link[ 0 ].data = typeList.industry.map((item) => {
+        return { name: `${item.name}${techTypeName}技术解决方案`, url: `/kaifain/${item.slug}/${techType}/` }
+      })
+      footer.link[ 1 ].data = typeList.city.map((item) => {
+        return { name: `${item.name}${techTypeName}技术解决方案`, url: `/kaifain/${techType}/${item.slug}/` }
+      })
+    } else if (city && industry && !techType) {
+      //${cityName}${industryName}
+      footer.link[ 0 ].name = `热门城市技术解决方案`
+      footer.link[ 1 ].name = `其他行业领域技术解决方案`
+      footer.link[ 0 ].data = typeList.city.map((item) => {
+        return { name: `${item.name}技术解决方案`, url: `/kaifain/${item.slug}/` }
+      })
+      footer.link[ 1 ].data = typeList.industry.map((item) => {
+        return { name: `${item.name}技术解决方案`, url: `/kaifain/${item.slug}/` }
+      })
+    } else if (city && !industry && techType) {
+      //${cityName}${techTypeName}
+      footer.link[ 0 ].name = `热门城市技术解决方案`
+      footer.link[ 1 ].name = `其他行业领域技术解决方案`
+      footer.link[ 0 ].data = typeList.city.map((item) => {
+        return { name: `${item.name}技术解决方案`, url: `/kaifain/${item.slug}/` }
+      })
+      footer.link[ 1 ].data = typeList.industry.map((item) => {
+        return { name: `${item.name}技术解决方案`, url: `/kaifain/${item.slug}/` }
+      })
+    } else if (!city && industry && techType) {
+      //${industryName}${techTypeName}
+      footer.link[ 0 ].name = `其他行业领域技术解决方案`
+      footer.link[ 1 ].name = `其他行业技术分类${industryName}技术解决方案`
+      footer.link[ 0 ].data = typeList.industry.map((item) => {
+        return { name: `${item.name}技术解决方案`, url: `/kaifain/${item.slug}/` }
+      })
+      footer.link[ 1 ].data = typeList.techType.map((item) => {
+        return { name: `${industryName}${item.name}技术解决方案`, url: `/kaifain/${industry}/${item.slug}/` }
+      })
+    } else {
+      //非特定的url
+      footer.link[ 0 ].name = "热门城市技术解决方案"
+      footer.link[ 1 ].name = "行业领域技术解决方案"
+      footer.link[ 0 ].data = typeList.city.map((item) => {
+        return { name: `${item.name}技术解决方案`, url: `/kaifain/${item.slug}/` }
+      })
+      footer.link[ 1 ].data = typeList.industry.map((item) => {
+        return { name: `${item.name}技术解决方案`, url: `/kaifain/${item.slug}/` }
+      })
+    }
+    return footer
+  }
+}
+

+ 228 - 0
components/job/dealSeoIndex.js

@@ -0,0 +1,228 @@
+export default class DealSeoData {
+  constructor({ $axios, req, app, redirect, error }) {
+    this.$axios = $axios
+    this.req = req
+    this.app = app
+    this.redirect = redirect
+    this.error = error
+    this.selected = {
+      city: 0,
+      direction: 0, //职业角色 大
+      directionSmall: 0,
+      workType: 0,
+    }
+    this.page = {
+      page: 1,
+      size: 10,
+      total: 0
+    }
+    this.finished = false
+    this.dataList = []
+    this.provinces = []
+  }
+  
+  async dealData() {
+    let { name, query: { page = 1 }, path, params, fullPath } = this.app.context.route
+    if (path && path[ path.length - 1 ] !== '/') {
+      let reditUrl = fullPath
+      reditUrl = reditUrl.replace(path, path + '/')
+      this.redirect(301, reditUrl)
+    }
+    let isSeoList = false
+    let typeList = await this.getTypeList()
+    switch (name) {
+      case "kaifainSeoAll":
+        //kaifain/s页面进入
+        isSeoList = true
+        break
+      case "kaifainSeoIndex":
+        //kaifain路由匹配进入
+        try {
+          let match = params.pathMatch || ''
+          let list = match.split('/').map(item => item.toLocaleLowerCase())
+          list.length = Math.min(list.length, 3) //防止url超出
+          list.filter(item => !!item)
+          let urlCheck = ""
+          let keys = Object.keys(typeList)
+          //3 * 3 * n的循环 n < 100
+          list.forEach(item => {
+            keys.forEach(keys => {
+              typeList[ keys ].list.forEach(typeItem => {
+                if (typeItem.slug === item) {
+                  urlCheck += item
+                  this.selected[ keys ] = typeItem.id
+                  this.selected[ keys + 'Name' ] = typeItem.name
+                  this.selected[ keys + 'Slug' ] = typeItem.slug
+                  if (keys === 'city') {
+                    this.selected[ "provice" ] = typeItem.prov_id
+                  }
+                }
+              })
+            })
+          })
+          if (urlCheck !== list.join("")) {
+            this.error({ statusCode: 404, message: "您要访问的页面不存在" })
+            return
+          }
+          
+          if (this.selected[ "provice" ]) {
+            let item = this.provinces.filter(item => item.id === this.selected[ "provice" ])[ 0 ]
+            this.selected[ "proviceName" ] = item && item.name
+          }
+        } catch ( e ) {
+          console.log("解决方案列表", e)
+        }
+        break
+      default:
+        //其他
+        page = 1
+    }
+    await this.getList()
+    return {
+      typeList,
+      isSeoList, //是否是 /kaifain/s/页面进入
+      dataList: this.dataList, //首次获取的数据
+      mobile: this.app.$deviceType.isMobile(),
+      selected: this.selected,
+      page: this.page,
+      finished: this.finished,
+      head: this.dealThisMeta(isSeoList),
+    }
+  }
+  
+  async getTypeList() {
+    let res = await this.$axios.get('/api/recruit/get_options')
+    let typeList = {
+      direction: {
+        title: '职业角色',
+        list: [],
+        smallList: []
+      },
+      city: {
+        title: '国内地区',
+        list: []
+      },
+      workType: {
+        title: '工作方式',
+        list: [{ id: 0, name: "全部" }, { id: 1, name: "远程" }, { id: 2, name: "驻场" }]
+      }
+    }
+
+    if (Number(res.data.status) === 1) {
+      console.log("*** res.data.data.direction", JSON.stringify(res.data.data.direction))
+  
+      res.data.data.direction.unshift({ id: 0, name: "全部" })
+      res.data.data.cities.unshift({ id: 0, name: "全部" })
+      Object.keys(res.data.data).forEach(key => {
+        let item = res.data.data[ key ]
+        if (Array.isArray(item)) {
+          item.forEach(ii => {
+            ii.name = ii.name || ii.occupation_name || ""
+            ii.id = Number(ii.id || ii.occupation_id || 0)
+            if (Array.isArray(ii.children)) {
+              ii.children.forEach(jj=>{
+                jj.name = jj.name || jj.direction_name || ""
+                jj.id = Number(jj.id || jj.direction_id || 0)
+              })
+            }
+          })
+        }
+      })
+      typeList.direction.list = [ ...res.data.data.direction ]
+      typeList.city.list = [ ...res.data.data.cities ]
+    }
+    return typeList
+  }
+  
+  async getList() {
+    const { page, selected } = this
+    let p = {
+      city: selected.city,
+      tech_type: selected.techType,
+      industry: selected.industry,
+      ...page
+    }
+    let res = await this.$axios.post('/api/recruit/search', p)
+    if (Number(res.data.status) === 1) {
+      let data = res.data.data
+      this.page.total = data.total
+      let dataList = data.list || []
+      dataList.forEach(item => {
+        item[ 'successCase' ] = ''
+      })
+      this.dataList = [ ...dataList]
+      this.page.page += 1
+      if (this.page.total <= this.dataList.length) {
+        this.finished = true
+      }
+    }
+  }
+  
+  dealThisMeta(isSeoList) {
+    const { city, industry, techType, cityName = "", industryName = "", techTypeName = "", proviceName } = this.selected
+    const { headers: { host }, url } = this.req
+    
+    let head = {
+      title: "", keyword: "", descrption: "", h1: "", canonical: "", metaLocation: ""
+    }
+    //拼接canonical
+    if (host.indexOf('local') !== -1) {
+      head.canonical = 'http://' + host + url
+    } else {
+      head.canonical = 'https://' + host + url
+    }
+    
+    if (city && !industry && !techType) {
+      //只有城市的
+      head.title = `${cityName}技术解决方案商家,${cityName}行业领域互联网技术开发解决方案-开发屋`
+      head.keyword = `${cityName}技术解决方案, ${cityName}技术解决方案案例`
+      head.descrption = `开发屋为${cityName}企业提供行业内领先的技术解决方案,包括行业定制化SaaS、PasS、API数据接口服务以及技术组织,保障${cityName}企业在降低人力开发成本的同时,得到优质的项目开发实力。`
+      head.h1 = `${cityName}技术解决方案`
+      head.metaLocation = `province=${proviceName};city=${cityName}`
+    } else if (!city && industry && !techType) {
+      //只有行业的
+      head.title = `${industryName}技术解决方案,${industryName}互联网技术开发解决方案提供-开发屋`
+      head.keyword = `${industryName}技术解决方案`
+      head.descrption = `开发屋为企业提供${industryName}领先的技术解决方案,包括行业定制化SaaS、PasS、API数据接口服务以及技术组织,保障${industryName}的企业在降低人力开发成本同时,得到优质的项目开发实力。`
+      head.h1 = `${industryName}技术解决方案`
+    } else if (!city && !industry && techType) {
+      //只有技术分类
+      head.title = `${techTypeName}技术解决方案案例展示,${techTypeName}及时开发解决方案提供-开发屋`
+      head.keyword = `${techTypeName}技术解决方案`
+      head.descrption = `开发屋为企业提供行业${techTypeName}领先的技术解决方案,包括行业定制化SaaS、PasS、API数据接口服务以及技术组织,保障行业${techTypeName}的企业在降低人力开发成本同时,得到优质的项目开发实力。`
+      head.h1 = `${techTypeName}技术解决方案`
+    } else if (city && industry && !techType) {
+      //${cityName}${industryName}
+      head.title = `${cityName}${industryName}技术解决方案,${cityName}${industryName}互联网技术开发解决方案提供-开发屋`
+      head.keyword = `${cityName}${industryName}技术解决方案`
+      head.descrption = `开发屋为企业提供${cityName}${industryName}领先的技术解决方案,包括行业定制化SaaS、PasS、API数据接口服务以及技术组织,保障${cityName}${industryName}的企业在降低人力开发成本同时,得到优质的项目开发实力。`
+      head.h1 = `${cityName}${industryName}技术解决方案`
+      head.metaLocation = `province=${proviceName};city=${cityName}`
+    } else if (city && !industry && techType) {
+      //${cityName}${techTypeName}
+      head.title = `${cityName}${techTypeName}技术解决方案案例展示,${cityName}${techTypeName}及时开发解决方案提供-开发屋`
+      head.keyword = `${cityName}${techTypeName}技术解决方案案例展示`
+      head.descrption = `开发屋为企业提供${cityName}行业${techTypeName}领先的技术解决方案,包括行业定制化SaaS、PasS、API数据接口服务以及技术组织,保障${cityName}行业${techTypeName}的企业在降低人力开发成本同时,得到优质的项目开发实力。`
+      head.h1 = `${cityName}${techTypeName}技术解决方案案例展示`
+      head.metaLocation = `province=${proviceName};city=${cityName}`
+    } else if (!city && industry && techType) {
+      //${industryName}${techTypeName}
+      head.title = `${industryName}${techTypeName}技术解决方案,${industryName}${techTypeName}互联网技术开发解决方案提供-开发屋`
+      head.keyword = `${industryName}${techTypeName}技术解决方案`
+      head.descrption = `开发屋为企业提供${industryName}${techTypeName}领先的技术解决方案,包括行业定制化SaaS、PasS、API数据接口服务以及技术组织,保障${industryName}${techTypeName}的企业在降低人力开发成本同时,得到优质的项目开发实力。`
+      head.h1 = `${industryName}${techTypeName}技术解决方案`
+    } else {
+      //非特定的url
+      
+      if (isSeoList) {
+        head.title = "解决方案大全"
+      } else {
+        head.title = "开发屋-提供各大行业定制化SaaS、PasS、API、技术组织等互联网领先的技术开发解决方案"
+        head.keyword = "定制化Saas、PasS、API、行业技术解决方案"
+        head.descrption = "开发屋为企业提供行业内领先的技术解决方案,包括行业定制化SaaS、PasS、API数据接口服务以及技术组织,保障企业在降低人力开发成本的同时,得到优质的项目开发实力。"
+      }
+    }
+    return head
+  }
+}
+

+ 206 - 0
components/job/footer.vue

@@ -0,0 +1,206 @@
+<template>
+  <div id="proginn-footer" v-if="deviceType.pc">
+    <div id="friend-links">
+      <div class="links">
+        <a href="/">
+          <img class="logo" :src="baseUrl+'/Public/image/common/logo_new.png'"/>
+        </a>
+        <div class="items">
+          <div class="item-box" v-for="(link, index) in data.link" :key="index">
+            <span class="name">{{link.name}}</span>
+            <div class="item">
+              <div class="list" :class="{expand: explan[index]}">
+                <a
+                  v-for="(item, ii) of link.data"
+                  :key="ii"
+                  :href="item.url"
+                  target="_blank"
+                  :title="item.name"
+                >{{item.name}}</a>
+              </div>
+              <span
+                class="more"
+                style="display: inline;"
+                @click="clickMore(index)"
+              >{{explan[index] ? '收起' : '更多'}}</span>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="footer" id="footer">
+      <div class="footer-container">
+        <div class="footer-links">
+          <a class="item" :href="baseUrl+'/index/app'" rel="nofollow">APP下载</a>
+          <a class="item" href="http://support.proginn.com/" rel="nofollow">帮助</a>
+          <a class="item" :href="baseUrl+'/about'" rel="nofollow">关于我们</a>
+          <a class="item" :href="baseUrl+'/about/mediareports'" rel="nofollow">媒体报道</a>
+          <a class="item" :href="baseUrl+'/sites/'" rel="nofollow">合作伙伴</a>
+          <a class="item" :href="baseUrl+'/about/suggestion'" rel="nofollow">意见反馈</a>
+          <span style="color: rgb(204, 204, 204);" class="ui item">© 程序员客栈</span>
+        </div>
+        <div class="safe">
+          <a href="http://www.miibeian.gov.cn" target="_blank" rel="nofollow">浙ICP备15029175号</a>
+          <div>
+            <a
+              style="display: flex;"
+              target="_blank"
+              href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=33011002011566"
+              rel="nofollow"
+            >
+              <img width="20" height="20" :src="baseUrl+'/Public/image/common/badge.png'"/>
+              <span
+                style="height:20px;line-height:20px;margin: 0px 0px 0px 5px;"
+              >浙公网安备 33011002011566号</span>
+            </a>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import { mapState } from 'vuex'
+
+  export default {
+    props: {
+      data: {
+        type: Object,
+        default: {
+          baseLink: "",
+          links: []
+        }
+      }
+    },
+    computed: {
+      ...mapState(['deviceType',]),
+    },
+    data() {
+      return {
+        baseUrl: "",
+        jishuBaseUrl: "",
+        explan: [false, false]
+      }
+    },
+    mounted() {
+
+    },
+    methods: {
+      clickMore(index) {
+        if (index > 1) {
+          return
+        }
+        this.explan[index] = !this.explan[index]
+        this.explan = [...this.explan]
+      },
+    },
+    created() {
+      this.baseUrl = this.$store.state.domainConfig.siteUrl;
+      this.jishuBaseUrl = this.$store.state.domainConfig.jishuinUrl;
+    }
+  };
+</script>
+
+<style scoped>
+  #proginn-footer {
+    width: 100%;
+  }
+
+  #friend-links,
+  #footer {
+    display: flex;
+    justify-content: center;
+    background: white;
+  }
+
+  #friend-links {
+    padding: 50px 0 40px;
+  }
+
+  .links,
+  .footer-container {
+    display: flex;
+    justify-content: space-between;
+    width: 1000px;
+    font-size: 12px;
+    color: #4a4a4a;
+  }
+
+  .logo {
+    width: 115px;
+    height: 38px;
+    margin-top: 10px;
+  }
+
+  .items {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    width: 840px;
+  }
+
+  .item {
+    display: flex;
+  }
+
+  .name {
+    line-height: 30px;
+    font-weight: 800;
+  }
+
+  .list {
+    --height: 30px;
+    flex: 1;
+    height: var(--height);
+    line-height: var(--height);
+    overflow: hidden;
+  }
+
+  .list a {
+    display: inline-block;
+    margin: 0 15px 0 0;
+  }
+
+  .expand {
+    height: auto;
+  }
+
+  .footer-container a,
+  .list a {
+    color: #4a4a4a;
+  }
+
+  .footer-container {
+    display: flex;
+    align-items: center;
+    border-top: 1px solid #ddd;
+    padding: 20px 0 10px;
+  }
+
+  .footer-links {
+    display: flex;
+    align-items: center;
+  }
+
+  .footer-container a {
+    margin: 0 30px 0 0;
+  }
+
+  .safe {
+    text-align: right;
+  }
+
+  .safe a {
+    margin: 0;
+  }
+
+  .more {
+    line-height: 30px;
+    cursor: pointer;
+  }
+
+  .more:hover {
+    color: #1782d9;
+  }
+</style>

+ 1 - 1
nuxt.config.js

@@ -110,7 +110,7 @@ module.exports = {
    * Proxy
    */
   proxy: [
-    ["/api", { target: "https://dev.test.proginn.com", changeOrigin: true }],
+    ["/api", { target: "https://web.test.proginn.com", changeOrigin: true }],
     [
       "/file/proxyUpload",
       { target: "https://dev.test.proginn.com", changeOrigin: true }

+ 6 - 5
package.json

@@ -28,6 +28,7 @@
     "mint-ui": "^2.2.13",
     "moment": "^2.24.0",
     "nuxt": "^2.6.3",
+    "qrcode": "^1.4.4",
     "qs": "^6.8.0",
     "vant": "^2.5.2",
     "vconsole": "^3.3.4",
@@ -36,14 +37,14 @@
   },
   "devDependencies": {
     "cheerio": "^1.0.0-rc.3",
+    "cross-env": "^5.2.0",
+    "css-loader": "^3.4.0",
     "less": "^3.9.0",
     "less-loader": "^5.0.0",
-    "sass-loader": "^7.1.0",
-    "style-loader": "^0.23.1",
     "node-sass": "^4.12.0",
-    "cross-env": "^5.2.0",
-    "css-loader": "^3.4.0",
-    "nodemon": "^1.18.9"
+    "nodemon": "^1.18.9",
+    "sass-loader": "^7.1.0",
+    "style-loader": "^0.23.1"
   },
   "resolutions": {
     "jspdf/file-saver": "1.3.8"

+ 85 - 14
pages/job/_post/_id.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="wrapper mobile">
+  <div class="jobDetailMobile wrapper mobile" v-if="mobile">
     <div class="contentArea">
       <div class="header">
         <div class="title-wrapper">
@@ -113,6 +113,42 @@
       </div>
     </div>
   </div>
+  <div class="jobDetail" v-else>
+    <div class="leftArea">
+      <div class="jobTitle">{{recruitData.title}}</div>
+      <div class="publishTime">发布时间:<span>{{recruitData.auditAtFormat}}</span></div>
+      <div class="workTime">工作经验:<span>{{recruitData.experienceName}}</span></div>
+      <div class="skills">要求:<span>{{recruitData.skills.map(s=> s.name).join(',')}}</span></div>
+      <div class="desc">
+        <div class="descTitle">
+          工作描述:
+        </div>
+        <div class="descValue" v-html="whiteSpace(recruitData.description)">>
+
+        </div>
+      </div>
+      <div class="btnArea">
+        <div class="btn submitNow" :class="{noneClick: recruitData.role === 'owner'}" @click="showGoAppTipsHandler">
+          <p>立即申请</p>
+        </div>
+      </div>
+    </div>
+    <div class="rightArea">
+      <div class="jobPrice">{{recruitData.salaryName}}</div>
+      <div class="userInfo">
+        <div class="img" :class="calcUserVip">
+          <img :src="defaultIcon(recruitData.ownerInfo && recruitData.ownerInfo.iconUrl)" alt="">
+        </div>
+        <div class="name">
+          {{recruitData.ownerInfo.nickname}}
+        </div>
+      </div>
+      <div class="qrcode">
+        <img class="code" :src="qrCodeBase64" alt="">
+        <img class="logo" src="~@/assets/img/job/logo_icon_reverse2.jpg" alt="">
+      </div>
+    </div>
+  </div>
 </template>
 
 <script>
@@ -123,13 +159,20 @@
   //   '审核失败', //6
   import { MessageBox } from 'mint-ui';
   import "mint-ui/lib/style.css";
+
+  let qrcode = null
+  if (process.browser) {
+    qrcode = require("qrcode");
+  }
+
   const COMPANY = 1;
   const PERSONAL = 2;
   export default {
     data() {
       return {
         showConfirm: false,
-        showConfirmWord: ""
+        showConfirmWord: "",
+        qrCodeBase64: ""
       }
     },
     head() {
@@ -147,9 +190,9 @@
         } ]
       }
     },
-    async asyncData({ app, $axios }) {
+    async asyncData({ app, $axios, store }) {
       const { android } = app.$deviceType
-      const {id} = app.context.route.params || {}
+      const { id } = app.context.route.params || {}
       let recruitId = id
       const params = {
         recruitId
@@ -166,7 +209,8 @@
       return {
         android,
         recruitId: recruitId,
-        recruitData
+        recruitData,
+        mobile: app.$deviceType.isMobile(),
       }
     },
 
@@ -176,9 +220,9 @@
       const path = this.$route.path
       const string = path.split('.')[ 0 ]
       this.recruitId = string.split('/')[ 3 ]
-      let {role, longTimeTip} = this.recruitData
+      let { role, longTimeTip } = this.recruitData
       //拥有者&企业方&需要提示
-      if (role==='owner' && Number(longTimeTip) === 1) {
+      if (role === 'owner' && Number(longTimeTip) === 1 && this.mobile) {
         MessageBox({
           title: '温馨提示',
           message: '如果您长时间未招聘到优质程序员,可以试试发布【整包/云端项目】,有专属客服帮您人工对接开发者。',
@@ -189,11 +233,17 @@
           showConfirmButton: true,
         }).then(action => {
           console.log(action)
-          if (action!=='cancel') {
+          if (action !== 'cancel') {
             location.href = "proginn://project_publish"
           }
         });
       }
+
+      if (!this.mobile) {
+        let baseUrl = this.$store.state.domainConfig.siteUrl
+        let jumpUrl = `${baseUrl}${location.pathname}`
+        this.createCode(jumpUrl)
+      }
     },
     methods: {
       async getRecruit() {
@@ -235,7 +285,7 @@
             message: '岗位关闭成功!',
             type: 'success'
           })
-          setTimeout(()=>{
+          setTimeout(() => {
             MessageBox({
               title: '温馨提示',
               message: '程序员客栈邀请您评价本次兼职招聘,希望您能抽出5-10秒的时间参与,以帮助我们更好的提升服务。',
@@ -245,7 +295,7 @@
               showCancelButton: true,
               showConfirmButton: true,
             }).then(action => {
-              if (action!=='cancel') {
+              if (action !== 'cancel') {
                 location.href = `proginn://recruit/company_comment?id=${this.recruitId}`
               }
               this.getRecruit()
@@ -303,7 +353,7 @@
       },
       /** 投递 **/
       async handleSendClick() {
-        const { applicationState, id} = this.recruitData
+        const { applicationState, id } = this.recruitData
         if (!(Number(applicationState) === 0)) {
           return
         }
@@ -375,11 +425,11 @@
           return {}
         }
       },
-      async dealTips(word="投递") {
-        let { directionNotMatch, workTypeNotMatch} = this.recruitData
+      async dealTips(word = "投递") {
+        let { directionNotMatch, workTypeNotMatch } = this.recruitData
         //职位类型
         if (Number(directionNotMatch) === 1) {
-         let ans1 = await MessageBox({
+          let ans1 = await MessageBox({
             title: '温馨提示',
             message: `该兼职岗位与您的【职位方向不符】,请您确认是否继续${word}。`,
             cancelButtonText: "再考虑下",
@@ -408,6 +458,27 @@
           }
         }
         return true
+      },
+      //创建二维码
+      createCode(url) {
+        console.log('warn' ,url)
+        qrcode.toDataURL(url, {
+          width: 250,
+          margin: 0,
+          errorCorrectionLevel: "H"
+        }).then(res => {
+          this.qrCodeBase64 = res
+        }).catch(err => {
+          this.$toast.clear()
+          this.$toast('生成二维码出错')
+          console.warn(JSON.stringfy(err))
+        })
+      },
+      showGoAppTipsHandler() {
+        if (this.recruitData.role !== 'owner') {
+          this.$message.info("用程序员客栈APP,扫描右侧二维码,直接与雇主沟通!")
+
+        }
       }
     }
   }

+ 290 - 0
pages/job/index.vue

@@ -0,0 +1,290 @@
+<template>
+  <div :class="{isMobile: mobile}">
+    <div class="jobList">
+      <div class="topArea" v-if="!isSeoList">
+<!--{{JSON.stringify(typeList)}}-->
+      </div>
+      <div class="contentArea">
+        <div class="selectArea" v-if="!isSeoList">
+          <div class="selectContent" v-for="(key, i) in Object.keys(typeList)" :key="i + 'selectContent'">
+            <div class="content">
+              <div class="left"><p>{{typeList[key].title}}</p></div>
+              <div class="right">
+                <div class="cell"
+                  v-for="(item, ii) in typeList[key].list"
+                  :class="{selected: item.id === selected[key]}"
+                  @click="changeIndex(key, item)"
+                  v-if="ii < 8 || expansion[key]"
+                  :key="ii+key+item.id"
+                >
+                  <p>{{item.name}}</p>
+                </div>
+              </div>
+              <div class="more" @click="changeExpansion(key)" v-if="typeList[key].list.length > 8">
+                {{expansion[key] ? "收起" : "更多"}}
+              </div>
+            </div>
+            <div class="smallContent"
+              v-if="key === 'direction' && typeList[key].smallList.length > 0"
+            >
+              <div class="cell"
+                v-for="(item) in typeList[key].smallList"
+                :class="{selected: item.id === selected.directionSmall}"
+                @click="changeIndex('directionSmall', item)"
+              >
+                <p>{{item.name}}</p>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="listArea">
+          <!--<h1 class="sTitle">{{head.h1 || '解决方案'}}</h1>-->
+          <div class="list" v-loading="loading">
+            <nuxt-link class="cell"
+              v-for="item in dataList"
+              :key="item.id"
+              :to="`/job/s/${item.id}.html`"
+              target="_blank"
+              :title="item.name"
+            >
+              <div class="topArea">
+                <div class="left">{{item.title}}</div>
+                <div class="right">{{item.salaryName}}</div>
+              </div>
+              <div class="workDesc">{{item.description}}</div>
+              <div class="labelList">
+                <div class="label" v-for="skill in (item.skills || [])"><p>{{skill.name}}</p></div>
+              </div>
+              <div class="companyInfo" @click.stop="jumpToCompanyInfo(item)">
+                <div class="logo">
+                  <img :src="item.companyInfo.logo" alt=""/>
+                </div>
+                <div class="companyName">{{item.companyInfo.name || item.companyInfo.shortName}}</div>
+              </div>
+            </nuxt-link>
+            <div v-if="dataList.length === 0" class="noneData">
+              <p>没有数据</p>
+            </div>
+          </div>
+        </div>
+        <div class="pagination">
+          <el-pagination v-if="!isSeoList" background layout="prev, pager, next" :total="page.total"
+            :page-size="page.size" @current-change="pageChange"></el-pagination>
+          <div v-else>
+            <div class="list">
+              <nuxt-link v-for="(item,index) in new Array(Math.ceil(page.total / page.size))"
+                :to="`/kaifain/s/?page=${index+1}`"
+                :key="(page)+index"
+              >
+                {{index+1}}
+              </nuxt-link>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <KaifainFooter style="margin-top: 30px;" :data="footer"/>
+  </div>
+</template>
+
+<script>
+  import ConnectUs from "@/components/common/connectUs"
+  import BindMobile from "@/components/common/bindMobile"
+  import DealSeoData from "@/components/job/dealSeoIndex"
+  import DealSeoFooter from "@/components/job/dealSeoFooter"
+  import KaifainFooter from "@/components/job/footer"
+
+  export default {
+    // layout: "opacity_header",
+    showCommonFooter: false,
+    components: { ConnectUs, BindMobile, KaifainFooter },
+    head() {
+      const { title = "", keyword = "", descrption = "", h1 = "", canonical = "", metaLocation } = this.head || {}
+      let obj = {
+        title: title,
+        meta: [
+          {
+            'name': 'keywords',
+            'content': keyword
+          }, {
+            'name': 'descrption',
+            'content': descrption
+          }, {
+            'name': 'h1',
+            'content': h1
+          }
+        ],
+        link: [
+          { rel: 'canonical', href: canonical },
+        ]
+      }
+      if (metaLocation) {
+        obj.meta.push({ 'name': 'location', 'content': metaLocation })
+      }
+      return obj
+    },
+    async asyncData({ ...params }) {
+      try {
+        params.store.commit("updateNoneCommonFooter", true)
+      } catch ( e ) {
+        console.log("updateNoneCommonFooter", e)
+      }
+      let dealDataObj = new DealSeoData(params)
+      let ans = await dealDataObj.dealData()
+
+      let dealSeoFooterObj = new DealSeoFooter(params)
+      let footer = await dealSeoFooterObj.dealData()
+
+      return {
+        ...ans,
+        ...footer
+      }
+    },
+    data() {
+      return {
+        expansion: {
+          direction: 0,
+          city: 0,
+        },
+        isShowToast: false,
+        name: '',
+        phone: '',
+        loading: false,
+        refreshing: false,
+        firstLoading: false, //移动端加载loading
+      }
+    },
+    watch: {
+
+    },
+    created() {
+      // this.firstLoading = true
+    },
+    mounted() {
+      // this.getList()
+      if (this.mobile) {
+        document.body.style = "overflow:hidden;"
+      }
+    },
+    methods: {
+      changeIndex(key, item) {
+        this.page.page = 1
+        this.page.total = 0
+        this.firstLoading = true
+        if (item) {
+          try {
+            this.selected[ key ] = item.id
+            if (key === 'direction') {
+              let list = this.typeList.direction.list.filter(item => item.id === this.selected.direction)[0]
+              this.typeList[key].smallList = [...(list && list.children || [])]
+              console.log(this.typeList[key].smallList )
+            }
+          } catch(e) {
+            console.log("changeIndex Error", e)
+          }
+          this.getList()
+        } else {
+          this.getList()
+        }
+      },
+      changeIndexSeo(key, item) {
+        console.log("key:", key, "item:", item, "selected:", this.selected)
+        this.selected[ key ] = item.id
+        this.selected[ key + 'Slug' ] = item.slug
+        let { citySlug, industrySlug, techTypeSlug } = this.selected
+        let url = "/kaifain/"
+        if (citySlug) {
+          url += citySlug + '/'
+        }
+        if (industrySlug) {
+          url += industrySlug + '/'
+        }
+        if (techTypeSlug) {
+          url += techTypeSlug + '/'
+        }
+        // location.href = url
+      },
+      changeExpansion(key) {
+        this.expansion[ key ] = !this.expansion[ key ]
+      },
+      getList() {
+        const { page, selected: {city, direction, directionSmall, workType} } = this
+        let p = {
+          cityId: city ,
+          // directionId: direction,
+          // occupationId: directionSmall,
+          // workType: workType,
+          ...page
+        }
+
+        direction && (p.directionId = direction)
+        workType && (p.workType = workType)
+        directionSmall && (p.directionId = directionSmall)
+        this.loading = true
+        // let params = new URLSearchParams(p).toString()
+        this.$axios.post('/api/recruit/search', p).then(res => {
+          if (Number(res.data.status) === 1) {
+            let data = res.data.data
+            this.page.total = data.total
+            let dataList = data.list || []
+            dataList.forEach(item => {
+              item[ 'successCase' ] = ''
+              if (Array.isArray(item.successful_case)) {
+                let tem = item.successful_case.map(item => item.title)
+                item[ 'successCase' ] = tem.join('、')
+              }
+            })
+            this.dataList = data.list
+            this.page.page += 1
+            if (this.page.total <= this.dataList.length) {
+              this.finished = true
+            }
+          }
+        }).finally(() => {
+          this.firstLoading = false
+          this.refreshing = false
+          this.loading = false
+          console.log("this.finished", this.finished)
+        })
+      },
+      pageChange(i) {
+        this.page.page = i
+        this.getList()
+      },
+      handleApplyBtnClick() {
+        const { userinfo } = this.$store.state || {}
+        //检查登录
+        if (!userinfo || !userinfo.uid) {
+          this.$message.info('请先登录!')
+          location.href = '/?loginbox=show'
+          return
+        }
+        //去绑定手机号
+        if (!userinfo.mobile) {
+          this.$message.info('请先绑定手机号')
+          this.$refs.bindMobile.open()
+          return
+        }
+        //判断是否是首次入驻 非首次入驻 跳转到企业主页
+        if (Number(userinfo.has_attend_service_provider) !== 0) {
+          location.href = "/wo/" + userinfo.uid
+          return
+        }
+        location.href = "/kaifain/add";
+      },
+      jumpToCompanyInfo(item) {
+        const {companyInfo:{uid}} = item
+        window.open(`/wo/${uid}`, `targetCompany${uid}`)
+      }
+    }
+  }
+</script>
+
+<style scope lang="scss">
+  @import "../../assets/css/job/index.scss";
+</style>
+<style lang="scss">
+  .van-dropdown-menu__title {
+    color: #666;
+  }
+</style>

+ 125 - 115
yarn.lock

@@ -1606,7 +1606,7 @@ ansi-styles@^2.2.1:
   resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
   integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
 
-ansi-styles@^3.2.1:
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
   version "3.2.1"
   resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
   integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=
@@ -2108,7 +2108,25 @@ browserslist@^4.0.0, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.8
     electron-to-chromium "^1.3.363"
     node-releases "^1.1.50"
 
-buffer-from@^1.0.0:
+buffer-alloc-unsafe@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npm.taobao.org/buffer-alloc-unsafe/download/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+  integrity sha1-vX3CauKXLQ7aJTvgYdupkjScGfA=
+
+buffer-alloc@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npm.taobao.org/buffer-alloc/download/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+  integrity sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=
+  dependencies:
+    buffer-alloc-unsafe "^1.1.0"
+    buffer-fill "^1.0.0"
+
+buffer-fill@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npm.taobao.org/buffer-fill/download/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+  integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
+
+buffer-from@^1.0.0, buffer-from@^1.1.1:
   version "1.1.1"
   resolved "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
   integrity sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=
@@ -2132,6 +2150,14 @@ buffer@^4.3.0:
     ieee754 "^1.1.4"
     isarray "^1.0.0"
 
+buffer@^5.4.3:
+  version "5.5.0"
+  resolved "https://registry.npm.taobao.org/buffer/download/buffer-5.5.0.tgz#9c3caa3d623c33dd1c7ef584b89b88bf9c9bc1ce"
+  integrity sha1-nDyqPWI8M90cfvWEuJuIv5ybwc4=
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+
 builtin-status-codes@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
@@ -2476,6 +2502,15 @@ cliui@^3.2.0:
     strip-ansi "^3.0.1"
     wrap-ansi "^2.0.0"
 
+cliui@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz?cache=0&sync_timestamp=1573942320052&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+  integrity sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=
+  dependencies:
+    string-width "^3.1.0"
+    strip-ansi "^5.2.0"
+    wrap-ansi "^5.1.0"
+
 clone-deep@^4.0.1:
   version "4.0.1"
   resolved "https://registry.npm.taobao.org/clone-deep/download/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
@@ -3181,7 +3216,7 @@ debug@^4.1.0, debug@^4.1.1:
   dependencies:
     ms "^2.1.1"
 
-decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
   version "1.2.0"
   resolved "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz?cache=0&sync_timestamp=1580010393599&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
@@ -3295,11 +3330,6 @@ detect-indent@^5.0.0:
   resolved "https://registry.npm.taobao.org/detect-indent/download/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
   integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
 
-detect-libc@^1.0.2:
-  version "1.0.3"
-  resolved "https://registry.npm.taobao.org/detect-libc/download/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
-  integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
-
 diffie-hellman@^5.0.0:
   version "5.0.3"
   resolved "https://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -3309,6 +3339,11 @@ diffie-hellman@^5.0.0:
     miller-rabin "^4.0.0"
     randombytes "^2.0.0"
 
+dijkstrajs@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npm.taobao.org/dijkstrajs/download/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b"
+  integrity sha1-082BIh4+pAdCz83lVtTpnpjdxxs=
+
 dimport@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npm.taobao.org/dimport/download/dimport-1.0.0.tgz#d5c09564f621e7b24b2e333cccdf9b2303011644"
@@ -3849,7 +3884,7 @@ file-loader@^4.3.0:
     loader-utils "^1.2.3"
     schema-utils "^2.5.0"
 
-file-saver@1.3.8, "file-saver@github:eligrey/FileSaver.js#1.3.8":
+file-saver@1.3.8, file-saver@eligrey/FileSaver.js#1.3.8:
   version "1.3.8"
   resolved "https://registry.npm.taobao.org/file-saver/download/file-saver-1.3.8.tgz#e68a30c7cb044e2fb362b428469feb291c2e09d8"
   integrity sha1-5oowx8sETi+zYrQoRp/rKRwuCdg=
@@ -4033,13 +4068,6 @@ fs-extra@^8.1.0:
     jsonfile "^4.0.0"
     universalify "^0.1.0"
 
-fs-minipass@^1.2.5:
-  version "1.2.7"
-  resolved "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
-  integrity sha1-zP+FcIQef+QmVpPaiJNsVa7X98c=
-  dependencies:
-    minipass "^2.6.0"
-
 fs-minipass@^2.0.0:
   version "2.1.0"
   resolved "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
@@ -4121,6 +4149,11 @@ get-caller-file@^1.0.1:
   resolved "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
   integrity sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=
 
+get-caller-file@^2.0.1:
+  version "2.0.5"
+  resolved "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+  integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=
+
 get-stdin@^4.0.1:
   version "4.0.1"
   resolved "https://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
@@ -4540,7 +4573,7 @@ human-signals@^1.1.1:
   resolved "https://registry.npm.taobao.org/human-signals/download/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
   integrity sha1-xbHNFPUK6uCatsWf5jujOV/k36M=
 
-iconv-lite@0.4.24, iconv-lite@^0.4.13, iconv-lite@^0.4.4:
+iconv-lite@0.4.24, iconv-lite@^0.4.13:
   version "0.4.24"
   resolved "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1579334008444&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
   integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=
@@ -4569,13 +4602,6 @@ ignore-by-default@^1.0.1:
   resolved "https://registry.npm.taobao.org/ignore-by-default/download/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
   integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
 
-ignore-walk@^3.0.1:
-  version "3.0.3"
-  resolved "https://registry.npm.taobao.org/ignore-walk/download/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
-  integrity sha1-AX4kRxhL/q3nwjjkrv3R6PlbHjc=
-  dependencies:
-    minimatch "^3.0.4"
-
 ignore@^5.1.4:
   version "5.1.4"
   resolved "https://registry.npm.taobao.org/ignore/download/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
@@ -5009,6 +5035,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
   resolved "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
   integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
 
+isarray@^2.0.1:
+  version "2.0.5"
+  resolved "https://registry.npm.taobao.org/isarray/download/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+  integrity sha1-ivHkwSISRMxiRZ+vOJQNTmRKVyM=
+
 isexe@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@@ -5651,14 +5682,6 @@ minipass-pipeline@^1.2.2:
   dependencies:
     minipass "^3.0.0"
 
-minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
-  version "2.9.0"
-  resolved "https://registry.npm.taobao.org/minipass/download/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
-  integrity sha1-5xN2Ln0+Mv7YAxFc+T4EvKn8yaY=
-  dependencies:
-    safe-buffer "^5.1.2"
-    yallist "^3.0.0"
-
 minipass@^3.0.0, minipass@^3.1.1:
   version "3.1.1"
   resolved "https://registry.npm.taobao.org/minipass/download/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5"
@@ -5666,13 +5689,6 @@ minipass@^3.0.0, minipass@^3.1.1:
   dependencies:
     yallist "^4.0.0"
 
-minizlib@^1.2.1:
-  version "1.3.3"
-  resolved "https://registry.npm.taobao.org/minizlib/download/minizlib-1.3.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminizlib%2Fdownload%2Fminizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
-  integrity sha1-IpDeloGKNMKVUcio0wEha9Zahh0=
-  dependencies:
-    minipass "^2.9.0"
-
 mint-ui@^2.2.13:
   version "2.2.13"
   resolved "https://registry.npm.taobao.org/mint-ui/download/mint-ui-2.2.13.tgz#856a2cba9608c6ecf21f0e521ce89ed8ddfe33d3"
@@ -5772,15 +5788,6 @@ nanomatch@^1.2.9:
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
-needle@^2.2.1:
-  version "2.3.3"
-  resolved "https://registry.npm.taobao.org/needle/download/needle-2.3.3.tgz?cache=0&sync_timestamp=1583154705070&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fneedle%2Fdownload%2Fneedle-2.3.3.tgz#a041ad1d04a871b0ebb666f40baaf1fb47867117"
-  integrity sha1-oEGtHQSocbDrtmb0C6rx+0eGcRc=
-  dependencies:
-    debug "^3.2.6"
-    iconv-lite "^0.4.4"
-    sax "^1.2.4"
-
 negotiator@0.6.2:
   version "0.6.2"
   resolved "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
@@ -5860,22 +5867,6 @@ node-object-hash@^1.2.0:
   resolved "https://registry.npm.taobao.org/node-object-hash/download/node-object-hash-1.4.2.tgz#385833d85b229902b75826224f6077be969a9e94"
   integrity sha1-OFgz2FsimQK3WCYiT2B3vpaanpQ=
 
-node-pre-gyp@*:
-  version "0.14.0"
-  resolved "https://registry.npm.taobao.org/node-pre-gyp/download/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
-  integrity sha1-mgWWUzuHcom8rU4UOYLKPZBN3IM=
-  dependencies:
-    detect-libc "^1.0.2"
-    mkdirp "^0.5.1"
-    needle "^2.2.1"
-    nopt "^4.0.1"
-    npm-packlist "^1.1.6"
-    npmlog "^4.0.2"
-    rc "^1.2.7"
-    rimraf "^2.6.1"
-    semver "^5.3.0"
-    tar "^4.4.2"
-
 node-releases@^1.1.50:
   version "1.1.51"
   resolved "https://registry.npm.taobao.org/node-releases/download/node-releases-1.1.51.tgz?cache=0&sync_timestamp=1583684606519&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.51.tgz#70d0e054221343d2966006bfbd4d98622cc00bd0"
@@ -5940,14 +5931,6 @@ nodemon@^1.18.9:
   dependencies:
     abbrev "1"
 
-nopt@^4.0.1:
-  version "4.0.3"
-  resolved "https://registry.npm.taobao.org/nopt/download/nopt-4.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnopt%2Fdownload%2Fnopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
-  integrity sha1-o3XK2dAv2SEnjZVMIlTVqlfhXkg=
-  dependencies:
-    abbrev "1"
-    osenv "^0.1.4"
-
 nopt@~1.0.10:
   version "1.0.10"
   resolved "https://registry.npm.taobao.org/nopt/download/nopt-1.0.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnopt%2Fdownload%2Fnopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
@@ -6002,27 +5985,6 @@ normalize-wheel@^1.0.1:
   resolved "https://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45"
   integrity sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU=
 
-npm-bundled@^1.0.1:
-  version "1.1.1"
-  resolved "https://registry.npm.taobao.org/npm-bundled/download/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
-  integrity sha1-Ht1XCGWpTNsbyCIHdeKUZsn7I0s=
-  dependencies:
-    npm-normalize-package-bin "^1.0.1"
-
-npm-normalize-package-bin@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.npm.taobao.org/npm-normalize-package-bin/download/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
-  integrity sha1-bnmkHyP9I1wGIyGCKNp9nCO49uI=
-
-npm-packlist@^1.1.6:
-  version "1.4.8"
-  resolved "https://registry.npm.taobao.org/npm-packlist/download/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
-  integrity sha1-Vu5swTW5+YrT1Rwcldoiu7my7z4=
-  dependencies:
-    ignore-walk "^3.0.1"
-    npm-bundled "^1.0.1"
-    npm-normalize-package-bin "^1.0.1"
-
 npm-run-path@^2.0.0:
   version "2.0.2"
   resolved "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
@@ -6037,7 +5999,7 @@ npm-run-path@^4.0.0:
   dependencies:
     path-key "^3.0.0"
 
-"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0:
   version "4.1.2"
   resolved "https://registry.npm.taobao.org/npmlog/download/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
   integrity sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=
@@ -6236,7 +6198,7 @@ os-tmpdir@^1.0.0:
   resolved "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
   integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
 
-osenv@0, osenv@^0.1.4:
+osenv@0:
   version "0.1.5"
   resolved "https://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
   integrity sha1-hc36+uso6Gd/QW4odZK18/SepBA=
@@ -6507,6 +6469,11 @@ pkg-up@^3.1.0:
   dependencies:
     find-up "^3.0.0"
 
+pngjs@^3.3.0:
+  version "3.4.0"
+  resolved "https://registry.npm.taobao.org/pngjs/download/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
+  integrity sha1-mcp9clll+2VYFOr2XzjxK72/VV8=
+
 posix-character-classes@^0.1.0:
   version "0.1.1"
   resolved "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
@@ -7319,6 +7286,19 @@ q@^1.1.2:
   resolved "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz?cache=0&sync_timestamp=1566282953114&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fq%2Fdownload%2Fq-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
   integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
 
+qrcode@^1.4.4:
+  version "1.4.4"
+  resolved "https://registry.npm.taobao.org/qrcode/download/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83"
+  integrity sha1-8MQ1aKfnUQpV78O4jZYC9xlj6oM=
+  dependencies:
+    buffer "^5.4.3"
+    buffer-alloc "^1.2.0"
+    buffer-from "^1.1.1"
+    dijkstrajs "^1.0.1"
+    isarray "^2.0.1"
+    pngjs "^3.3.0"
+    yargs "^13.2.4"
+
 qs@6.7.0:
   version "6.7.0"
   resolved "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
@@ -7408,7 +7388,7 @@ raw-body@2.4.0:
     iconv-lite "0.4.24"
     unpipe "1.0.0"
 
-rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
+rc@^1.0.1, rc@^1.1.6:
   version "1.2.8"
   resolved "https://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
   integrity sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=
@@ -7647,6 +7627,11 @@ require-main-filename@^1.0.1:
   resolved "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
   integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
 
+require-main-filename@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+  integrity sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=
+
 requires-port@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
@@ -7718,7 +7703,7 @@ right-align@^0.1.1:
   dependencies:
     align-text "^0.1.1"
 
-rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1:
+rimraf@2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1:
   version "2.7.1"
   resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
   integrity sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=
@@ -7797,7 +7782,7 @@ sass-loader@^7.1.0:
     pify "^4.0.1"
     semver "^6.3.0"
 
-sax@^1.1.4, sax@^1.2.4, sax@~1.2.4:
+sax@^1.1.4, sax@~1.2.4:
   version "1.2.4"
   resolved "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk=
@@ -7834,7 +7819,7 @@ semver-diff@^2.0.0:
   dependencies:
     semver "^5.0.3"
 
-"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1:
+"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1:
   version "5.7.1"
   resolved "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
   integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=
@@ -8274,7 +8259,7 @@ string-width@^1.0.1, string-width@^1.0.2:
     is-fullwidth-code-point "^2.0.0"
     strip-ansi "^4.0.0"
 
-string-width@^3.0.0:
+string-width@^3.0.0, string-width@^3.1.0:
   version "3.1.0"
   resolved "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
   integrity sha1-InZ74htirxCBV0MG9prFG2IgOWE=
@@ -8345,7 +8330,7 @@ strip-ansi@^4.0.0:
   dependencies:
     ansi-regex "^3.0.0"
 
-strip-ansi@^5.1.0:
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
   version "5.2.0"
   resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
   integrity sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=
@@ -8513,19 +8498,6 @@ tar@^2.0.0:
     fstream "^1.0.12"
     inherits "2"
 
-tar@^4.4.2:
-  version "4.4.13"
-  resolved "https://registry.npm.taobao.org/tar/download/tar-4.4.13.tgz?cache=0&sync_timestamp=1580272793579&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftar%2Fdownload%2Ftar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
-  integrity sha1-Q7NkvFKIjVVSmGN7ENYHkCVKtSU=
-  dependencies:
-    chownr "^1.1.1"
-    fs-minipass "^1.2.5"
-    minipass "^2.8.6"
-    minizlib "^1.2.1"
-    mkdirp "^0.5.0"
-    safe-buffer "^5.1.2"
-    yallist "^3.0.3"
-
 term-size@^1.2.0:
   version "1.2.0"
   resolved "https://registry.npm.taobao.org/term-size/download/term-size-1.2.0.tgz?cache=0&sync_timestamp=1580400220806&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterm-size%2Fdownload%2Fterm-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
@@ -9348,6 +9320,11 @@ which-module@^1.0.0:
   resolved "https://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
   integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
 
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+  integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
 which@1, which@^1.2.9:
   version "1.3.1"
   resolved "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
@@ -9418,6 +9395,15 @@ wrap-ansi@^2.0.0:
     string-width "^1.0.1"
     strip-ansi "^3.0.1"
 
+wrap-ansi@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+  integrity sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=
+  dependencies:
+    ansi-styles "^3.2.0"
+    string-width "^3.0.0"
+    strip-ansi "^5.0.0"
+
 wrap-ansi@^6.0.0, wrap-ansi@^6.2.0:
   version "6.2.0"
   resolved "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
@@ -9502,7 +9488,7 @@ yallist@^2.1.2:
   resolved "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
   integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
 
-yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
+yallist@^3.0.2:
   version "3.1.1"
   resolved "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
   integrity sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=
@@ -9512,6 +9498,14 @@ yallist@^4.0.0:
   resolved "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
   integrity sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=
 
+yargs-parser@^13.1.2:
+  version "13.1.2"
+  resolved "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.1.2.tgz?cache=0&sync_timestamp=1584135398523&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+  integrity sha1-Ew8JcC667vJlDVTObj5XBvek+zg=
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
 yargs-parser@^5.0.0:
   version "5.0.0"
   resolved "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
@@ -9519,6 +9513,22 @@ yargs-parser@^5.0.0:
   dependencies:
     camelcase "^3.0.0"
 
+yargs@^13.2.4:
+  version "13.3.2"
+  resolved "https://registry.npm.taobao.org/yargs/download/yargs-13.3.2.tgz?cache=0&sync_timestamp=1584136307434&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+  integrity sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=
+  dependencies:
+    cliui "^5.0.0"
+    find-up "^3.0.0"
+    get-caller-file "^2.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^3.0.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^13.1.2"
+
 yargs@^7.0.0:
   version "7.1.0"
   resolved "https://registry.npm.taobao.org/yargs/download/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"