HW 3 jaren geleden
bovenliggende
commit
cd4032765e

+ 1 - 1
project.config.json

@@ -2,7 +2,7 @@
   "miniprogramRoot": "./dist",
   "projectname": "kede-tool-weapp",
   "description": "科德工具小程序",
-  "appid": "touristappid",
+  "appid": "wxff2f5720ed7d7f63",
   "setting": {
     "urlCheck": true,
     "es6": false,

+ 59 - 0
src/components/common/ProgresCanvas/index.jsx

@@ -0,0 +1,59 @@
+import React, { Component } from 'react';
+import { Canvas, Text, View } from '@tarojs/components';
+import { createCanvasContext, getSystemInfoSync } from '@tarojs/taro';
+import './index.less';
+
+export default class ProgresCanvas extends Component {
+  constructor(props) {
+    super(props);
+  }
+
+  facilCanvas (id, dp, color) {
+    let query = createCanvasContext(id);
+    const drawArc = (s, e) => {
+
+      /*
+          * x:X轴绘制点
+          * y: y轴绘制点
+          * 通过x,y轴绘制点来控制你画的弧形进度条位置
+      */
+
+      let x = 98 * dp, y = 102 * dp, radius = 94 * dp;
+      query.setFillStyle('#cdcdcd');
+      query.clearRect(0, 0, 200, 200);
+      query.draw();
+      query.setLineWidth(8);
+      query.setStrokeStyle(color);
+      query.setLineCap('round');
+      query.beginPath();
+      query.arc(x, y, radius, s, e, false);
+      query.stroke();
+      query.draw();
+    };
+
+    /*
+        * step : 个数据
+        * n:总数据
+        * 最终通过 step和n之间的比值来绘制进度
+    */
+    let step = 20, n = 60, startAngle = 1.5 * Math.PI, endAngle = 0;
+    endAngle = step * 2 * Math.PI / n + 1.5 * Math.PI;
+    drawArc(startAngle, endAngle);
+  };
+
+  componentDidMount() {
+    let facility = getSystemInfoSync(); // 获取设备信息
+    let facility_width = facility.windowWidth; // 设备宽度
+    let dpr = facility_width / 750;
+
+    this.facilCanvas('visitor_canvas', dpr, '#d81e06'); // 客访次数
+  }
+
+  render() {
+    return (
+      <View>
+        <Canvas className="visitor_middle_circle" canvasId="visitor_canvas"></Canvas>
+      </View>
+    );
+  }
+}

+ 4 - 0
src/components/common/ProgresCanvas/index.less

@@ -0,0 +1,4 @@
+.visitor_middle_circle{
+  width: 200px;
+  height: 200px;
+}

+ 114 - 0
src/components/common/imagePicker/index.jsx

@@ -0,0 +1,114 @@
+import React,{Component} from "react";
+import Taro from '@tarojs/taro';
+import {View} from "@tarojs/components";
+import {AtImagePicker} from "taro-ui";
+
+import './index.less';
+
+import 'taro-ui/dist/style/components/image-picker.scss';
+import 'taro-ui/dist/style/components/icon.scss';
+
+import getBaseUrl from "../../../utils/servers/baseUrl";
+
+class ImagePicker extends Component{
+  constructor(props) {
+    super(props);
+    this.state={
+      files:[],
+      speedProgress:0,
+    }
+    this.onImgChange = this.onImgChange.bind(this);
+    this.onFail = this.onFail.bind(this);
+    this.onImageClick = this.onImageClick.bind(this);
+  }
+
+  onImgChange(files, operationType, index){
+    const BASE_URL = getBaseUrl(this.props.url);
+    let token = Taro.getStorageSync('token');
+    let _this = this;
+    let filesArr = files.concat([]);
+    if(operationType === 'remove'){
+      this.props.onChange(index,'remove');
+      this.setState({
+        files:filesArr
+      })
+    }else{
+      let fileArr = this.state.files.concat([]);
+      let arr = files.splice(fileArr.length,files.length - fileArr.length)
+      for(let i = 0;i<arr.length;i++){
+        const uploadTask = Taro.uploadFile({
+          url: BASE_URL + this.props.url, //仅为示例,非真实的接口地址
+          filePath: arr[i].url,
+          name: 'file',
+          header: {
+            'Accept':'application/json, text/javascript,',
+            'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+            'token': token
+          },
+          success: function (res){
+            let dataJson = JSON.parse(res.data)
+            if(dataJson.error.length === 0){
+              _this.props.onChange(dataJson.data,'add');
+              _this.state.files.push(filesArr[i]);
+              _this.setState({
+                files:_this.state.files
+              })
+            }else{
+              Taro.showToast({title:dataJson.error[0].message,icon:'none'})
+            }
+          },
+          fail: function (err){
+            console.log(err);
+            Taro.showToast({title:'系统错误,请稍后重试',icon:'none'});
+          },
+          complete: function(v){
+            console.log(v)
+          }
+        })
+        uploadTask.progress((res) => {
+          if(res.progress === 100){
+            let num = this.state.speedProgress+1;
+            let speed = num/files.length*100;
+            this.setState({
+              speedProgress:speed,
+            },()=>{
+              if(speed === 100){
+                setTimeout(()=>{
+                  this.setState({
+                    speedProgress:0,
+                  })
+                },800)
+              }
+            })
+          }
+          console.log('上传进度', res.progress)
+          console.log('已经上传的数据长度', res.totalBytesSent)
+          console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)
+        })
+      }
+    }
+  }
+  onFail(){
+
+  }
+  onImageClick(){
+
+  }
+
+  render() {
+    return (
+      <>
+        <AtImagePicker
+          multiple
+          mode='center'
+          files={this.state.files}
+          onChange={this.onImgChange}
+          onFail={this.onFail}
+          onImageClick={this.onImageClick}
+        />
+      </>
+    )
+  }
+}
+
+export default ImagePicker;

+ 11 - 0
src/components/common/imagePicker/index.less

@@ -0,0 +1,11 @@
+.imagePicker{
+  .speedProgress{
+    position: fixed;
+    z-index: 10000;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: rgba(0,0,0,0.6);
+  }
+}

+ 11 - 1
src/components/common/userFloatingLayer/index.jsx

@@ -10,6 +10,16 @@ import './index.less';
 class UserFloatingLayer extends Component{
   constructor(props) {
     super(props);
+    this.state={
+      userInfor:{}
+    }
+  }
+
+  componentDidMount() {
+    let userInfor = Taro.getStorageSync('userInfor');
+    this.setState({
+      userInfor
+    })
   }
 
   render() {
@@ -20,7 +30,7 @@ class UserFloatingLayer extends Component{
         </View>
         <View className='userNickName'>
           <View className='welcome'>欢迎您</View>
-          <OpenData type='userNickName'/>
+          {this.state.userInfor.name}
         </View>
       </View>
     );

+ 20 - 0
src/components/common/wxLogin/index.jsx

@@ -0,0 +1,20 @@
+import React,{Component} from "react";
+import {Button, View} from '@tarojs/components'
+
+class WxLogin extends Component{
+  constructor(props) {
+    super(props);
+  }
+
+  render() {
+    return (
+      <View className='WxLogin'>
+        <View className='content'>
+          <Button></Button>
+        </View>
+      </View>
+    )
+  }
+}
+
+export default WxLogin;

BIN
src/image/egressSelect.png


BIN
src/image/egressUnSelect.png


BIN
src/image/examineSelect.png


BIN
src/image/examineUnSelect.png


BIN
src/image/noData.png


BIN
src/image/punchClockSelect.png


BIN
src/image/punchClockUnSelect.png


+ 3 - 1
src/pages/applyDepart/enterprise.jsx

@@ -55,7 +55,8 @@ class Enterprise extends Component{
           listState: data.error[0].field === '403' ? 'NO_DATA' : 'RELOAD'
         })
         Taro.showToast({
-          title:data.error[0].message
+          title:data.error[0].message,
+          icon:'none'
         })
       }
     }).catch(()=>{
@@ -72,6 +73,7 @@ class Enterprise extends Component{
           showActionButton
           value={this.state.value}
           onChange={this.onChange}
+          onActionClick={()=>{this.onChange(this.state.value)}}
           onClear={()=>{
             this.setState({
               value:'',

+ 12 - 3
src/pages/applyDepart/index.jsx

@@ -40,7 +40,8 @@ class ApplyDepart extends Component {
     super(props);
     this.state={
       current:1,
-      enterpriseId:''
+      enterpriseInfor:{},
+      selectArrderLocation:{}
     }
   }
 
@@ -48,7 +49,7 @@ class ApplyDepart extends Component {
     Taro.eventCenter.on('enterprise', (arg) => {
       this.setState({
         current:1,
-        enterpriseId:arg.id
+        enterpriseInfor:arg
       })
     })
     Taro.eventCenter.on('enterpriseBack', () => {
@@ -56,6 +57,14 @@ class ApplyDepart extends Component {
         current:0,
       })
     })
+    //获取地区选定数据
+    const chooseLocation = requirePlugin('chooseLocation');
+    const location = chooseLocation.getLocation();
+    if(location){
+      this.setState({
+        selectArrderLocation: location
+      })
+    }
   }
 
   componentDidMount() {
@@ -76,7 +85,7 @@ class ApplyDepart extends Component {
               <Enterprise/>
             </View>
             <View style={{display:this.state.current===1 ? 'block' : 'none'}}>
-              <PublicContent id={this.state.enterpriseId}/>
+              <PublicContent enterpriseInfor={this.state.enterpriseInfor} selectArrderLocation={this.state.selectArrderLocation}/>
             </View>
             <View style={{display:this.state.current===2 ? 'block' : 'none'}}>
               <Enterprise/>

+ 118 - 23
src/pages/applyDepart/publicContent.jsx

@@ -1,46 +1,71 @@
 import React,{Component} from 'react';
-import {View} from '@tarojs/components'
+import Taro from '@tarojs/taro';
+import {Text, View} from '@tarojs/components'
+import moment from 'moment';
 
 import WPicker from '../../components/common/wPicker'
+import ImagePicker from '../../components/common/imagePicker'
 
-import { AtForm,AtButton,AtInput,AtIcon } from 'taro-ui'
+import { AtButton,AtTextarea ,AtIcon,AtCalendar   } from 'taro-ui'
+import {addPublicRelease} from '../../utils/servers/servers';
 
 import 'taro-ui/dist/style/components/form.scss';
 import 'taro-ui/dist/style/components/button.scss';
 import 'taro-ui/dist/style/components/loading.scss';
-import 'taro-ui/dist/style/components/input.scss';
 import 'taro-ui/dist/style/components/icon.scss';
 import 'taro-ui/dist/style/components/icon.scss';
+import 'taro-ui/dist/style/components/textarea.scss';
+import 'taro-ui/dist/style/components/calendar.scss';
 
 import './publicContent.less';
 
-import Taro from '@tarojs/taro';
-
 class PublicContent extends Component{
   constructor(props) {
     super(props);
     this.state={
       rangeVal:[],
-      selectArrderName:''
+      selectArrderName:'',
+      reason:'',
+      imgs:[],
+      validDates:[
+        { value: '2021/6/3' },
+        { value: '2021/6/4' },
+        { value: '2021/6/5' },
+        { value: '2021/6/6' },
+        { value: '2021/6/7' },
+        { value: '2021/6/8' },
+        { value: '2021/6/9' },
+        { value: '2021/6/10' },
+      ]
     }
     this.onSubmit = this.onSubmit.bind(this);
     this.selectArrder = this.selectArrder.bind(this);
+    this.onChange = this.onChange.bind(this);
     this.WPicker = null
   }
-
   componentDidShow() {
-    const chooseLocation = requirePlugin('chooseLocation');
-    const location = chooseLocation.getLocation();
-    console.log(location,'location')
-    if(location){
-      this.setState({
-        selectArrderName: location.name
-      })
-    }
+
   }
 
   onSubmit(){
-    console.log(this.WPicker)
+    // if(this.state.imgs.length === 0){
+    //   Taro.showToast({title:'',icon:'none'})
+    //   return ;
+    // }
+    let annexUrl = '';
+    for(let i of this.state.imgs){
+      annexUrl+=','+i;
+    }
+    addPublicRelease({
+      uid:this.props.enterpriseInfor.id,
+      releaseStarts:this.state.rangeVal[0],
+      releaseEnds:this.state.rangeVal[1],
+      remarks:this.state.reason,
+      userName: this.props.selectArrderLocation.name,
+      longitude: this.props.selectArrderLocation.longitude,
+      latitude: this.props.selectArrderLocation.latitude,
+      annexUrl: annexUrl || undefined
+    });
   }
 
   selectArrder(){
@@ -57,6 +82,19 @@ class PublicContent extends Component{
     });
   }
 
+  onChange(value,type){
+    let arr = this.state.imgs.concat([]);
+    if(type === 'add'){
+      arr.push(value)
+    }else if(type === 'remove'){
+      arr.splice(value,1)
+    }
+    this.setState({
+      imgs: arr
+    })
+    console.log(arr,type)
+  }
+
   render() {
     return (
       <View className='publicContent'>
@@ -77,7 +115,7 @@ class PublicContent extends Component{
           onRef={(ref)=>{this.WPicker = ref}}/>
           <View className='formItem'>
             <View className='formName'>外出企业:</View>
-            <View className='formValue'>{'湖南****科技有限公司'}</View>
+            <View className='formValue'>{this.props.enterpriseInfor.name}</View>
           </View>
         <View className='formItem'>
           <View className='formName'>公出时间:</View>
@@ -86,20 +124,77 @@ class PublicContent extends Component{
             <AtIcon value='chevron-right' size='30' color='#bbbbbb'/>
           </View>
         </View>
+        <View className='formItem' style={{display:'block',paddingTop:'15px'}}>
+          <View className='formName'>公出日期:</View>
+          <AtCalendar
+            minDate='2021/6/3'
+            maxDate='2021/6/10'
+            isSwiper={false}
+            validDates={this.state.validDates}
+            onDayLongClick={(item)=>{
+              console.log(item)
+              let index = this.state.validDates.findIndex(v=>{
+                let lv = moment(v.value.split('/')).isSame(item.value.split('-'));
+                return lv
+              })
+              if(index<0){
+                console.log(item,'console.log(item)')
+                let arr = item.value.split('-');
+                this.state.validDates.push(arr.join('/'))
+                this.setState({
+                  validDates:this.state.validDates
+                })
+              }else{
+                this.state.validDates.splice(index,1)
+                this.setState({
+                  validDates:this.state.validDates
+                })
+              }
+            }}
+          />
+        </View>
         <View className='formItem'>
           <View className='formName'>公出地点:</View>
           <View className='formValue' onClick={this.selectArrder}>
-            <View>
-              {this.state.selectArrderName}
+              <Text className='formValueText'>{this.props.selectArrderLocation.name}</Text>
               <AtIcon value='chevron-right' size='30' color='#bbbbbb'/>
-            </View>
           </View>
         </View>
         <View className='tips'>地址选择错误,将影响打卡定位,选择后请认真核对</View>
-          <AtButton onClick={()=>{
+        <View className='formItem' style={{display:'block',paddingTop:'15px'}}>
+          <View className='formName'>公出事由:</View>
+          <View className='formValue' style={{paddingTop:'10px',textAlign:'left'}}>
+            <AtTextarea
+              value={this.state.reason}
+              onChange={(v)=>{
+                this.setState({
+                  reason:v
+                })
+              }}
+              maxLength={200}
+              placeholder='请输入公出事由'
+            />
+          </View>
+        </View>
+        <View className='formItem' style={{display:'block'}}>
+          <View className='formName'>附件:</View>
+          <View className='formValue' style={{paddingTop:'10px',textAlign:'left'}}>
+            <ImagePicker
+              url='/api/admin/release/upload'
+              onChange={this.onChange}
+            />
+          </View>
+        </View>
+        <View className='operation'>
+          <AtButton type='secondary' circle onClick={()=>{
             Taro.eventCenter.trigger('enterpriseBack')
-          }}>上一步</AtButton>
-          <AtButton onClick={this.onSubmit}>提交申请</AtButton>
+          }}>
+            上一步
+          </AtButton>
+          <AtButton type='primary' circle onClick={this.onSubmit}>
+            提交申请
+          </AtButton>
+        </View>
       </View>
     )
   }

+ 15 - 0
src/pages/applyDepart/publicContent.less

@@ -11,6 +11,17 @@
     .formValue{
       text-align: right;
       flex: 1;
+      display: flex;
+      flex-flow: row nowrap;
+      align-items: center;
+      justify-content: flex-end;
+      .formValueText{
+        display: block;
+        width: 452px;
+        text-overflow: ellipsis;
+        overflow: hidden;
+        white-space: nowrap;
+      }
     }
   }
   .tips{
@@ -18,4 +29,8 @@
     text-align: left;
     color: #f00;
   }
+  .operation{
+    display: flex;
+    flex-flow: row nowrap;
+  }
 }

+ 68 - 6
src/pages/login/index.jsx

@@ -1,8 +1,9 @@
 import { Component } from 'react'
 import Taro from '@tarojs/taro'
 import { connect } from 'react-redux'
-import {View, Map, Button, Input} from '@tarojs/components'
+import {View, Button, Input} from '@tarojs/components'
 import {login} from '../../utils/servers/servers';
+import {setOpenId} from '../../utils/servers/servers';
 
 import { add, minus, asyncAdd } from '../../actions/counter'
 
@@ -41,6 +42,45 @@ class Login extends Component {
   }
 
   login(){
+    // Taro.getSetting({
+    //   withSubscriptions: true,
+    //   success:(res)=>{
+    //     console.log(res.subscriptionsSetting,'res.subscriptionsSetting')
+    //     if(res.subscriptionsSetting.mainSwitch){
+    //       // res.subscriptionsSetting = {
+    //       //   mainSwitch: true, // 订阅消息总开关
+    //       //   itemSettings: {   // 每一项开关
+    //       //     SYS_MSG_TYPE_RANK: 'accept',
+    //       //     'pWia-KJPFwDM8ReDu_BOa2_42G7W2hXB16sUDbSxpcM': 'accept',
+    //       //     'j7WH3EwQnxGxwuV2HwmJhryxySPE8vOiV5cVOpp-42I': 'accept',
+    //       //     'vo28uzT2sLS-9ioroNyZbMSvu0mMvf6le2pDZVN891U': 'accept',
+    //       //   }
+    //       // }
+    //       Taro.requestSubscribeMessage({ //获取下发权限
+    //         tmplIds: [
+    //           'pWia-KJPFwDM8ReDu_BOa2_42G7W2hXB16sUDbSxpcM',
+    //           'j7WH3EwQnxGxwuV2HwmJhryxySPE8vOiV5cVOpp-42I',
+    //           'vo28uzT2sLS-9ioroNyZbMSvu0mMvf6le2pDZVN891U'
+    //         ], //此处写在后台获取的模板ID,可以写多个模板ID,看自己的需求
+    //          success: function (s) {
+    //           console.log(s)
+    //         },
+    //         fail: function (err) {
+    //           console.log(err)
+    //         }
+    //       })
+    //     }else if(res.subscriptionsSetting.mainSwitch.itemSettings){
+    //       console.log(res)
+    //     }else{
+    //       Taro.requestSubscribeMessage({
+    //         tmplIds: ['SLb0P5wDArFZU05iMrrnNEsXZ7H2wArqdY8__4M1NUUM'],
+    //         success : (res) => {
+    //
+    //         }
+    //       })
+    //     }
+    //   }
+    // })
     if(!this.state.username){
       Taro.showToast({
         title: '请输入用户名',
@@ -63,14 +103,36 @@ class Login extends Component {
     login({
       username:this.state.username,
       password:this.state.password
-    }).then(()=>{
+    }).then((msg)=>{
       this.setState({
         loading:false
       });
-      Taro.switchTab({
-        url: '/pages/applyDepart/index',
-      })
-    }).catch(()=>{
+      if(!msg.data.openId){
+        Taro.login({
+          success: (res)=>{
+            setOpenId({
+              code:res.code,
+            }).then(v=>{
+              if(v.error.length === 0){
+                Taro.switchTab({
+                  url: '/pages/applyDepart/index',
+                })
+              }else{
+                Taro.showToast({title:v.error[0].message})
+              }
+            })
+          },
+          fail:()=>{
+            Taro.showToast({title:'系统错误,请稍后重试'})
+          }
+        });
+      }else{
+        Taro.switchTab({
+          url: '/pages/applyDepart/index',
+        })
+      }
+    }).catch((err)=>{
+      console.log(err)
       this.setState({
         loading:false
       })

+ 2 - 2
src/utils/servers/baseUrl.js

@@ -2,10 +2,10 @@ const getBaseUrl = (url) => {
   let BASE_URL = '';
   if (process.env.NODE_ENV === 'development') {
     //开发环境 - 根据请求不同返回不同的BASE_URL
-    BASE_URL = 'http://uat.jishutao.com'
+    BASE_URL = 'http://172.16.0.188:8080'
   } else {
     // 生产环境
-    BASE_URL = 'http://uat.jishutao.com'
+    BASE_URL = 'http://172.16.0.188:8080'
   }
   return BASE_URL
 }

+ 8 - 1
src/utils/servers/servers.js

@@ -18,7 +18,7 @@ export const login = (res) => {
         Taro.setStorageSync('token', msg.token);
         Taro.setStorageSync('userInfor', msg.data);
         Taro.showToast({title:'登录成功',icon:'success'})
-        resolve();
+        resolve(msg);
       }else{
         Taro.showToast({title:msg.error[0].message,icon:'none'})
         reject();
@@ -36,6 +36,13 @@ export const getUserByName = (postData = {}) => {
   return HTTPREQUEST.get('/api/admin/customer/getUserByName', postData)
 }
 
+export const addPublicRelease = (postData = {}) => {
+  return HTTPREQUEST.post('/api/admin/release/addPublicRelease', postData)
+}
+
+export const setOpenId = (postData = {}) => {
+  return HTTPREQUEST.post('/api/admin/setOpenId', postData)
+}
 
 //测试
 export const test = (postData = {}) => {

+ 525 - 13
yarn-error.log

@@ -1,5 +1,5 @@
 Arguments: 
-  C:\Program Files\nodejs\node.exe C:\Program Files (x86)\Yarn\bin\yarn.js
+  C:\Program Files\nodejs\node.exe C:\Program Files (x86)\Yarn\bin\yarn.js add moment
 
 PATH: 
   F:\HWFiles\kede-tool-weapp\node_modules\.bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Git\cmd;C:\Windows\System32;C:\Program Files\TortoiseGit\bin;C:\Program Files (x86)\Yarn\bin\;C:\Program Files\nodejs\;D:\Microsoft VS Code\bin;C:\Users\Administrator\AppData\Local\Yarn\bin;C:\Users\Administrator\AppData\Roaming\npm
@@ -14,12 +14,7 @@ Platform:
   win32 x64
 
 Trace: 
-  SyntaxError: F:\HWFiles\kede-tool-weapp\package.json: Unexpected token } in JSON at position 1521
-      at JSON.parse (<anonymous>)
-      at C:\Program Files (x86)\Yarn\lib\cli.js:1625:59
-      at Generator.next (<anonymous>)
-      at step (C:\Program Files (x86)\Yarn\lib\cli.js:310:30)
-      at C:\Program Files (x86)\Yarn\lib\cli.js:321:13
+  Error: EPERM: operation not permitted, unlink 'F:\HWFiles\kede-tool-weapp\node_modules\node-sass\vendor\win32-x64-72\binding.node'
 
 npm manifest: 
   {
@@ -71,7 +66,7 @@ npm manifest:
       "react-redux": "^7.2.0",
       "redux": "^4.0.0",
       "redux-logger": "^3.0.6",
-      "redux-thunk": "^2.3.0",
+      "redux-thunk": "^2.3.0"
     },
     "devDependencies": {
       "@babel/core": "^7.8.0",
@@ -98,6 +93,40 @@ Lockfile:
   # yarn lockfile v1
   
   
+  "@ant-design/colors@^6.0.0":
+    version "6.0.0"
+    resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298"
+    integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==
+    dependencies:
+      "@ctrl/tinycolor" "^3.4.0"
+  
+  "@ant-design/icons-svg@^4.0.0":
+    version "4.1.0"
+    resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz#480b025f4b20ef7fe8f47d4a4846e4fee84ea06c"
+    integrity sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ==
+  
+  "@ant-design/icons@^4.6.2":
+    version "4.6.2"
+    resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.6.2.tgz#290f2e8cde505ab081fda63e511e82d3c48be982"
+    integrity sha512-QsBG2BxBYU/rxr2eb8b2cZ4rPKAPBpzAR+0v6rrZLp/lnyvflLH3tw1vregK+M7aJauGWjIGNdFmUfpAOtw25A==
+    dependencies:
+      "@ant-design/colors" "^6.0.0"
+      "@ant-design/icons-svg" "^4.0.0"
+      "@babel/runtime" "^7.11.2"
+      classnames "^2.2.6"
+      rc-util "^5.9.4"
+  
+  "@ant-design/react-slick@~0.28.1":
+    version "0.28.3"
+    resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.28.3.tgz#ad5cf1cf50363c1a3842874d69d0ce1f26696e71"
+    integrity sha512-u3onF2VevGRbkGbgpldVX/nzd7LFtLeZJE0x2xIFT2qYHKkJZ6QT/jQ7KqYK4UpeTndoyrbMqLN4DiJza4BVBg==
+    dependencies:
+      "@babel/runtime" "^7.10.4"
+      classnames "^2.2.5"
+      json2mq "^0.2.0"
+      lodash "^4.17.21"
+      resize-observer-polyfill "^1.5.0"
+  
   "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13":
     version "7.12.13"
     resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
@@ -1024,7 +1053,7 @@ Lockfile:
     dependencies:
       regenerator-runtime "^0.13.4"
   
-  "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
+  "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
     version "7.14.0"
     resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6"
     integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==
@@ -1062,6 +1091,11 @@ Lockfile:
       "@babel/helper-validator-identifier" "^7.14.0"
       to-fast-properties "^2.0.0"
   
+  "@ctrl/tinycolor@^3.4.0":
+    version "3.4.0"
+    resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz#c3c5ae543c897caa9c2a68630bed355be5f9990f"
+    integrity sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ==
+  
   "@hapi/address@^4.0.1":
     version "4.1.0"
     resolved "https://registry.yarnpkg.com/@hapi/address/-/address-4.1.0.tgz#d60c5c0d930e77456fdcde2598e77302e2955e1d"
@@ -1934,6 +1968,54 @@ Lockfile:
     dependencies:
       color-convert "^2.0.1"
   
+  antd@^4.16.1:
+    version "4.16.1"
+    resolved "https://registry.yarnpkg.com/antd/-/antd-4.16.1.tgz#7e6bcd24a8b7afb0e0c96239bc3a986ef3958167"
+    integrity sha512-v7KfUYvEAiqfTECKC4/VkpRPB/4RRxZLR3b2kKCYEtcj4nEHvsOKfO5CDbWVtSUmCehxOXNR2lV+UNy06KHBnA==
+    dependencies:
+      "@ant-design/colors" "^6.0.0"
+      "@ant-design/icons" "^4.6.2"
+      "@ant-design/react-slick" "~0.28.1"
+      "@babel/runtime" "^7.12.5"
+      array-tree-filter "^2.1.0"
+      classnames "^2.2.6"
+      copy-to-clipboard "^3.2.0"
+      lodash "^4.17.21"
+      moment "^2.25.3"
+      rc-cascader "~1.4.0"
+      rc-checkbox "~2.3.0"
+      rc-collapse "~3.1.0"
+      rc-dialog "~8.5.1"
+      rc-drawer "~4.3.0"
+      rc-dropdown "~3.2.0"
+      rc-field-form "~1.20.0"
+      rc-image "~5.2.4"
+      rc-input-number "~7.1.0"
+      rc-mentions "~1.6.1"
+      rc-menu "~9.0.9"
+      rc-motion "^2.4.0"
+      rc-notification "~4.5.7"
+      rc-pagination "~3.1.6"
+      rc-picker "~2.5.10"
+      rc-progress "~3.1.0"
+      rc-rate "~2.9.0"
+      rc-resize-observer "^1.0.0"
+      rc-select "~12.1.6"
+      rc-slider "~9.7.1"
+      rc-steps "~4.1.0"
+      rc-switch "~3.2.0"
+      rc-table "~7.15.1"
+      rc-tabs "~11.9.1"
+      rc-textarea "~0.3.0"
+      rc-tooltip "~5.1.1"
+      rc-tree "~4.1.0"
+      rc-tree-select "~4.3.0"
+      rc-trigger "^5.2.1"
+      rc-upload "~4.3.0"
+      rc-util "^5.13.1"
+      scroll-into-view-if-needed "^2.2.25"
+      warning "^4.0.3"
+  
   anymatch@^2.0.0:
     version "2.0.0"
     resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@@ -2033,6 +2115,11 @@ Lockfile:
       get-intrinsic "^1.1.1"
       is-string "^1.0.5"
   
+  array-tree-filter@^2.1.0:
+    version "2.1.0"
+    resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190"
+    integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==
+  
   array-union@^1.0.1:
     version "1.0.2"
     resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
@@ -2151,6 +2238,11 @@ Lockfile:
     resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
     integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
   
+  async-validator@^3.0.3:
+    version "3.5.2"
+    resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.5.2.tgz#68e866a96824e8b2694ff7a831c1a25c44d5e500"
+    integrity sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==
+  
   async@^2.5.0, async@^2.6.2:
     version "2.6.3"
     resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
@@ -2882,7 +2974,7 @@ Lockfile:
       isobject "^3.0.0"
       static-extend "^0.1.1"
   
-  classnames@^2.2.5:
+  classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6:
     version "2.3.1"
     resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e"
     integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==
@@ -3070,6 +3162,11 @@ Lockfile:
       safe-buffer "5.1.2"
       vary "~1.1.2"
   
+  compute-scroll-into-view@^1.0.17:
+    version "1.0.17"
+    resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab"
+    integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==
+  
   concat-map@0.0.1:
     version "0.0.1"
     resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -3168,6 +3265,13 @@ Lockfile:
     resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
     integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
   
+  copy-to-clipboard@^3.2.0:
+    version "3.3.1"
+    resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae"
+    integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==
+    dependencies:
+      toggle-selection "^1.0.6"
+  
   copy-webpack-plugin@5.1.1:
     version "5.1.1"
     resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88"
@@ -3504,7 +3608,12 @@ Lockfile:
       whatwg-mimetype "^2.2.0"
       whatwg-url "^7.0.0"
   
-  dayjs@^1.10.4:
+  date-fns@^2.15.0:
+    version "2.22.1"
+    resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.22.1.tgz#1e5af959831ebb1d82992bf67b765052d8f0efc4"
+    integrity sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg==
+  
+  dayjs@^1.10.4, dayjs@^1.7.7:
     version "1.10.4"
     resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2"
     integrity sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==
@@ -3760,6 +3869,11 @@ Lockfile:
     dependencies:
       esutils "^2.0.2"
   
+  dom-align@^1.7.0:
+    version "1.12.2"
+    resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b"
+    integrity sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg==
+  
   dom-converter@^0.2:
     version "0.2.0"
     resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
@@ -6039,6 +6153,13 @@ Lockfile:
     resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
     integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
   
+  json2mq@^0.2.0:
+    version "0.2.0"
+    resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a"
+    integrity sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=
+    dependencies:
+      string-convert "^0.2.0"
+  
   json3@^3.3.2:
     version "3.3.3"
     resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81"
@@ -6331,7 +6452,7 @@ Lockfile:
     resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
     integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
   
-  lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.3, lodash@^4.17.4, lodash@~4.17.10:
+  lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4, lodash@~4.17.10:
     version "4.17.21"
     resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
     integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -6804,6 +6925,11 @@ Lockfile:
     resolved "https://registry.yarnpkg.com/mobile-detect/-/mobile-detect-1.4.5.tgz#da393c3c413ca1a9bcdd9ced653c38281c0fb6ad"
     integrity sha512-yc0LhH6tItlvfLBugVUEtgawwFU2sIe+cSdmRJJCTMZ5GEJyLxNyC/NIOAOGk67Fa8GNpOttO3Xz/1bHpXFD/g==
   
+  moment@^2.24.0, moment@^2.25.3:
+    version "2.29.1"
+    resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
+    integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
+  
   move-concurrently@^1.0.1:
     version "1.0.1"
     resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
@@ -8170,6 +8296,348 @@ Lockfile:
       iconv-lite "0.4.24"
       unpipe "1.0.0"
   
+  rc-align@^4.0.0:
+    version "4.0.9"
+    resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.9.tgz#46d8801c4a139ff6a65ad1674e8efceac98f85f2"
+    integrity sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "2.x"
+      dom-align "^1.7.0"
+      rc-util "^5.3.0"
+      resize-observer-polyfill "^1.5.1"
+  
+  rc-cascader@~1.4.0:
+    version "1.4.3"
+    resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-1.4.3.tgz#d91b0dcf8157b60ebe9ec3e58b4db054d5299464"
+    integrity sha512-Q4l9Mv8aaISJ+giVnM9IaXxDeMqHUGLvi4F+LksS6pHlaKlN4awop/L+IMjIXpL+ug/ojaCyv/ixcVopJYYCVA==
+    dependencies:
+      "@babel/runtime" "^7.12.5"
+      array-tree-filter "^2.1.0"
+      rc-trigger "^5.0.4"
+      rc-util "^5.0.1"
+      warning "^4.0.1"
+  
+  rc-checkbox@~2.3.0:
+    version "2.3.2"
+    resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-2.3.2.tgz#f91b3678c7edb2baa8121c9483c664fa6f0aefc1"
+    integrity sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.1"
+  
+  rc-collapse@~3.1.0:
+    version "3.1.1"
+    resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.1.1.tgz#2421d454e85781d1cf2f04f906918e0677d779e6"
+    integrity sha512-/oetKApTHzGGeR8Q8vD168EXkCs2MpEIrURGyy2D+LrrJd29LY/huuIMvOiJoSV6W3bcGhJqIdgHtg1Dxn1smA==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "2.x"
+      rc-motion "^2.3.4"
+      rc-util "^5.2.1"
+      shallowequal "^1.1.0"
+  
+  rc-dialog@~8.5.0, rc-dialog@~8.5.1:
+    version "8.5.2"
+    resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.5.2.tgz#530e289c25a31c15c85a0e8a4ba3f33414bff418"
+    integrity sha512-3n4taFcjqhTE9uNuzjB+nPDeqgRBTEGBfe46mb1e7r88DgDo0lL4NnxY/PZ6PJKd2tsCt+RrgF/+YeTvJ/Thsw==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.6"
+      rc-motion "^2.3.0"
+      rc-util "^5.6.1"
+  
+  rc-drawer@~4.3.0:
+    version "4.3.1"
+    resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-4.3.1.tgz#356333a7af01b777abd685c96c2ce62efb44f3f3"
+    integrity sha512-GMfFy4maqxS9faYXEhQ+0cA1xtkddEQzraf6SAdzWbn444DrrLogwYPk1NXSpdXjLCLxgxOj9MYtyYG42JsfXg==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.6"
+      rc-util "^5.7.0"
+  
+  rc-dropdown@^3.2.0, rc-dropdown@~3.2.0:
+    version "3.2.0"
+    resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-3.2.0.tgz#da6c2ada403842baee3a9e909a0b1a91ba3e1090"
+    integrity sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.6"
+      rc-trigger "^5.0.4"
+  
+  rc-field-form@~1.20.0:
+    version "1.20.1"
+    resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.20.1.tgz#d1c51888107cf075b42704b7b575bef84c359291"
+    integrity sha512-f64KEZop7zSlrG4ef/PLlH12SLn6iHDQ3sTG+RfKBM45hikwV1i8qMf53xoX12NvXXWg1VwchggX/FSso4bWaA==
+    dependencies:
+      "@babel/runtime" "^7.8.4"
+      async-validator "^3.0.3"
+      rc-util "^5.8.0"
+  
+  rc-image@~5.2.4:
+    version "5.2.4"
+    resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-5.2.4.tgz#ff1059f937bde6ca918c6f1beb316beba911f255"
+    integrity sha512-kWOjhZC1OoGKfvWqtDoO9r8WUNswBwnjcstI6rf7HMudz0usmbGvewcWqsOhyaBRJL9+I4eeG+xiAoxV1xi75Q==
+    dependencies:
+      "@babel/runtime" "^7.11.2"
+      classnames "^2.2.6"
+      rc-dialog "~8.5.0"
+      rc-util "^5.0.6"
+  
+  rc-input-number@~7.1.0:
+    version "7.1.3"
+    resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-7.1.3.tgz#152872d77bf0958980017127622772db652924c0"
+    integrity sha512-o7/YTXAnxio53lCV402OcFRn8/jcm6YfKjCzPd+al0drQ7oyQkjQqcWbacSQwwN4gCHmqXGfgnRuAuBHoYz1dw==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.5"
+      rc-util "^5.9.8"
+  
+  rc-mentions@~1.6.1:
+    version "1.6.1"
+    resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-1.6.1.tgz#46035027d64aa33ef840ba0fbd411871e34617ae"
+    integrity sha512-LDzGI8jJVGnkhpTZxZuYBhMz3avcZZqPGejikchh97xPni/g4ht714Flh7DVvuzHQ+BoKHhIjobHnw1rcP8erg==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.6"
+      rc-menu "^9.0.0"
+      rc-textarea "^0.3.0"
+      rc-trigger "^5.0.4"
+      rc-util "^5.0.1"
+  
+  rc-menu@^9.0.0, rc-menu@~9.0.9:
+    version "9.0.10"
+    resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.0.10.tgz#59fde6442c138dc60693fbe02ea50c33c8164f38"
+    integrity sha512-wb7fZZ3f5KBqr7v3q8U1DB5K4SEm31KLPe/aANyrHajVJjQpiiGTMLF7ZB7vyqjC4QJq0SJewB4FkumT2U86fw==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "2.x"
+      rc-motion "^2.4.3"
+      rc-overflow "^1.2.0"
+      rc-trigger "^5.1.2"
+      rc-util "^5.12.0"
+      shallowequal "^1.1.0"
+  
+  rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.2.0, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.0, rc-motion@^2.4.3:
+    version "2.4.3"
+    resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.4.3.tgz#2afd129da8764ee0372ba83442949d8ecb1c7ad2"
+    integrity sha512-GZLLFXHl/VqTfI7bSZNNZozcblNmDka1AAoQig7EZ6s0rWg5y0RlgrcHWO+W+nrOVbYfJDxoaQUoP2fEmvCWmA==
+    dependencies:
+      "@babel/runtime" "^7.11.1"
+      classnames "^2.2.1"
+      rc-util "^5.2.1"
+  
+  rc-notification@~4.5.7:
+    version "4.5.7"
+    resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-4.5.7.tgz#265e6e6a0c1a0fac63d6abd4d832eb8ff31522f1"
+    integrity sha512-zhTGUjBIItbx96SiRu3KVURcLOydLUHZCPpYEn1zvh+re//Tnq/wSxN4FKgp38n4HOgHSVxcLEeSxBMTeBBDdw==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "2.x"
+      rc-motion "^2.2.0"
+      rc-util "^5.0.1"
+  
+  rc-overflow@^1.0.0, rc-overflow@^1.2.0:
+    version "1.2.1"
+    resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.2.1.tgz#ea13f1e2ec152d8adcfc3bf1e53fa2b62a1d2cff"
+    integrity sha512-TCB8QiEnmNUbsJZX1GU8ZvIgVxk42eu3yaRdDZc2HFjVeT3HBSfscVaCVzBuH3NR5IWrQLodI0p6MZEGFn+KiA==
+    dependencies:
+      "@babel/runtime" "^7.11.1"
+      classnames "^2.2.1"
+      rc-resize-observer "^1.0.0"
+      rc-util "^5.5.1"
+  
+  rc-pagination@~3.1.6:
+    version "3.1.6"
+    resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.1.6.tgz#db3c06e50270b52fe272ac527c1fdc2c8d28af1f"
+    integrity sha512-Pb2zJEt8uxXzYCWx/2qwsYZ3vSS9Eqdw0cJBli6C58/iYhmvutSBqrBJh51Z5UzYc5ZcW5CMeP5LbbKE1J3rpw==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.1"
+  
+  rc-picker@~2.5.10:
+    version "2.5.10"
+    resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.5.10.tgz#0db17c535a37abbe5d016bdcdfb13d6626f802d0"
+    integrity sha512-d2or2jql9SSY8CaRPybpbKkXBq3bZ6g88UKyWQZBLTCrc92Xm87RfRC/P3UEQo/CLmia3jVF7IXVi1HmNe2DZA==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.1"
+      date-fns "^2.15.0"
+      moment "^2.24.0"
+      rc-trigger "^5.0.4"
+      rc-util "^5.4.0"
+      shallowequal "^1.1.0"
+  
+  rc-progress@~3.1.0:
+    version "3.1.4"
+    resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.1.4.tgz#66040d0fae7d8ced2b38588378eccb2864bad615"
+    integrity sha512-XBAif08eunHssGeIdxMXOmRQRULdHaDdIFENQ578CMb4dyewahmmfJRyab+hw4KH4XssEzzYOkAInTLS7JJG+Q==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.6"
+  
+  rc-rate@~2.9.0:
+    version "2.9.1"
+    resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.9.1.tgz#e43cb95c4eb90a2c1e0b16ec6614d8c43530a731"
+    integrity sha512-MmIU7FT8W4LYRRHJD1sgG366qKtSaKb67D0/vVvJYR0lrCuRrCiVQ5qhfT5ghVO4wuVIORGpZs7ZKaYu+KMUzA==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.5"
+      rc-util "^5.0.1"
+  
+  rc-resize-observer@^1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz#97fb89856f62fec32ab6e40933935cf58e2e102d"
+    integrity sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.1"
+      rc-util "^5.0.0"
+      resize-observer-polyfill "^1.5.1"
+  
+  rc-select@^12.0.0, rc-select@~12.1.6:
+    version "12.1.10"
+    resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-12.1.10.tgz#66ce43192751190b7c0e9a0ab1ef79606421ce30"
+    integrity sha512-LQdUhYncvcULlrNcAShYicc1obPtnNK7/rvCD+YCm0b2BLLYxl3M3b/HOX6o+ppPej+yZulkUPeU6gcgcp9nag==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "2.x"
+      rc-motion "^2.0.1"
+      rc-overflow "^1.0.0"
+      rc-trigger "^5.0.4"
+      rc-util "^5.9.8"
+      rc-virtual-list "^3.2.0"
+  
+  rc-slider@~9.7.1:
+    version "9.7.2"
+    resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.7.2.tgz#282f571f7582752ebaa33964e441184f4e79ad74"
+    integrity sha512-mVaLRpDo6otasBs6yVnG02ykI3K6hIrLTNfT5eyaqduFv95UODI9PDS6fWuVVehVpdS4ENgOSwsTjrPVun+k9g==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.5"
+      rc-tooltip "^5.0.1"
+      rc-util "^5.0.0"
+      shallowequal "^1.1.0"
+  
+  rc-steps@~4.1.0:
+    version "4.1.3"
+    resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-4.1.3.tgz#208580e22db619e3830ddb7fa41bc886c65d9803"
+    integrity sha512-GXrMfWQOhN3sVze3JnzNboHpQdNHcdFubOETUHyDpa/U3HEKBZC3xJ8XK4paBgF4OJ3bdUVLC+uBPc6dCxvDYA==
+    dependencies:
+      "@babel/runtime" "^7.10.2"
+      classnames "^2.2.3"
+      rc-util "^5.0.1"
+  
+  rc-switch@~3.2.0:
+    version "3.2.2"
+    resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-3.2.2.tgz#d001f77f12664d52595b4f6fb425dd9e66fba8e8"
+    integrity sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.1"
+      rc-util "^5.0.1"
+  
+  rc-table@~7.15.1:
+    version "7.15.2"
+    resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.15.2.tgz#f6ab73b2cfb1c76f3cf9682c855561423c6b5b22"
+    integrity sha512-TAs7kCpIZwc2mtvD8CMrXSM6TqJDUsy0rUEV1YgRru33T8bjtAtc+9xW/KC1VWROJlHSpU0R0kXjFs9h/6+IzQ==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.5"
+      rc-resize-observer "^1.0.0"
+      rc-util "^5.13.0"
+      shallowequal "^1.1.0"
+  
+  rc-tabs@~11.9.1:
+    version "11.9.1"
+    resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.9.1.tgz#5b2e74da9a276978c2172ef9a05ae8af14da74cb"
+    integrity sha512-CLNx3qaWnO8KBWPd+7r52Pfk0MoPyKtlr+2ltWq2I9iqAjd1nZu6iBpQP7wbWBwIomyeFNw/WjHdRN7VcX5Qtw==
+    dependencies:
+      "@babel/runtime" "^7.11.2"
+      classnames "2.x"
+      rc-dropdown "^3.2.0"
+      rc-menu "^9.0.0"
+      rc-resize-observer "^1.0.0"
+      rc-util "^5.5.0"
+  
+  rc-textarea@^0.3.0, rc-textarea@~0.3.0:
+    version "0.3.4"
+    resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-0.3.4.tgz#1408a64c87b5e76db5c847699ef9ab5ee97dd6f9"
+    integrity sha512-ILUYx831ZukQPv3m7R4RGRtVVWmL1LV4ME03L22mvT56US0DGCJJaRTHs4vmpcSjFHItph5OTmhodY4BOwy81A==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.1"
+      rc-resize-observer "^1.0.0"
+      rc-util "^5.7.0"
+  
+  rc-tooltip@^5.0.1, rc-tooltip@~5.1.1:
+    version "5.1.1"
+    resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-5.1.1.tgz#94178ed162d0252bc4993b725f5dc2ac0fccf154"
+    integrity sha512-alt8eGMJulio6+4/uDm7nvV+rJq9bsfxFDCI0ljPdbuoygUscbsMYb6EQgwib/uqsXQUvzk+S7A59uYHmEgmDA==
+    dependencies:
+      "@babel/runtime" "^7.11.2"
+      rc-trigger "^5.0.0"
+  
+  rc-tree-select@~4.3.0:
+    version "4.3.2"
+    resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-4.3.2.tgz#94031e36c819ae23e5154953538d00cc316a7fc0"
+    integrity sha512-tkouzhl8OpbTg4C9tVuP8nJ5jiZS7/wiusOIcFVgswhs1V3Jc+XHMKpLhR01egJ1bgsW1A6VrVCz3udxtdJSDA==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "2.x"
+      rc-select "^12.0.0"
+      rc-tree "^4.0.0"
+      rc-util "^5.0.5"
+  
+  rc-tree@^4.0.0, rc-tree@~4.1.0:
+    version "4.1.5"
+    resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-4.1.5.tgz#734ab1bfe835e78791be41442ca0e571147ab6fa"
+    integrity sha512-q2vjcmnBDylGZ9/ZW4F9oZMKMJdbFWC7um+DAQhZG1nqyg1iwoowbBggUDUaUOEryJP+08bpliEAYnzJXbI5xQ==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "2.x"
+      rc-motion "^2.0.1"
+      rc-util "^5.0.0"
+      rc-virtual-list "^3.0.1"
+  
+  rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.1:
+    version "5.2.8"
+    resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.2.8.tgz#27c8291c24518b8f11d76c848f5424e0c429e94a"
+    integrity sha512-Tn84oGmvNBLXI+ptpzxyJx4ArKTduuB6l74ShDLhDaJaF9f5JAMizfx31L30ELVIzRr3Ze4sekG7rzwPGwVOdw==
+    dependencies:
+      "@babel/runtime" "^7.11.2"
+      classnames "^2.2.6"
+      rc-align "^4.0.0"
+      rc-motion "^2.0.0"
+      rc-util "^5.5.0"
+  
+  rc-upload@~4.3.0:
+    version "4.3.0"
+    resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.3.0.tgz#2fbbd11242f730802b900c09b469f28437bac0ff"
+    integrity sha512-wDXf1ZdUTwBIfagTof1MJDjOHZ6xluD0xcgojYZeAZSi+3Doyc21jNV8bRIeK5jx/OQmllrpQp1/MWKkqvkBhg==
+    dependencies:
+      "@babel/runtime" "^7.10.1"
+      classnames "^2.2.5"
+      rc-util "^5.2.0"
+  
+  rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.5, rc-util@^5.0.6, rc-util@^5.0.7, rc-util@^5.12.0, rc-util@^5.13.0, rc-util@^5.13.1, rc-util@^5.2.0, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.4.0, rc-util@^5.5.0, rc-util@^5.5.1, rc-util@^5.6.1, rc-util@^5.7.0, rc-util@^5.8.0, rc-util@^5.9.4, rc-util@^5.9.8:
+    version "5.13.1"
+    resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.13.1.tgz#03e74955b5c46a58cbc6236e4d30dd462c755290"
+    integrity sha512-Dws2tjXBBihfjVQFlG5JzZ/5O3Wutctm0W94Wb1+M7GD2roWJPrQdSa4AkWm2pn0Ms32zoVPPkWodFeAYZPLfA==
+    dependencies:
+      "@babel/runtime" "^7.12.5"
+      react-is "^16.12.0"
+      shallowequal "^1.1.0"
+  
+  rc-virtual-list@^3.0.1, rc-virtual-list@^3.2.0:
+    version "3.2.6"
+    resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.2.6.tgz#2c92a40f4425e19881b38134d6bd286a11137d2d"
+    integrity sha512-8FiQLDzm3c/tMX0d62SQtKDhLH7zFlSI6pWBAPt+TUntEqd3Lz9zFAmpvTu8gkvUom/HCsDSZs4wfV4wDPWC0Q==
+    dependencies:
+      classnames "^2.2.6"
+      rc-resize-observer "^1.0.0"
+      rc-util "^5.0.7"
+  
   react-dom@^17.0.0:
     version "17.0.2"
     resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
@@ -8179,7 +8647,7 @@ Lockfile:
       object-assign "^4.1.1"
       scheduler "^0.20.2"
   
-  react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1:
+  react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1:
     version "16.13.1"
     resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
     integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -8598,6 +9066,11 @@ Lockfile:
     resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
     integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
   
+  resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1:
+    version "1.5.1"
+    resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
+    integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+  
   resolve-cwd@^2.0.0:
     version "2.0.0"
     resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
@@ -8892,6 +9365,13 @@ Lockfile:
       ajv "^6.12.5"
       ajv-keywords "^3.5.2"
   
+  scroll-into-view-if-needed@^2.2.25:
+    version "2.2.28"
+    resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz#5a15b2f58a52642c88c8eca584644e01703d645a"
+    integrity sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w==
+    dependencies:
+      compute-scroll-into-view "^1.0.17"
+  
   scss-bundle@^3.0.2:
     version "3.1.2"
     resolved "https://registry.yarnpkg.com/scss-bundle/-/scss-bundle-3.1.2.tgz#8919dd7603d01a84822e8aab5210e5b0b50c548b"
@@ -9062,6 +9542,11 @@ Lockfile:
     dependencies:
       kind-of "^6.0.2"
   
+  shallowequal@^1.1.0:
+    version "1.1.0"
+    resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
+    integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
+  
   shebang-command@^1.2.0:
     version "1.2.0"
     resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -9427,6 +9912,11 @@ Lockfile:
     resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
     integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
   
+  string-convert@^0.2.0:
+    version "0.2.1"
+    resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97"
+    integrity sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=
+  
   string-width@^1.0.1:
     version "1.0.2"
     resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@@ -9787,6 +10277,16 @@ Lockfile:
       mkdirp "^1.0.3"
       yallist "^4.0.0"
   
+  taro-ui@^3.0.0-alpha:
+    version "3.0.0-alpha.10"
+    resolved "https://registry.yarnpkg.com/taro-ui/-/taro-ui-3.0.0-alpha.10.tgz#c6fb95ddb70d31c5b1e242cdc25fb11d630339a2"
+    integrity sha512-sNgMFKv1WrcUvxVrIP5CwzfSAdx5nCGJhb5+4atzK+nJneuX9lKO4hZhlJ4FchrlF68QjM5s5Rb47VAuXVbKsA==
+    dependencies:
+      classnames "^2.2.6"
+      dayjs "^1.7.7"
+      lodash "^4.17.10"
+      prop-types "^15.7.2"
+  
   terser-webpack-plugin@^1.4.3:
     version "1.4.5"
     resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b"
@@ -9920,6 +10420,11 @@ Lockfile:
       regex-not "^1.0.2"
       safe-regex "^1.1.0"
   
+  toggle-selection@^1.0.6:
+    version "1.0.6"
+    resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
+    integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI=
+  
   toidentifier@1.0.0:
     version "1.0.0"
     resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
@@ -10404,6 +10909,13 @@ Lockfile:
       webidl-conversions "^4.0.2"
       xml-name-validator "^3.0.0"
   
+  warning@^4.0.1, warning@^4.0.3:
+    version "4.0.3"
+    resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
+    integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
+    dependencies:
+      loose-envify "^1.0.0"
+  
   watchpack-chokidar2@^2.0.1:
     version "2.0.1"
     resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957"