HW 3 years ago
parent
commit
a9345ed3eb

+ 2 - 1
package.json

@@ -61,6 +61,7 @@
     "eslint-plugin-import": "^2.12.0",
     "eslint-plugin-react": "^7.8.2",
     "eslint-plugin-react-hooks": "^4.2.0",
-    "stylelint": "9.3.0"
+    "stylelint": "9.3.0",
+    "taro-ui": "^3.0.0-alpha"
   }
 }

+ 4 - 1
src/app.config.js

@@ -1,6 +1,9 @@
 export default {
   pages: [
-    'pages/index/index'
+    'pages/index/index',
+    'pages/login/index',
+    'pages/staffDistribution/index',//员工分布
+    'pages/outdoorActivities/index'//出差申报
   ],
   window: {
     backgroundTextStyle: 'light',

+ 1 - 0
src/app.less

@@ -0,0 +1 @@
+

+ 108 - 104
src/pages/index/index.jsx

@@ -1,8 +1,12 @@
 import { Component } from 'react'
 import Taro from '@tarojs/taro'
 import { connect } from 'react-redux'
-import {View, Map, Button} from '@tarojs/components'
-import dayjs from 'dayjs';
+import {View} from '@tarojs/components'
+import { AtButton } from 'taro-ui'
+
+import "taro-ui/dist/style/components/icon.scss";
+import "taro-ui/dist/style/components/button.scss";
+import "taro-ui/dist/style/components/loading.scss";
 
 import { add, minus, asyncAdd } from '../../actions/counter'
 
@@ -26,124 +30,124 @@ class Index extends Component {
   constructor(props) {
     super(props);
     this.state={
-      data:[],
-      newArrder:{},
-      newList:[
+      list:[
         {
-          longitude: 112.9513,
-          latitude: 28.23529,
-          title:'营销员1',
-          label:{
-            content:'营销员1'
-          }
+          icon:'bell',
+          title:'打卡',
+          color:'#89ec6d',
+          buttons:[
+            {
+              name:'上班'
+            },
+            {
+              name:'下班'
+            }
+          ]
         },
         {
-          longitude: 112.9613,
-          latitude: 28.23529,
-          title:'营销员2',
+          icon:'map-pin',
+          title:'定位轨迹',
+          color:'#3f8ae5',
+          buttons:[
+            {
+              name:'我的路线'
+            },
+            {
+              name:'员工分布',
+              url:'/pages/staffDistribution/index'
+            }
+          ]
         },
         {
-          longitude: 112.9713,
-          latitude: 28.23529,
-          title:'营销员3',
-        }
-      ],
+          icon:'calendar',
+          title:'日报',
+          color:'#3f8ae5',
+          buttons:[
+            {
+              name:'添加日报'
+            },
+          ]
+        },
+        {
+          icon:'shopping-bag',
+          title:'出差',
+          color:'#89ec6d',
+          buttons:[
+            {
+              name:'填写出差单',
+              url:'/pages/outdoorActivities/index'
+            },
+          ]
+        },
+        {
+          icon:'camera',
+          title:'拍照上传',
+          color:'#3f8ae5',
+          buttons:[
+            {
+              name:'添加拍照'
+            },
+          ]
+        },
+        {
+          icon:'credit-card',
+          title:'费用申请',
+          color:'#b19c42',
+          buttons:[
+            {
+              name:'填写申请单'
+            },
+          ]
+        },
+      ]
     }
   }
 
   componentDidShow () {
-    const chooseLocation = requirePlugin('chooseLocation');
-    const location = chooseLocation.getLocation();
-    console.log(location);
+    let token = Taro.getStorageSync('token');
+    if(!token){
+      Taro.navigateTo({
+        url: '/pages/login/index',
+      })
+    }
   }
 
   componentDidMount() {
-    Taro.getLocation({
-      type: 'gcj02',
-      isHighAccuracy:true,
-      success: (res)=> {
-        const latitude = res.latitude
-        const longitude = res.longitude
-        console.log(latitude,longitude)
-        this.setState({
-          newArrder:{
-            latitude,
-            longitude
-          },
-        })
-      }
-    })
-    Taro.startLocationUpdateBackground({
-      success:()=>{
-        Taro.onLocationChange((data) => {
-          let arr = this.state.data
-          arr.push({
-            long:data.longitude,
-            latitude:data.latitude
-          })
-          console.log(arr,'arr')
-          this.setState({
-            data:this.state.data
-          })
-        });
-      }
-    })
+
   }
 
   render () {
     return (
-      <View>
-        <Map
-          id="allmap"
-          {...this.state.newArrder}
-          markers={this.state.newList}
-          polyline={[{
-            points: [{
-              longitude: 112.9513,
-              latitude: 28.23529
-            }, {
-              longitude: 112.9713,
-              latitude: 28.23529
-            }, {
-              longitude: 112.9913,
-              latitude: 28.23529
-            }, {
-              longitude: 112.9313,
-              latitude: 28.23529
-            },{
-              longitude: 112.9313,
-              latitude: 28.23529
-            },{
-              longitude: 112.9313,
-              latitude: 28.23529
-            }],
-            color: "#33c9FFDD",
-            width: 3,
-            dottedLine: true
-          }]}
-          circles={[
-            {
-              longitude: 112.9513,
-              latitude: 28.23529,
-              color:'#DC3E28',
-              fillColor:'#DC3E28',
-              radius:50
-            }
-          ]}
-        />
-        <Button onClick={()=>{
-          const key = 'BP4BZ-JQJED-5DG4N-H6JND-KC5PK-D2BDL'; //使用在腾讯位置服务申请的key
-          const referer = '科德高企培育'; //调用插件的app的名称
-          const location = JSON.stringify({
-            latitude: 39.89631551,
-            longitude: 116.323459711
-          });
-          const category = '生活服务,娱乐休闲';
-
-          Taro.navigateTo({
-            url: 'plugin://chooseLocation/index?key=' + key + '&referer=' + referer + '&location=' + location + '&category=' + category
-          });
-        }}>选址</Button>
+      <View className='list'>
+        {
+          this.state.list.map((value,key)=>(
+            <View key={key} className='item'>
+              <View className='left' style={{background:value.color}}>
+                <View className={'at-icon at-icon-'+value.icon} style={{color:'#FFF'}}/>
+                <View className='title'>{value.title}</View>
+              </View>
+              <View className='right'>
+                {
+                  value.buttons.map((v,k)=>(
+                    <AtButton
+                      key={k}
+                      type='secondary'
+                      size='small'
+                      className='button'
+                      onClick={()=>{
+                        Taro.navigateTo({
+                          url: v.url,
+                        })
+                      }}
+                      >
+                      {v.name}
+                    </AtButton>
+                  ))
+                }
+              </View>
+            </View>
+          ))
+        }
       </View>
     )
   }

+ 41 - 1
src/pages/index/index.less

@@ -1 +1,41 @@
-#allmap{height:90vh;width:100vw}
+.list{
+  padding: 40px;
+  .item{
+    display: flex;
+    flex-flow: row nowrap;
+    align-items: center;
+    height: 153px;
+    border-radius: 15px;
+    flex: 1;
+    box-shadow: 5px 7px 20px #767272;
+    margin-bottom: 30px;
+    overflow: hidden;
+    .left{
+      height: 100%;
+      display: flex;
+      flex-flow: row nowrap;
+      align-items: center;
+      justify-content: flex-start;
+      padding: 0 10px;
+      width: 27%;
+      .title{
+        color: #FFFFFF;
+        font-size: 30px;
+        font-weight: bold;
+        padding-left: 10px;
+      }
+    }
+    .right{
+      flex: 1;
+      height: 100%;
+      padding: 20px;
+      display: flex;
+      flex-flow: row nowrap;
+      align-items: center;
+      justify-content: center;
+      .button{
+
+      }
+    }
+  }
+}

+ 3 - 0
src/pages/login/index.config.js

@@ -0,0 +1,3 @@
+export default {
+  navigationBarTitleText: '登录'
+}

+ 117 - 0
src/pages/login/index.jsx

@@ -0,0 +1,117 @@
+import { Component } from 'react'
+import Taro from '@tarojs/taro'
+import { connect } from 'react-redux'
+import {View, Map, Button, Input} from '@tarojs/components'
+import {login,test} from '../../utils/servers/servers';
+
+import { add, minus, asyncAdd } from '../../actions/counter'
+
+import './index.less'
+
+
+@connect(({ counter }) => ({
+  counter
+}), (dispatch) => ({
+  add () {
+    dispatch(add())
+  },
+  dec () {
+    dispatch(minus())
+  },
+  asyncAdd () {
+    dispatch(asyncAdd())
+  }
+}))
+class Login extends Component {
+  constructor(props) {
+    super(props);
+    this.state={
+      username:'',
+      password:''
+    }
+    this.login = this.login.bind(this);
+  }
+
+  componentDidShow () {
+
+  }
+
+  componentDidMount() {
+
+  }
+
+  login(){
+    if(!this.state.username){
+      Taro.showToast({
+        title: '请输入用户名',
+        icon: 'none',
+        duration: 2000
+      })
+      return;
+    }
+    if(!this.state.password){
+      Taro.showToast({
+        title: '请输入密码',
+        icon: 'none',
+        duration: 2000
+      })
+      return;
+    }
+    this.setState({
+      loading:true,
+    })
+    login({
+      username:this.state.username,
+      password:this.state.password
+    }).then(()=>{
+      this.setState({
+        loading:false
+      });
+      Taro.navigateTo({
+        url: '/pages/index/index',
+      })
+    }).catch(()=>{
+      this.setState({
+        loading:false
+      })
+    })
+  }
+
+  render () {
+    return (
+      <View>
+        <View>
+          <View>用户名</View>
+          <Input
+            type='text'
+            placeholder='请输入用户名'
+            value={this.state.username}
+            onInput={(v)=>{
+              this.setState({
+                username: v.detail.value
+              })
+            }}
+          />
+        </View>
+        <View>
+          <View>密码</View>
+          <Input
+            type='password'
+            password
+            placeholder='请输入密码'
+            value={this.state.password}
+            onInput={(v)=>{
+              this.setState({
+                password: v.detail.value
+              })
+            }}
+          />
+        </View>
+        <Button type='primary' loading={this.state.loading} onClick={this.login}>登录</Button>
+      </View>
+    )
+  }
+}
+
+export default Login
+

+ 0 - 0
src/pages/login/index.less


+ 3 - 0
src/pages/outdoorActivities/index.config.js

@@ -0,0 +1,3 @@
+export default {
+  navigationBarTitleText: '首页'
+}

+ 86 - 0
src/pages/outdoorActivities/index.jsx

@@ -0,0 +1,86 @@
+import { Component } from 'react';
+import Taro from '@tarojs/taro';
+import { connect } from 'react-redux';
+import {View} from '@tarojs/components';
+
+import 'taro-ui/dist/style/components/icon.scss';
+import './index.less';
+
+import { add, minus, asyncAdd } from '../../actions/counter';
+
+
+@connect(({ counter }) => ({
+  counter
+}), (dispatch) => ({
+  add () {
+    dispatch(add())
+  },
+  dec () {
+    dispatch(minus())
+  },
+  asyncAdd () {
+    dispatch(asyncAdd())
+  }
+}))
+class Index extends Component {
+  constructor(props) {
+    super(props);
+    this.state={
+      selectArrderName:''
+    }
+    this.selectArrder = this.selectArrder.bind(this);
+  }
+
+  componentDidShow () {
+    const chooseLocation = requirePlugin('chooseLocation');
+    const location = chooseLocation.getLocation();
+    // address: "北京市丰台区莲花池东路"
+    // city: "北京市"
+    // district: "丰台区"
+    // latitude: 39.896316
+    // longitude: 116.32346
+    // name: "北京西站"
+    // province: "北京市"
+    if(location){
+      this.setState({
+        selectArrderName: location.name
+      })
+    }
+    console.log(location);
+  }
+
+  componentDidMount() {
+
+  }
+
+  selectArrder(){
+    const key = 'BP4BZ-JQJED-5DG4N-H6JND-KC5PK-D2BDL'; //使用在腾讯位置服务申请的key
+    const referer = '科德高企培育'; //调用插件的app的名称
+    const location = JSON.stringify({
+      latitude: 39.89631551,
+      longitude: 116.323459711
+    });
+    const category = '生活服务,娱乐休闲';
+
+    Taro.navigateTo({
+      url: 'plugin://chooseLocation/index?key=' + key + '&referer=' + referer + '&location=' + location + '&category=' + category
+    });
+  }
+
+  render () {
+    return (
+      <View className='outdoorActivities'>
+          <View className='formItem'>
+            <View className='formLabel'>出差地点:</View>
+            <View className='formValue' onClick={this.selectArrder}>
+              <View className='selectArrderName'>{this.state.selectArrderName}</View>
+              <View className='at-icon at-icon-chevron-right'/>
+            </View>
+          </View>
+      </View>
+    )
+  }
+}
+
+export default Index
+

+ 29 - 0
src/pages/outdoorActivities/index.less

@@ -0,0 +1,29 @@
+.outdoorActivities{
+  .formItem{
+    display: flex;
+    flex-flow: row nowrap;
+    align-items: center;
+    justify-content: space-between;
+    border-bottom: 1px #767272 solid;
+    padding: 30px;
+    .formLabel{
+      white-space: nowrap;
+      padding-right: 40px;
+    }
+    .formValue{
+      flex: 1;
+      display: flex;
+      flex-flow: row nowrap;
+      align-items: center;
+      justify-content: flex-end;
+      .selectArrderName{
+        width: 472px;
+        text-overflow: ellipsis;
+        overflow: hidden;
+        white-space: nowrap;
+        padding-right: 10px;
+        text-align: right;
+      }
+    }
+  }
+}

+ 3 - 0
src/pages/staffDistribution/index.config.js

@@ -0,0 +1,3 @@
+export default {
+  navigationBarTitleText: '员工分布'
+}

+ 90 - 0
src/pages/staffDistribution/index.jsx

@@ -0,0 +1,90 @@
+import { Component } from 'react'
+import Taro from '@tarojs/taro'
+import { connect } from 'react-redux'
+import {View, Map, Button} from '@tarojs/components'
+import dayjs from 'dayjs';
+
+import { add, minus, asyncAdd } from '../../actions/counter'
+
+import './index.less'
+
+
+@connect(({ counter }) => ({
+  counter
+}), (dispatch) => ({
+  add () {
+    dispatch(add())
+  },
+  dec () {
+    dispatch(minus())
+  },
+  asyncAdd () {
+    dispatch(asyncAdd())
+  }
+}))
+class Index extends Component {
+  constructor(props) {
+    super(props);
+    this.state={
+      data:[],
+      newArrder:{},
+      newList:[
+        {
+          longitude: 112.9513,
+          latitude: 28.23529,
+          title:'营销员1',
+          label:{
+            content:'营销员1'
+          }
+        },
+        {
+          longitude: 112.9613,
+          latitude: 28.23529,
+          title:'营销员2',
+        },
+        {
+          longitude: 112.9713,
+          latitude: 28.23529,
+          title:'营销员3',
+        }
+      ],
+    }
+  }
+
+  componentDidShow () {
+
+  }
+
+  componentDidMount() {
+    //获得当前位置
+    Taro.getLocation({
+      type: 'gcj02',
+      isHighAccuracy:true,
+      success: (res)=> {
+        const latitude = res.latitude
+        const longitude = res.longitude
+        this.setState({
+          newArrder:{
+            latitude,
+            longitude
+          },
+        })
+      }
+    })
+  }
+
+  render () {
+    return (
+      <View>
+        <Map
+          id="allmap"
+          {...this.state.newArrder}
+          markers={this.state.newList}
+        />
+      </View>
+    )
+  }
+}
+
+export default Index
+

+ 1 - 0
src/pages/staffDistribution/index.less

@@ -0,0 +1 @@
+#allmap{height:100vh;width:100vw}

+ 13 - 0
src/utils/servers/baseUrl.js

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

+ 14 - 0
src/utils/servers/config.js

@@ -0,0 +1,14 @@
+export const HTTP_STATUS = {
+  SUCCESS: 200,
+  CREATED: 201,
+  ACCEPTED: 202,
+  CLIENT_ERROR: 400,
+  AUTHENTICATE: 401,
+  FORBIDDEN: 403,
+  NOT_FOUND: 404,
+  SERVER_ERROR: 500,
+  BAD_GATEWAY: 502,
+  SERVICE_UNAVAILABLE: 503,
+  GATEWAY_TIMEOUT: 504,
+  NO_PERMISSION: 302,         //无权限
+}

+ 50 - 0
src/utils/servers/http.js

@@ -0,0 +1,50 @@
+import Taro from '@tarojs/taro'
+import getBaseUrl from './baseUrl'
+import interceptors from './interceptors'
+
+interceptors.forEach(i => Taro.addInterceptor(i))
+
+class httpRequest {
+  baseOptions(params, method = "GET") {
+    let { url, data } = params;
+    const BASE_URL = getBaseUrl(url);
+    let contentType = "application/x-www-form-urlencoded; charset=UTF-8;";
+    contentType = params.contentType || contentType;
+    let token = Taro.getStorageSync('token');
+    data.token = token;
+    const option = {
+      url: BASE_URL + url,
+      data: data,
+      method: method,
+      header: {
+        'content-type': contentType,
+        'Authorization': Taro.getStorageSync('Authorization'),
+        'Accept':'application/json, text/javascript,'
+      },
+    };
+    return Taro.request(option);
+  }
+
+  get(url, data = "") {
+    let option = { url, data };
+    return this.baseOptions(option);
+  }
+
+  post(url, data, contentType) {
+    let params = { url, data, contentType };
+    return this.baseOptions(params, "POST");
+  }
+
+  put(url, data = "") {
+    let option = { url, data };
+    return this.baseOptions(option, "PUT");
+  }
+
+  delete(url, data = "") {
+    let option = { url, data };
+    return this.baseOptions(option, "DELETE");
+  }
+
+}
+
+export default new httpRequest()

+ 60 - 0
src/utils/servers/interceptors.js

@@ -0,0 +1,60 @@
+import Taro from "@tarojs/taro"
+import { pageToLogin } from "./utils"
+import { HTTP_STATUS } from './config'
+
+const customInterceptor = (chain) => {
+
+  const requestParams = chain.requestParams
+
+  return chain.proceed(requestParams).then(res => {
+    console.log(res,'proceed')
+    // 只要请求成功,不管返回什么状态码,都走这个回调
+    if (res.statusCode === HTTP_STATUS.NOT_FOUND) {
+      return {
+        error: [
+          {
+            message:'请求资源不存在,请重试',
+            start: 404
+          }
+        ]
+      }
+
+    } else if (res.statusCode === HTTP_STATUS.SERVER_ERROR) {
+      return {
+        error: [
+          {
+            message:'系统错误,请稍后再试',
+            start: 500
+          }
+        ]
+      }
+
+    } else if (res.statusCode === HTTP_STATUS.BAD_GATEWAY) {
+      return Promise.reject("服务端出现了问题")
+
+    } else if (res.statusCode === HTTP_STATUS.FORBIDDEN || res.statusCode === HTTP_STATUS.NO_PERMISSION) {
+      Taro.setStorageSync("token", "");
+      Taro.setStorageSync('userInfor', "");
+      pageToLogin()
+      // TODO 根据自身业务修改
+      return;
+
+    } else if (res.statusCode === HTTP_STATUS.AUTHENTICATE) {
+      Taro.setStorageSync("Authorization", "")
+      pageToLogin()
+      return Promise.reject("需要鉴权")
+
+    } else if (res.statusCode === HTTP_STATUS.SUCCESS) {
+      if(res.data.error && res.data.error.length !== 0 && res.data.error[0].field === '403'){
+        Taro.setStorageSync("token", "");
+        Taro.setStorageSync('userInfor', "");
+        pageToLogin()
+      }
+      return res.data
+    }
+  })
+}
+
+const interceptors = [customInterceptor, Taro.interceptors.logInterceptor]
+
+export default interceptors

+ 38 - 0
src/utils/servers/servers.js

@@ -0,0 +1,38 @@
+/* eslint-disable import/prefer-default-export */
+import HTTPREQUEST from "./http"
+import Taro from "@tarojs/taro";
+
+//登录
+export const login = (res) => {
+  return new Promise(async (resolve,reject)=>{
+    Taro.showLoading({
+      title:'登录中...',
+    })
+    try{
+      let msg = await HTTPREQUEST.post('/managesignin', {
+        mobile:res.username,
+        password:res.password,
+        remeber: false
+      });
+      if(msg.error.length === 0){
+        Taro.setStorageSync('token', msg.token);
+        Taro.setStorageSync('userInfor', msg.data);
+        Taro.showToast({title:'登录成功',icon:'success'})
+        resolve();
+      }else{
+        Taro.showToast({title:msg.error[0].message,icon:'none'})
+        reject();
+      }
+    }catch (err) {
+      Taro.showToast({title:'系统错误,请稍后重试',icon:'none'});
+      reject();
+      console.log(err,'login')
+    }
+    Taro.hideLoading();
+  })
+}
+
+//测试
+export const test = (postData = {}) => {
+  return HTTPREQUEST.get('/open/getVCode', postData)
+}

+ 44 - 0
src/utils/servers/utils.js

@@ -0,0 +1,44 @@
+import Taro,{getCurrentPages} from "@tarojs/taro";
+import { login } from '../../utils/servers/servers'
+/**
+ * @description 获取当前页url
+ */
+export const getCurrentPageUrl = () => {
+  let pages = Taro.getCurrentPages()
+  let currentPage = pages[pages.length - 1]
+  let url = currentPage.route
+  return url
+};
+
+export const pageToLogin = async () => {
+  Taro.navigateTo({
+    url: '/pages/login/index'
+  })
+
+  // if (!path.includes('login')) {
+  //   setTimeout(async ()=>{
+  //     Taro.showLoading({title: '重新登录中...',})
+  //     setTimeout(async ()=>{
+  //       let loginMsg = await Taro.login();
+  //       if (loginMsg.code) {
+  //         try{
+  //           let msg = await login({code:loginMsg.code});
+  //           if(msg.error.length === 0){
+  //             Taro.setStorageSync('token', msg.token);
+  //             Taro.showToast({title:'登录成功',icon:'success'});
+  //             Taro.startPullDownRefresh();
+  //           }else{
+  //             Taro.showToast({title:msg.error[0].message,icon:'none'})
+  //           }
+  //         }catch (err) {
+  //           Taro.showToast({title:'系统错误,请稍后重试',icon:'none'});
+  //         }
+  //       } else {
+  //         Taro.showToast({title:loginMsg.errMsg,icon:'none'})
+  //       }
+  //       Taro.hideLoading();
+  //     },800)
+  //   },800)
+  //
+  // }
+}

File diff suppressed because it is too large
+ 10789 - 0
yarn-error.log


+ 13 - 3
yarn.lock

@@ -2786,7 +2786,7 @@ class-utils@^0.3.5:
     isobject "^3.0.0"
     static-extend "^0.1.1"
 
-classnames@^2.2.5:
+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==
@@ -3408,7 +3408,7 @@ data-urls@^1.1.0:
     whatwg-mimetype "^2.2.0"
     whatwg-url "^7.0.0"
 
-dayjs@^1.10.4:
+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==
@@ -6235,7 +6235,7 @@ lodash@4.17.20:
   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.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==
@@ -9691,6 +9691,16 @@ tar@^6.0.2:
     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"