张延森 преди 4 години
родител
ревизия
6895c1de4a
променени са 11 файла, в които са добавени 365 реда и са изтрити 54 реда
  1. 4
    0
      config/index.js
  2. 10
    0
      jsconfig.json
  3. 2
    1
      package.json
  4. 1
    1
      project.config.json
  5. 114
    21
      src/components/WuYeJiaoFei/index.jsx
  6. 5
    0
      src/components/WuYeJiaoFei/index.less
  7. 31
    22
      src/components/WuYeJiaoFeiItem/index.jsx
  8. 4
    1
      src/pages.js
  9. 106
    8
      src/pages/WuYe/JiaoFeiDetail/index.jsx
  10. 20
    0
      src/utils/api.js
  11. 68
    0
      yarn.lock

+ 4
- 0
config/index.js Целия файл

@@ -42,6 +42,10 @@ const config = {
42 42
           generateScopedName: '[name]__[local]___[hash:base64:5]'
43 43
         }
44 44
       }
45
+    },
46
+    webpackChain (chain, webpack) {
47
+      chain.plugin('analyzer')
48
+        .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin, [])
45 49
     }
46 50
   },
47 51
   h5: {

+ 10
- 0
jsconfig.json Целия файл

@@ -0,0 +1,10 @@
1
+{
2
+  "compilerOptions": {
3
+    "baseUrl": "./",
4
+    "paths": {
5
+      "@/*": ["src/*"],
6
+    }
7
+  },
8
+  "exclude": ["node_modules", "dist"],
9
+  "include": ["src/**/*"]
10
+}

+ 2
- 1
package.json Целия файл

@@ -46,7 +46,8 @@
46 46
     "node-sass": "^5.0.0",
47 47
     "react": "^16.10.0",
48 48
     "react-dom": "^16.10.0",
49
-    "taro-ui": "^2.3.4"
49
+    "taro-ui": "^2.3.4",
50
+    "webpack-bundle-analyzer": "^4.2.0"
50 51
   },
51 52
   "devDependencies": {
52 53
     "@babel/core": "^7.8.0",

+ 1
- 1
project.config.json Целия файл

@@ -2,7 +2,7 @@
2 2
 	"miniprogramRoot": "dist/",
3 3
 	"projectname": "miniapp",
4 4
 	"description": "",
5
-	"appid": "wxe44244d1a5ea3364",
5
+	"appid": "wxf2956bfef9daf0ae",
6 6
 	"setting": {
7 7
 		"urlCheck": true,
8 8
 		"scopeDataCheck": false,

+ 114
- 21
src/components/WuYeJiaoFei/index.jsx Целия файл

@@ -3,14 +3,61 @@ import WuYeJiaoFeiItem from '@/components/WuYeJiaoFeiItem/index'
3 3
 import ScrollPageRefresh from '@/components/ScrollPageRefresh/index'
4 4
 import request, { apis } from '@/utils/request'
5 5
 import Taro from '@tarojs/taro'
6
+import { Checkbox, CheckboxGroup } from '@tarojs/components'
6 7
 import '@/assets/css/reset.less'
7 8
 import '@/assets/css/iconfont.less'
8 9
 import './index.less'
9 10
 
11
+const cancelOrder = outTradeNo => {
12
+  return new Promise((resolve, reject) => {
13
+    if (outTradeNo) {
14
+      request({...apis.wxCancelPay, args: { outTradeNo }, params: { type: 'bill' }})
15
+        .then(res => resolve(res))
16
+        .catch(err => reject(err))
17
+    } else {
18
+      resolve()
19
+    }
20
+  })
21
+}
22
+
23
+const pay = idArray => {
24
+  return new Promise((resolve, reject) => {
25
+    // 准备下单
26
+    request({...apis.wxStartPay, data: { type: 'bill', idArray }}).then(res => {
27
+      const outTradeNo = res.outTradeNo
28
+      // 下单
29
+      request({...apis.wxUnifiedOrder, args: { outTradeNo }, params: { type: 'bill'}} ).then(res => {
30
+        wx.requestPayment({
31
+          timeStamp: res.timeStamp,
32
+          nonceStr: res.nonceStr,
33
+          package: res.package,
34
+          paySign: res.sign,
35
+          signType: res.signType,
36
+          success: resp => {
37
+            console.log('支付结果:', resp)
38
+            resolve(resp)
39
+          },
40
+          fail: err => {
41
+            console.error('支付失败', err)
42
+            cancelOrder(outTradeNo)
43
+            reject(err)
44
+          }
45
+        })
46
+      }).catch(err => {
47
+        cancelOrder(outTradeNo)
48
+        reject(err)
49
+      })
50
+    }).catch(err => reject(err))
51
+  })
52
+}
53
+
54
+
10 55
 export default function WuYeJiaoFei () {
11 56
 
12 57
   const [PageList, setPageList] = useState([])
13 58
   const [BannerList, setBannerList] = useState([])
59
+  const [checkedIds, setCheckedIds] = useState([])
60
+  const [totalPrice, setTotalPrice] = useState(0)
14 61
 
15 62
   useEffect(() => {
16 63
     GetBanner()
@@ -26,37 +73,83 @@ export default function WuYeJiaoFei () {
26 73
   }
27 74
 
28 75
   const Refresh = (e) => { // 下拉刷新
29
-    setPageList(e)
76
+    if (e && e.length) {
77
+      // 缴费中的不显示
78
+      const list = e.filter(x => x.billStatus !== '3')
79
+      setPageList(list)
80
+    }
30 81
   }
31 82
 
32 83
   const Push = (e) => { // 上拉加载
33 84
     setPageList(PageList.concat(e))
34 85
   }
35 86
 
87
+  const handleGroupChange = e => {
88
+    const ids = e.detail.value || []
89
+    setCheckedIds(ids.map(x => x-0))
90
+  }
91
+
92
+  const handlePay = e => {
93
+    Taro.showModal({
94
+      title: '提示',
95
+      content: `确定缴费 ${totalPrice} 元?`,
96
+      success: res => {
97
+        if (res.confirm) {
98
+          pay(checkedIds).then(res => {
99
+            Taro.showToast({
100
+              title: '缴费成功',
101
+              icon: 'success'
102
+            })
103
+            // 页面刷新
104
+            // todo
105
+          }).catch(err => {
106
+            console.log(err)
107
+            Taro.showToast({
108
+              title: (err.message || err.errMsg || err) ,
109
+              icon: 'none'
110
+            })
111
+          })
112
+        }
113
+      }
114
+    })
115
+  }
116
+
117
+  useEffect(() => {
118
+    const items = checkedIds.map(x => PageList.filter(y => y.id === x)[0]).filter(Boolean)
119
+    const total = items.reduce((acc, x) => acc + x.payPrice, 0)
120
+    setTotalPrice(total)
121
+  }, [checkedIds, PageList])
122
+
36 123
   return (
37 124
     <view className='WuYeJiaoFei'>
38
-      <ScrollPageRefresh ApiName={`getJiaoFeiList`} ListName={`list`} RequestUrlData={{ type: 0 }} Refresh={Refresh} Push={Push}>
125
+        <ScrollPageRefresh ApiName={`getJiaoFeiList`} ListName={`list`} RequestUrlData={{ type: 0 }} Refresh={Refresh} Push={Push}>
39 126
 
40
-        {/* 大图 */}
41
-        <view className='BigImg'>
42
-          {
43
-            BannerList.length > 0 &&
44
-            <image mode='aspectFill' src={BannerList[0].image} className='centerLabel' onClick={() => { Taro.navigateTo({ url: `/pages/HuoDong/ZiXunDetail/index?id=${BannerList[0].targetId}` }) }}></image>
45
-          }
46
-        </view>
47
-
48
-        {/* 缴费列表 */}
49
-        <view className='List'>
50
-          {
51
-            PageList.map((item, index) => (
52
-              <view key={`WuYeJiaoFeiItem-${index}`}>
53
-                <WuYeJiaoFeiItem Data={item}></WuYeJiaoFeiItem>
54
-              </view>
55
-            ))
56
-          }
57
-        </view>
127
+          {/* 大图 */}
128
+          <view className='BigImg'>
129
+            {
130
+              BannerList.length > 0 &&
131
+              <image mode='aspectFill' src={BannerList[0].image} className='centerLabel' onClick={() => { Taro.navigateTo({ url: `/pages/HuoDong/ZiXunDetail/index?id=${BannerList[0].targetId}` }) }}></image>
132
+            }
133
+          </view>
134
+          
135
+          <view>
136
+            <view>{`总金额 ${totalPrice} 元`}</view>
137
+            <button onClick={handlePay}>支付</button>
138
+          </view>
139
+          {/* 缴费列表 */}
140
+          <view className='List'>
141
+            <CheckboxGroup onChange={handleGroupChange}>
142
+            {
143
+              PageList.map((item, index) => (
144
+                <Checkbox key={`WuYeJiaoFeiItem-${index}`} value={item.id} disabled={item.billStatus !== '0'}>
145
+                  <WuYeJiaoFeiItem Data={item}></WuYeJiaoFeiItem>
146
+                </Checkbox>
147
+              ))
148
+            }
149
+            </CheckboxGroup>
150
+          </view>
58 151
 
59
-      </ScrollPageRefresh>
152
+        </ScrollPageRefresh>
60 153
     </view>
61 154
   )
62 155
 }

+ 5
- 0
src/components/WuYeJiaoFei/index.less Целия файл

@@ -21,6 +21,11 @@
21 21
     position: relative;
22 22
     overflow: hidden;
23 23
 
24
+    checkbox {
25
+      display: block;
26
+      line-height: 1.4em;
27
+    }
28
+
24 29
     >view {
25 30
       width: 100%;
26 31
       position: relative;

+ 31
- 22
src/components/WuYeJiaoFeiItem/index.jsx Целия файл

@@ -8,29 +8,38 @@ export default function WuYeJiaoFeiItem (props) {
8 8
 
9 9
   const { Data } = props
10 10
 
11
+  const handleClick = () => {
12
+    // Taro.navigateTo({ url: `/pages/WuYe/JiaoFeiDetail/index?id=${Data.id}`})
13
+  }
14
+
11 15
   return (
12
-    <view className='WuYeJiaoFeiItem' onClick={() => { Taro.navigateTo({ url: `/pages/WuYe/JiaoFeiDetail/index?id=${Data.id}` }) }}>
13
-      <view className='Title flex-h'>
14
-        <text className='flex-item'>物业费</text>
15
-        <text>2020/06/08  0:00截止</text>
16
-      </view>
17
-      <view className='JiaoFeiContent'>
18
-        <view className='Name flex-h'>
19
-          <text className='flex-item'>2020年5月物业管理费</text>
20
-          <text>剩余缴费时间</text>
21
-          <text className='Num'>3</text>
22
-          <text>天</text>
23
-        </view>
24
-        <text>垃圾费:300元</text>
25
-        <text>电费:300.83元</text>
26
-        <text>物业费:300元</text>
27
-        <view className='Price flex-h'>
28
-          <text className='Num'>340</text>
29
-          <text>元</text>
30
-          <view className='flex-item'></view>
31
-          <text className='Btn'>立即缴费</text>
32
-        </view>
33
-      </view>
16
+    // <view className='WuYeJiaoFeiItem' onClick={handleClick}>
17
+    //   <view className='Title flex-h'>
18
+    //     <text className='flex-item'>物业费</text>
19
+    //     <text>2020/06/08  0:00截止</text>
20
+    //   </view>
21
+    //   <view className='JiaoFeiContent'>
22
+    //     <view className='Name flex-h'>
23
+    //       <text className='flex-item'>2020年5月物业管理费</text>
24
+    //       <text>剩余缴费时间</text>
25
+    //       <text className='Num'>3</text>
26
+    //       <text>天</text>
27
+    //     </view>
28
+    //     <text>垃圾费:300元</text>
29
+    //     <text>电费:300.83元</text>
30
+    //     <text>物业费:300元</text>
31
+    //     <view className='Price flex-h'>
32
+    //       <text className='Num'>340</text>
33
+    //       <text>元</text>
34
+    //       <view className='flex-item'></view>
35
+    //       <text className='Btn'>立即缴费</text>
36
+    //     </view>
37
+    //   </view>
38
+    // </view>
39
+    <view style="display: flex">
40
+      <view>{Data.billName}</view>
41
+      <view></view>
42
+      <view>{`${Data.payPrice} 元`}</view>
34 43
     </view>
35 44
   )
36 45
 }

+ 4
- 1
src/pages.js Целия файл

@@ -61,7 +61,10 @@ const Property = [
61 61
     name: '物业-报修区域',
62 62
     page: 'pages/WuYe/BaoXiuQuYu/index',
63 63
     auth: ['avatar', 'phone', 'yezhu'],
64
-    type: 'property',
64
+    track: {
65
+      event: 'detail',
66
+      eventType: 'property',
67
+    }
65 68
   },
66 69
   {
67 70
     name: '物业-添加报修',

+ 106
- 8
src/pages/WuYe/JiaoFeiDetail/index.jsx Целия файл

@@ -1,18 +1,116 @@
1
-import React, { useState } from 'react'
1
+import React, { useState, useEffect, useRef } from 'react'
2 2
 import Taro, { Current } from '@tarojs/taro'
3
+import request, { apis } from '@/utils/request'
3 4
 import SlidePopup from '@/components/SlidePopup/index'
4 5
 import Page from '@/layouts'
6
+import { useModel } from '@/store'
5 7
 import '@/assets/css/reset.less'
6 8
 import '@/assets/css/iconfont.less'
7 9
 import './index.less'
8 10
 
9 11
 export default function JiaoFeiDetail () {
10
-
12
+  const { user } = useModel('user')
13
+  const [bill, setBill] = useState([])
11 14
   const [ShowPopup, setShowPopup] = useState(false)
12 15
 
13 16
   const [PopupType, setPopupType] = useState(0)
14 17
 
15
-  const CurrnetJiaoFeiId = Current.router.params.id
18
+  const { id } = Current.router.params
19
+  const paying = useRef(false)
20
+  const order = useRef()
21
+
22
+  const handleReadyPay = () => {
23
+    setPopupType(1)
24
+    setShowPopup(true)
25
+  }
26
+
27
+  const cancelOrder = () => {
28
+    if (order.current && order.current.outTradeNo) {
29
+      request({...apis.wxCancelPay, args: { outTradeNo: order.current.outTradeNo }, params: { type: 'bill' }}).then(res => {
30
+        order.current = undefined
31
+      }).catch(er => {
32
+        Taro.showToast({
33
+          title: er,
34
+          icon: 'none'
35
+        })
36
+      })
37
+    }
38
+  }
39
+
40
+  const handleCancelOrder = () => {
41
+    cancelOrder()
42
+    setShowPopup(false)
43
+    setPopupType(0)
44
+  }
45
+
46
+  const handlePaying = () => {
47
+    // 防止重复提交
48
+    if (paying.current) {
49
+      return
50
+    }
51
+
52
+    paying.current = true
53
+    
54
+    // 准备下单
55
+    request({...apis.wxStartPay, data: { type: 'bill', idArray: [id].map(x => x-0) }}).then(res => {
56
+      order.current = res
57
+      const outTradeNo = res.outTradeNo
58
+      // 下单
59
+      request({...apis.wxUnifiedOrder, args: { outTradeNo }, params: { type: 'bill'}} ).then(res => {
60
+        wx.requestPayment({
61
+          timeStamp: res.timeStamp,
62
+          nonceStr: res.nonceStr,
63
+          package: res.package,
64
+          paySign: res.sign,
65
+          signType: res.signType,
66
+          success: resp => {
67
+            console.log('支付结果:', resp)
68
+            paying.current = false
69
+            order.current = undefined
70
+            setShowPopup(false)
71
+            setPopupType(0)
72
+
73
+            Taro.showToast({
74
+              title: '支付成功',
75
+              icon: 'success'
76
+            })
77
+          },
78
+          fail: err => {
79
+            console.error('支付失败', err)
80
+            cancelOrder()
81
+            paying.current = false
82
+            Taro.showToast({
83
+              title: err.message || err.errMsg || err,
84
+              icon: 'none'
85
+            })
86
+          }
87
+        })
88
+      }).catch(er => {
89
+        cancelOrder()
90
+        paying.current = false
91
+        Taro.showToast({
92
+          title: er,
93
+          icon: 'none'
94
+        })
95
+      })
96
+    }).catch(er => {
97
+      paying.current = false
98
+      Taro.showToast({
99
+        title: er,
100
+        icon: 'none'
101
+      })
102
+    })
103
+  }
104
+  
105
+  useEffect(() => {
106
+    if (user && id) {
107
+      request({ ...apis.getBillInvoiced, args: { orgId: 1, id }}).then(res => {
108
+        if (res) {
109
+          setBill(res)
110
+        }
111
+      })
112
+    }
113
+  }, [user, id])
16 114
 
17 115
   return (
18 116
     <Page>
@@ -26,7 +124,7 @@ export default function JiaoFeiDetail () {
26 124
             <view className='Detail'>
27 125
               <view className='Title flex-h'>
28 126
                 <text className='flex-item'>缴费金额</text>
29
-                <text className='Num'>300</text>
127
+                <text className='Num'>{bill.payPrice}</text>
30 128
                 <text>元</text>
31 129
               </view>
32 130
               <text>2020年5月物业管理费</text>
@@ -48,21 +146,21 @@ export default function JiaoFeiDetail () {
48 146
         </view>
49 147
         <view className='BottomContainer'>
50 148
           <text onClick={() => { setPopupType(2); setShowPopup(true) }}>对费用有疑问?</text>
51
-          <text onClick={() => { setPopupType(1); setShowPopup(true) }}>立即缴费</text>
149
+          <text onClick={handleReadyPay}>立即缴费</text>
52 150
         </view>
53 151
 
54 152
         {/* 弹窗 */}
55
-        <SlidePopup Close={() => { setShowPopup(false); setPopupType(0) }} Show={ShowPopup}>
153
+        <SlidePopup Close={handleCancelOrder} Show={ShowPopup}>
56 154
           {
57 155
             PopupType - 0 === 1 &&
58 156
             <view className='JiaoFeiPopup'>
59
-              <view className='Price'>立即支付<text>150</text>元</view>
157
+              <view className='Price'>立即支付<text>{bill.payPrice}</text>元</view>
60 158
               <view className='flex-h'>
61 159
                 <text className='iconfont iconweixinzhifu'></text>
62 160
                 <text className='flex-item'>微信支付</text>
63 161
                 <text className='iconfont icongou'></text>
64 162
               </view>
65
-              <view className='Btn'>
163
+              <view className='Btn' onClick={handlePaying}>
66 164
                 <text>去付款</text>
67 165
               </view>
68 166
             </view>

+ 20
- 0
src/utils/api.js Целия файл

@@ -65,6 +65,26 @@ const $api = {
65 65
     method: 'get',
66 66
     url: `${prefix}/bills/current_user/:type`
67 67
   },
68
+  getBillInvoiced: {
69
+    method: 'get',
70
+    url: `${prefix}/bill/:orgId/:id`
71
+  },
72
+
73
+  wxStartPay: {
74
+    method: 'post',
75
+    url: `${prefix}/wxStartPay `
76
+  },
77
+
78
+  wxCancelPay: {
79
+    method: 'get',
80
+    url: `${prefix}/wxCancelPay/:outTradeNo`
81
+  },
82
+  
83
+  wxUnifiedOrder: {
84
+    method: 'get',
85
+    url: `${prefix}/wxUnifiedOrder/:outTradeNo`
86
+  },
87
+
68 88
   getGongDanList: { // 获取小区工单列表
69 89
     method: 'get',
70 90
     url: `${prefix}/tickets/list/:orgId`

+ 68
- 0
yarn.lock Целия файл

@@ -2,6 +2,11 @@
2 2
 # yarn lockfile v1
3 3
 
4 4
 
5
+"-@^0.0.1":
6
+  version "0.0.1"
7
+  resolved "https://registry.npm.taobao.org/-/download/--0.0.1.tgz#db6db7cd866142880dd03e5b8781d1b4fac0e5bd"
8
+  integrity sha1-2223zYZhQogN0D5bh4HRtPrA5b0=
9
+
5 10
 "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.8.3":
6 11
   version "7.10.4"
7 12
   resolved "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
@@ -1783,6 +1788,11 @@
1783 1788
   resolved "https://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
1784 1789
   integrity sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=
1785 1790
 
1791
+D@^1.0.0:
1792
+  version "1.0.0"
1793
+  resolved "https://registry.npm.taobao.org/D/download/D-1.0.0.tgz#c348a4e034f72847be51206fc530fc089e9cc2a9"
1794
+  integrity sha1-w0ik4DT3KEe+USBvxTD8CJ6cwqk=
1795
+
1786 1796
 abab@^2.0.0:
1787 1797
   version "2.0.5"
1788 1798
   resolved "https://registry.npm.taobao.org/abab/download/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
@@ -1819,6 +1829,11 @@ acorn-walk@^6.0.1:
1819 1829
   resolved "https://registry.npm.taobao.org/acorn-walk/download/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
1820 1830
   integrity sha1-Ejy487hMIXHx9/slJhWxx4prGow=
1821 1831
 
1832
+acorn-walk@^8.0.0:
1833
+  version "8.0.0"
1834
+  resolved "https://registry.npm.taobao.org/acorn-walk/download/acorn-walk-8.0.0.tgz#56ae4c0f434a45fff4a125e7ea95fa9c98f67a16"
1835
+  integrity sha1-Vq5MD0NKRf/0oSXn6pX6nJj2ehY=
1836
+
1822 1837
 acorn@^6.0.1, acorn@^6.2.1:
1823 1838
   version "6.4.2"
1824 1839
   resolved "https://registry.npm.taobao.org/acorn/download/acorn-6.4.2.tgz?cache=0&sync_timestamp=1602534280466&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
@@ -1829,6 +1844,11 @@ acorn@^7.1.0, acorn@^7.1.1:
1829 1844
   resolved "https://registry.npm.taobao.org/acorn/download/acorn-7.4.1.tgz?cache=0&sync_timestamp=1602534280466&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
1830 1845
   integrity sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=
1831 1846
 
1847
+acorn@^8.0.4:
1848
+  version "8.0.4"
1849
+  resolved "https://registry.npm.taobao.org/acorn/download/acorn-8.0.4.tgz?cache=0&sync_timestamp=1602534280466&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354"
1850
+  integrity sha1-ejrkGRRmpphO7g/jQHpPOqnbg1Q=
1851
+
1832 1852
 address@^1.0.1:
1833 1853
   version "1.1.2"
1834 1854
   resolved "https://registry.npm.taobao.org/address/download/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
@@ -3073,6 +3093,11 @@ commander@^4.0.1:
3073 3093
   resolved "https://registry.npm.taobao.org/commander/download/commander-4.1.1.tgz?cache=0&sync_timestamp=1605992478790&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
3074 3094
   integrity sha1-n9YCvZNilOnp70aj9NaWQESxgGg=
3075 3095
 
3096
+commander@^6.2.0:
3097
+  version "6.2.0"
3098
+  resolved "https://registry.npm.taobao.org/commander/download/commander-6.2.0.tgz?cache=0&sync_timestamp=1605992478790&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75"
3099
+  integrity sha1-uZC/uKwDCu3G0RvATRSI/+9W23U=
3100
+
3076 3101
 commander@~2.19.0:
3077 3102
   version "2.19.0"
3078 3103
   resolved "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz?cache=0&sync_timestamp=1605992478790&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
@@ -3869,6 +3894,11 @@ dot-prop@^5.2.0:
3869 3894
   dependencies:
3870 3895
     is-obj "^2.0.0"
3871 3896
 
3897
+duplexer@^0.1.2:
3898
+  version "0.1.2"
3899
+  resolved "https://registry.npm.taobao.org/duplexer/download/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
3900
+  integrity sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY=
3901
+
3872 3902
 duplexify@^3.4.2, duplexify@^3.6.0:
3873 3903
   version "3.7.1"
3874 3904
   resolved "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
@@ -4561,6 +4591,11 @@ filename-regex@^2.0.0:
4561 4591
   resolved "https://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
4562 4592
   integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=
4563 4593
 
4594
+filesize@^6.1.0:
4595
+  version "6.1.0"
4596
+  resolved "https://registry.npm.taobao.org/filesize/download/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00"
4597
+  integrity sha1-6Bvap4DiRR1xTXHA16TzI403rQA=
4598
+
4564 4599
 fill-range@^2.1.0:
4565 4600
   version "2.2.4"
4566 4601
   resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
@@ -5025,6 +5060,13 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
5025 5060
   resolved "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
5026 5061
   integrity sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=
5027 5062
 
5063
+gzip-size@^6.0.0:
5064
+  version "6.0.0"
5065
+  resolved "https://registry.npm.taobao.org/gzip-size/download/gzip-size-6.0.0.tgz?cache=0&sync_timestamp=1605523115814&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgzip-size%2Fdownload%2Fgzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462"
5066
+  integrity sha1-BlNn/VDCOcBnHLy61b4+LusQ5GI=
5067
+  dependencies:
5068
+    duplexer "^0.1.2"
5069
+
5028 5070
 handle-thing@^2.0.0:
5029 5071
   version "2.0.1"
5030 5072
   resolved "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
@@ -7298,6 +7340,11 @@ open@7.0.2:
7298 7340
     is-docker "^2.0.0"
7299 7341
     is-wsl "^2.1.1"
7300 7342
 
7343
+opener@^1.5.2:
7344
+  version "1.5.2"
7345
+  resolved "https://registry.npm.taobao.org/opener/download/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
7346
+  integrity sha1-XTfh81B3udysQwE3InGv3rKhNZg=
7347
+
7301 7348
 opn@^5.5.0:
7302 7349
   version "5.5.0"
7303 7350
   resolved "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
@@ -10366,6 +10413,22 @@ webidl-conversions@^4.0.2:
10366 10413
   resolved "https://registry.npm.taobao.org/webidl-conversions/download/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
10367 10414
   integrity sha1-qFWYCx8LazWbodXZ+zmulB+qY60=
10368 10415
 
10416
+webpack-bundle-analyzer@^4.2.0:
10417
+  version "4.2.0"
10418
+  resolved "https://registry.npm.taobao.org/webpack-bundle-analyzer/download/webpack-bundle-analyzer-4.2.0.tgz?cache=0&sync_timestamp=1606743142206&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-bundle-analyzer%2Fdownload%2Fwebpack-bundle-analyzer-4.2.0.tgz#f19ed40e1767ab35cad78c517529596e885bf64a"
10419
+  integrity sha1-8Z7UDhdnqzXK14xRdSlZbohb9ko=
10420
+  dependencies:
10421
+    acorn "^8.0.4"
10422
+    acorn-walk "^8.0.0"
10423
+    chalk "^4.1.0"
10424
+    commander "^6.2.0"
10425
+    express "^4.17.1"
10426
+    filesize "^6.1.0"
10427
+    gzip-size "^6.0.0"
10428
+    lodash "^4.17.20"
10429
+    opener "^1.5.2"
10430
+    ws "^7.3.1"
10431
+
10369 10432
 webpack-chain@4.9.0:
10370 10433
   version "4.9.0"
10371 10434
   resolved "https://registry.npm.taobao.org/webpack-chain/download/webpack-chain-4.9.0.tgz#2f0794d34d79a7cc5db1416f497b76ad33df30ee"
@@ -10647,6 +10710,11 @@ ws@^7.0.0:
10647 10710
   resolved "https://registry.npm.taobao.org/ws/download/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7"
10648 10711
   integrity sha1-pd12okGXlA1Ki7ng4VK7RQN2Tac=
10649 10712
 
10713
+ws@^7.3.1:
10714
+  version "7.4.1"
10715
+  resolved "https://registry.npm.taobao.org/ws/download/ws-7.4.1.tgz?cache=0&sync_timestamp=1607113213006&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-7.4.1.tgz#a333be02696bd0e54cea0434e21dcc8a9ac294bb"
10716
+  integrity sha1-ozO+Amlr0OVM6gQ04h3MiprClLs=
10717
+
10650 10718
 x-is-string@^0.1.0:
10651 10719
   version "0.1.0"
10652 10720
   resolved "https://registry.npm.taobao.org/x-is-string/download/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"