diff --git a/package.json b/package.json index 597c253..1990f14 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { + "@material-ui/core": "^4.10.0", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", @@ -10,8 +11,13 @@ "@types/node": "^12.0.0", "@types/react": "^16.9.0", "@types/react-dom": "^16.9.0", + "bootstrap": "^4.5.0", + "http-proxy-middleware": "^1.0.4", "react": "^16.13.1", + "react-bootstrap": "^1.0.1", + "react-cookie": "^4.0.3", "react-dom": "^16.13.1", + "react-draggable": "^4.4.2", "react-scripts": "3.4.1", "typescript": "~3.7.2" }, diff --git a/public/close.svg b/public/close.svg new file mode 100644 index 0000000..82fec23 --- /dev/null +++ b/public/close.svg @@ -0,0 +1 @@ + diff --git a/src/Active.tsx b/src/Active.tsx index f65b649..28c0324 100644 --- a/src/Active.tsx +++ b/src/Active.tsx @@ -1,48 +1,56 @@ - import React from "react"; -import {Tabs,Tab,Table,Button} from "react-bootstrap"; -import {ActiveForm} from "./entity"; +import {Button, Tab, Table, Tabs} from "react-bootstrap"; +import {ActiveForm, ManagerActivity} from "./entity"; +import {Method, request} from "./interface"; +import {API} from "./api"; +import {FindActivityRes, FindActivityTransform, PageDataMessage} from "./result"; +import {MyDialog} from "./ui/MyDialog"; + /** * 活动管理 */ -export class Active extends React.Component{ +export class Active extends React.Component; + tipContent:JSX.Element|null +}>{ constructor(props: Readonly) { super(props); this.state={ - activeList:[] + tipContent:null } } //加载活动信息 - loadActive(){ - this.setState({ - activeList:[ - { - title:"fuck", - content:"fuck" - } - ] - }) + loadActive(page:number){ + let that=this + request(API.account.findActivity,Method.GET,{ + currentPage:String(page) + },new FindActivityTransform(),function (res:FindActivityRes) { + switch (res.customResult) { + case PageDataMessage.ok: + that.setState({ + activeList:res.dataList + }) + // that.loadActive(1) + break + case PageDataMessage.fail: + that.setState({ + tipContent:

查询活动失败,请联系管理员

+ }) + break + } + } ) } componentDidMount() { - this.loadActive() + this.loadActive(1) } render() { - //构建活动信息 - const activeTr=this.state.activeList.map((active:ActiveForm,index:number)=> - - {index+1} - {active.title} - {active.content} - - - ) return ( @@ -57,9 +65,24 @@ export class Active extends React.Component{ - {activeTr} + {this.state.activeList?this.state.activeList.length>0?this.state.activeList.map((active:ActiveForm,index:number)=> + + {index+1} + {active.title} + {active.content} + + {/**/} + + + ):

没有活动信息

:null + } + + this.setState({ + tipContent:null + })}/>
); diff --git a/src/App.tsx b/src/App.tsx index 467e46e..7e9ae08 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,16 +2,25 @@ import React from 'react'; import './App.css'; import 'bootstrap/dist/css/bootstrap.min.css'; import {Login} from './account/Login'; -import { instanceOf } from 'prop-types'; -import { withCookies, Cookies } from 'react-cookie'; +import {instanceOf} from 'prop-types'; +import {Cookies, withCookies} from 'react-cookie'; import {Main} from "./Main"; import {Register} from "./account/Register"; import {manager_cookie} from "./account/PropCookie"; +import {Method, request} from "./interface"; +import {API} from "./api"; +import {LoginRes} from "./result"; -class App extends React.Component { - static propTypes = { - cookies: instanceOf(Cookies).isRequired - }; + +class App extends React.Component< + { + allCookies:any; + cookies:Cookies + }, + { + page?:JSX.Element; + } + > { constructor(props: Readonly) { @@ -24,7 +33,7 @@ class App extends React.Component { const { cookies } = this.props if((cookies.get(manager_cookie)||"").length>0){ this.setState({ - page:
this.logout()}/> + page:
this.logout()}/> }) }else{ this.toLogin() @@ -34,8 +43,7 @@ class App extends React.Component { //注销登录 logout(){ - const { cookies } = this.props - cookies.remove(manager_cookie) + this.props.cookies.remove(manager_cookie) this.toLogin() } @@ -48,24 +56,19 @@ class App extends React.Component { }) } - //登录 - login(manager:string,password:string){ - - const { cookies } = this.props - console.debug("manager_cookie="+manager) - cookies.set(manager_cookie,manager) - - this.setState({ - page:
this.logout()}/> - }) - } - /** * 跳转登录 */ toLogin(){ this.setState({ - page:this.toRegister()} login={(manager:string,password:string)=>this.login(manager,password)}/> + page:this.toRegister()} onLoginSuccess={(res:LoginRes)=>{ + this.props.cookies.set(manager_cookie,res.managerId) + + this.setState({ + page:
this.logout()} cookies={this.props.cookies}/> + }) + } + }/> }) } diff --git a/src/Main.tsx b/src/Main.tsx index c282df0..3108fe8 100644 --- a/src/Main.tsx +++ b/src/Main.tsx @@ -3,6 +3,8 @@ import {Navbar,Nav,Button} from "react-bootstrap"; import {Manager} from "./Manager"; import {User} from "./User"; import {Active} from "./Active"; +import {Cookies} from "react-cookie"; +import {manager_cookie} from "./account/PropCookie"; /** * 菜单标记 @@ -16,14 +18,22 @@ enum Menu { /** * 主菜单 */ -export class Main extends React.Component{ +export class Main extends React.Component< + { + cookies:Cookies; + logout:Function; + }, + { + menu:Menu; + subMenu:JSX.Element + }>{ constructor(props: Readonly) { super(props); //默认菜单 this.state={ menu:Menu.manager, - subMenu: + subMenu: } } @@ -41,7 +51,7 @@ export class Main extends React.Component{ switch (menu) { case Menu.manager: this.setState({ - subMenu: + subMenu: });break; case Menu.user: this.setState({ @@ -56,6 +66,7 @@ export class Main extends React.Component{ render() { + return (
@@ -65,7 +76,7 @@ export class Main extends React.Component{ this.changeMenu(Menu.active)}>活动管理 - 欢迎管理员{this.props.manager}登录 + 欢迎管理员{this.props.cookies.get(manager_cookie)}登录 diff --git a/src/Manager.tsx b/src/Manager.tsx index e130013..1245d5b 100644 --- a/src/Manager.tsx +++ b/src/Manager.tsx @@ -1,46 +1,151 @@ import React from "react"; -import {Tabs,Tab,Button,Table,Modal} from "react-bootstrap"; -import {ManagerForm} from "./entity"; -import {Input} from "./bootstrap/InputGroup"; +import {Button, Form, Tab, Table, Tabs} from "react-bootstrap"; +import {ManagerEntity} from "./entity"; +import {Input} from "./ui/InputGroup"; +import {Cookies} from "react-cookie"; +import {MyDialog} from "./ui/MyDialog"; +import {JSONResponse, Method, request} from "./interface"; +import {API} from "./api"; +import {EmptyBodyTransform, ManagerList, ManagerTransform, SimpleMessage} from "./result"; +import {manager_cookie} from "./account/PropCookie"; +import {register} from './public' + +enum Type { + modify, + register +} + +class EditManager extends React.Component< + { + onClick:Function; + type:Type; + }, + { + managerId?:string, + password:string; + confirmPwd:string; + }>{ + + + + constructor(props: Readonly) { + super(props); + + this.state={ + password:"", + confirmPwd:"", + } + } + + isDisable(){ + return !(this.state.password.length>0 + &&this.state.confirmPwd.length>0&&this.state.password===this.state.confirmPwd&&((this.state.managerId&&this.state.managerId.length>0)||!this.state.managerId)) + } + + render() { + return ( + +
+ {this.props.type===Type.modify?null: + + this.setState({ + managerId:value + }) + } valid={{check:this.state.managerId?this.state.managerId.length>0:false}}/> + } + + + this.setState({ + password:value + }) + } valid={{check:this.state.password.length>0}}/> + { + this.setState({ + confirmPwd:value + }) + }} valid={{check:this.state.confirmPwd.length>0&&this.state.password===this.state.confirmPwd, + invalid:this.state.confirmPwd.length>0&&this.state.password!==this.state.confirmPwd?"密码和确认密码不一致":"验证失败"}}/> + + +
+ + + ) + } +} + + + /** * 管理员管理 */ -export class Manager extends React.Component{ +export class Manager extends React.Component< + { + cookies:Cookies; + }, + { + //管理员列表数据 + managerList?:Array; + //弹框界面 + dialog:JSX.Element|null; + //操作反馈 + tipContent:JSX.Element|null; + }>{ constructor(props: Readonly) { super(props); this.state={ - managerList:[], - //修改密码模态框状态位 - showModifyPwd:false, - //修改密码表单 - modify:{ - password:"", - confirmPwd:"" - }, - //添加管理员模态框状态位 - showAddManager:false, - //添加管理员表单 - addManager:{ - manager:"", - password:"", - confirmPwd:"" - } + tipContent: null, + dialog:null, } } + + /** + * 修改密码 + */ + private modifyPwd(managerId:string,password:string) { + let that=this + request(API.account.update,Method.POST, { + managerId:managerId, + password:password + },new EmptyBodyTransform(),function (res:JSONResponse) { + switch (res.customResult) { + case SimpleMessage.ok: + that.setState({ + tipContent:

密码修改成功

, + dialog:null + }) + break + case SimpleMessage.fail: + that.setState({ + tipContent:

密码修改失败

+ }) + break + } + }) + } + /** * 加载管理员数据 */ - loadManager(){ - this.setState({ - managerList:[ - { - manager:"admin123" + loadManager(page:number){ + let that=this + request(API.account.list,Method.GET,{ + currentPage:page+"" + },new ManagerTransform(),function (res:ManagerList) { + switch (res.customResult) { + case SimpleMessage.ok: + that.setState({ + managerList:res.dataList + }) + break + case SimpleMessage.fail: + } - ] }) } @@ -70,66 +175,32 @@ export class Manager extends React.Component{ } componentDidMount() { - this.loadManager() + this.loadManager(1) } - /** - * 获取模态框表单 - */ - getForm(){ - let key: string - let form:any - let manager; - if(this.state.showAddManager){ - key='addManager' - form=this.state.addManager - manager={this.setState({[key]:{ - manager:value, - password:form.password, - confirmPwd:form.confirmPwd - }})}}/> - }else{ - key='modify' - form=this.state.modify - } - return - {manager} - {this.setState({[key]:{ - manager:form.manager, - password:value, - confirmPwd:form.confirmPwd - }})}}/> - {this.setState({[key]:{ - manager:form.manager, - password:form.password, - confirmPwd:value - }})}} - valid={this.checkPwd(form)} - /> - - } render() { - //构造表格行数据 - const managerTr=this.state.managerList.map((manager:ManagerForm,index:number)=> - - {index+1} - {manager.manager} - - - - - - ) - - const modalTitle=this.state.showModifyPwd?'修改密码':'添加管理员' - return ( + - + @@ -139,28 +210,66 @@ export class Manager extends React.Component{ - {managerTr} + {this.state.managerList? + this.state.managerList.map((manager:ManagerEntity, index:number)=> + + + + + + ) + :null + }
{index + 1}{manager.managerId} + + + + {this.props.cookies.get(manager_cookie)===manager.managerId?null: + + } +
- - - - {modalTitle} - - - {this.getForm()} - - - - - - + {this.state.dialog} + + + + this.setState({ + tipContent:null + })}/>
); } + + /** + * 删除管理员 + * @param managerId + */ + private delete(managerId: string) { + let that=this + request(API.account.delete+managerId,Method.POST, {},new EmptyBodyTransform(), + function (res:JSONResponse) { + switch (res.customResult) { + case SimpleMessage.ok: + that.setState({ + tipContent:

删除成功

, + }) + that.loadManager(1) + break + case SimpleMessage.fail: + that.setState({ + tipContent:

删除失败,请联系管理员

, + }) + break + } + }) + } + } diff --git a/src/User.tsx b/src/User.tsx index 0dc58da..4181d88 100644 --- a/src/User.tsx +++ b/src/User.tsx @@ -1,87 +1,102 @@ import React from "react"; -import {Tabs,Tab,Table,Button,Modal} from "react-bootstrap"; -import {UserForm} from "./entity"; -import {Input} from "./bootstrap/InputGroup"; +import {Button, Form, Image, Tab, Table, Tabs} from "react-bootstrap"; +import {UserEntity, UserType} from "./entity"; +import {Input} from "./ui/InputGroup"; +import {JSONResponse, Method, request} from "./interface"; +import {API, prefix} from "./api"; +import {EmptyBodyTransform, FindUserRes, FindUserTransform, PageDataMessage, SimpleMessage} from "./result"; +import {MyDialog} from "./ui/MyDialog"; + +class EditUser extends React.Component<{ + user:UserEntity; + modifyUser:Function; +}, { + user:UserEntity; + tipContent:JSX.Element|null; + }>{ + + + constructor(props: Readonly<{ user: UserEntity ,modifyUser:Function;}>) { + super(props); + + this.state={ + user:this.props.user, + tipContent:null + } + } + + render() { + return ( +
+ this.setState({ + user:{...this.state.user,...{name:value}} + })}/> + + + + + +
+ ); + } +} + /** * 用户管理 */ -export class User extends React.Component{ +export class User extends React.Component< + { + undefined?:undefined + }, + { + userList?:Array; + tipContent:JSX.Element|null; + user?:UserEntity; + headImg?:string; + dialog:JSX.Element|null; + }>{ constructor(props: Readonly) { super(props); this.state={ - userList:[], - showUser:false + tipContent:null, + dialog:null } } /** * 加载用户信息 */ - loadUser(){ - this.setState({userList:[ - { - username:"ffff", - name:"ffff", - sex:"男", - age:12, - headImg:"https://www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg", - phone:1234567890, - mail:"abc@qq.com", - address:"广州", - timeMoney:22, - desc:"自我介绍" - }, - { - username:"ffff", - name:"草", - sex:"男", - age:12, - headImg:"https://www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg", - phone:1234567890, - mail:"abc@qq.com", - address:"广州", - timeMoney:22, - desc:"自我介绍" + loadUser(page:number){ + let that=this + request(API.account.userList,Method.GET,{ + currentPage:String(page), + userTypes:[UserType.help,UserType.seekHelp] + },new FindUserTransform(),function (res:FindUserRes) { + switch (res.customResult) { + case PageDataMessage.ok: + that.setState({ + userList:res.dataList + }) + break + case PageDataMessage.fail: + that.setState({ + tipContent:

加载用户失败

+ }) + break } - ]}) + }) } - //修改个人信息 - modifyUser(){ - alert("您修改的用户是"+this.state.user.name) - this.setState({showUser:false}) - } componentDidMount() { - this.loadUser() + this.loadUser(1) } render() { - //构造表格行数据 - const userTr=this.state.userList.map((user:UserForm,index:number)=> - - {index+1} - {user.username} - {user.name} - {user.sex} - {user.age} - 头像this.setState({headImg:user.headImg})}/> - {user.phone} - {user.mail} - {user.address} - {user.timeMoney} - {user.desc} - - - - - - - ) return ( @@ -104,36 +119,76 @@ export class User extends React.Component{ - {userTr} + {this.state.userList?this.state.userList.length>0?this.state.userList.map((user:UserEntity, index:number)=> + + {index+1} + {user.userId} + {user.name} + {user.sex} + {user.age} + + {this.setState({ + dialog:} + open={true} + titleId={"image-dialog"} menuName={"图片放大"} onClose={()=>this.setState({ + dialog:null + })}/> + })}/>} + + {user.mobile} + {user.email} + {user.address} + {user.timeScore} + {user.info} + + + + + ):

没有用户信息

:null} - 0} centered onClick={()=>this.setState({headImg:""})} onHide={()=>{}}> - - - 头像 - - - - {}}> - this.setState({showUser:false})}> - - 修改个人信息 - - - - this.setState({ - user:{ - name:value - } - })}/> - - - - - + + {this.state.dialog} + + this.setState({ + tipContent:null + })}/> + +
); } + + /** + * 修改用户信息 + * @param user + */ + private modifyUser(user: UserEntity) { + let that=this + request(API.account.updateUser,Method.POST, { + userId:user.userId, + name:user.name + },new EmptyBodyTransform(),function (res:JSONResponse) { + switch (res.customResult) { + case SimpleMessage.ok: + that.setState({ + tipContent:

修改用户信息成功

, + dialog:null + }) + that.loadUser(1) + break + case SimpleMessage.fail: + that.setState({ + tipContent:

修改失败,请联系管理员

+ }) + break + } + }) + } } diff --git a/src/account/Login.tsx b/src/account/Login.tsx index e2cfaba..5fd91f7 100644 --- a/src/account/Login.tsx +++ b/src/account/Login.tsx @@ -1,37 +1,87 @@ import React from "react"; -import {Button} from 'react-bootstrap' -import {LoginForm} from "./LoginForm"; -import {Input} from "../bootstrap/InputGroup"; +import {Button, Form} from 'react-bootstrap' +import {Input} from "../ui/InputGroup"; +import {LoginProps, LoginState} from "../entity"; +import {Method, request} from "../interface"; +import {API} from "../api"; +import {LoginMessage, LoginRes, LoginTransform} from "../result"; +import {MyDialog} from "../ui/MyDialog"; /** * 登陆表单组件 */ -export class Login extends React.Component{ +export class Login extends React.Component{ - constructor(props: Readonly) { + constructor(props: Readonly) { super(props) this.state={ - manager:"", + managerId:"", password:"", - toRegister:props.toRegister, - cookies:props.cookies, - login:props.login + tipContent:null } } + //检查是否为空 + isNotEmpty(...value:(string | number)[]){ + for(let index in value){ + if(value[index].toString().length===0){ + return false + } + } + return true + } + + //登录 + login(){ + let that=this + request(API.account.login,Method.POST, { + managerId:this.state.managerId, + password:this.state.password + },new LoginTransform(),function (res:LoginRes) { + switch (res.customResult) { + case LoginMessage.ok: + that.props.onLoginSuccess(res) + break + case LoginMessage.valid_fail: + that.setState({ + tipContent:

账号或密码错误

+ }) + break + case LoginMessage.fail: + that.setState({ + tipContent:

发生未知错误,请联系管理员

+ }) + break + } + }) + } + render() { return (
- {this.setState({manager:value})}}/> - {this.setState({password:value})}}/> +
- + {this.setState({managerId:value})}} valid={{check:this.state.managerId.length>0}}/> + + {this.setState({password:value})}} valid={{check:this.state.password.length>0}}/> + + + + +
+ + this.setState({ + tipContent:null + })}/>
); } diff --git a/src/account/LoginForm.ts b/src/account/LoginForm.ts deleted file mode 100644 index 3c9eac0..0000000 --- a/src/account/LoginForm.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * 登陆表单 - */ -import {PropCookie} from "./PropCookie"; - -export interface LoginForm extends PropCookie{ - //管理员名 - manager?:string; - //密码 - password?:string; - //跳转注册 - toRegister:Function; - //登录 - login:Function; -} diff --git a/src/account/Register.tsx b/src/account/Register.tsx index d322031..cc3e721 100644 --- a/src/account/Register.tsx +++ b/src/account/Register.tsx @@ -1,38 +1,105 @@ import React from "react"; -import {RegisterForm} from "./RegisterForm"; -import {Input} from "../bootstrap/InputGroup"; -import {Button} from 'react-bootstrap' +import {Input} from "../ui/InputGroup"; +import {Button, Form} from 'react-bootstrap' +import {RegisterProps, RegisterState} from "../entity"; +import {JSONResponse, Method, request} from "../interface"; +import {API} from "../api"; +import {RegisterRes, RegisterTransform} from "../result"; +import {MyDialog} from "../ui/MyDialog"; +import {register} from '../public' /** * 注册 */ -export class Register extends React.Component{ +export class Register extends React.Component{ - constructor(props: Readonly) { + constructor(props: Readonly) { super(props) this.state={ - manager:"", + confirmPwd: "", + managerId:"", password:"", - toLogin:props.toLogin + tipContent:null } } //注册 register(){ - alert("您输入的用户名是"+this.state.manager+",您输入的密码是:"+this.state.password); + let that=this + request(API.account.register,Method.POST, { + managerId:this.state.managerId, + password:this.state.password + },new RegisterTransform(),function (res:JSONResponse) { + switch (res.customResult) { + case RegisterRes.ok: + that.setState({ + tipContent:

注册成功

+
+ }) + break + case RegisterRes.fail: + that.setState({ + tipContent:

注册失败,请联系管理员

+ }) + break + case RegisterRes.user_repeat: + that.setState({ + tipContent:

注册失败,账号:{that.state.managerId}已存在

+ }) + break + } + }) + } + + //检查密码 + checkPwd(){ + return this.state.confirmPwd.length>0&&this.state.password===this.state.confirmPwd + } + + //检查表单 + check(){ + return this.isNotEmpty(this.state.managerId,this.state.password) + &&this.checkPwd() + } + + //检查是否为空 + isNotEmpty(...value:(string | number)[]){ + for(let index in value){ + if(value[index].toString().length===0){ + return false + } + } + return true } render() { return (
- {this.setState({manager:value})}}/> - {this.setState({password:value})}}/> +
+ + { + this.setState({...this.state,...{managerId:value}})}} valid={{check:this.isNotEmpty(this.state.managerId)}}/> + + {this.setState({password:value})}} valid={{check:this.isNotEmpty(this.state.password)}}/> - + {this.setState({confirmPwd:value})}} + valid={{check:this.checkPwd(), + invalid:this.state.confirmPwd.length>0&&this.state.password!==this.state.confirmPwd?"密码和确认密码不一致":"验证失败"}}/> - + + + + +
+ + this.setState({ + tipContent:null + })}/>
); } diff --git a/src/account/RegisterForm.tsx b/src/account/RegisterForm.tsx deleted file mode 100644 index 60fb798..0000000 --- a/src/account/RegisterForm.tsx +++ /dev/null @@ -1,11 +0,0 @@ -/** - * 注册表单 - */ -export interface RegisterForm { - //管理员名 - manager?:string; - //密码 - password?:string; - //跳转登录 - toLogin:Function; -} diff --git a/src/api.ts b/src/api.ts new file mode 100644 index 0000000..bbf0f46 --- /dev/null +++ b/src/api.ts @@ -0,0 +1,33 @@ +//服务端地址 +export const server = "http://localhost:8080" + +export const prefix={ + manager:'/api/manager', + user:'/api/user', + image: "/image/" +} + +//接口地址 +export const API={ + account:{ + //登录 + login:prefix.manager+'/login', + //注册 + register:prefix.manager+'/register', + //管理员列表 + list:prefix.manager+'/list', + //更新 + update:prefix.manager+'/update', + //删除 + delete:prefix.manager+'/delete/', + //用户列表列表 + userList:prefix.manager+'/user', + // 更新用户信息 + updateUser:prefix.manager+'/userUpdate', + //查询活动信息 + findActivity:prefix.manager+'/find/activity' + }, + user:{ + + } +} diff --git a/src/bootstrap/LoginFormDesc.ts b/src/bootstrap/LoginFormDesc.ts deleted file mode 100644 index 811a15f..0000000 --- a/src/bootstrap/LoginFormDesc.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * 文本输入框组件封装 - */ -export interface InputFormDesc { - //表单名 - name: string - //描述信息 - desc: string - //表单值 - value?: string - //数据类型 - type?: - |"text" - |"password" - //值改变事件 - onChange: Function - //验证信息 - valid?:{ - check?:Boolean; - valid?:String; - invalid?:String; - } -} diff --git a/src/entity.ts b/src/entity.ts index 86d773b..acd9f5c 100644 --- a/src/entity.ts +++ b/src/entity.ts @@ -1,20 +1,45 @@ //管理员 -export interface ManagerForm { - manager:string; +import {PropCookie} from "./account/PropCookie"; + + + +export interface ManagerEntity { + managerId:string; } -//用户 -export interface UserForm { - username:string; + +/** + * 用户信息 + */ +export interface UserEntity{ + //用户ID + userId:string; + //用户姓名 name:string; - sex:string; + //用户年龄 age:number; - headImg:string; - phone:number; - mail:string; + //用户电话 + mobile:string; + //用户邮箱 + email:string; + //住址 address:string; - timeMoney:string; - desc:string; + //服务地点 + serviceAddress:string; + //个人简介 + info:string; + //头像 + headImg?:string; + //性别 + sex:string; + //身份 + userType:string; + //用户状态 + chatStatus?:boolean; + //是否我的好友 + isMyFriend?:boolean; + //时间币 + timeScore?:boolean; } //活动 @@ -23,3 +48,139 @@ export interface ActiveForm { content:string; } +/** + * 文本输入框组件封装 + */ +export interface FormInputProps { + //表单名 + name: string + //描述信息 + desc: string + //提示信息 + placeholder?: string + //表单值 + value?: string + //数据类型 + type?: + | "text" + | "password" + | "number" + as?: React.ElementType; + //值改变事件 + onChange?: Function + //验证信息 + valid?: { + check?: Boolean; + valid?: String; + invalid?: String; + } + //bootstrap col + col?: number + //长度 + maxLength?: number + //选项 + options?:Array; +} + +/** + * 注册表单 + */ +export interface RegisterProps { + //跳转登录 + toLogin: Function; +} + +/** + * 弹框提示 + */ +export interface Tip { + tipContent:JSX.Element|null; +} + +/** + * 注册状态 + */ +export interface RegisterState extends Tip{ + managerId:string; + //密码 + password: string; + //确认密码 + confirmPwd: string; +} + +/** + * 登陆表单 + */ +export interface LoginProps extends PropCookie { + //跳转注册 + toRegister: Function; + //注册成功回调 + onLoginSuccess: Function; +} + +/** + * 登陆表单 + */ +export interface LoginState extends Tip{ + //管理员名 + managerId: string; + //密码 + password: string; +} + +export interface BaseDialogProps { + //弹窗名 + menuName:string; + //关闭事件 + onClose:Function; +} +export interface CloseDialogProps extends BaseDialogProps{ + // + titleId:string; +} +/** + * 我的弹窗 + */ +export interface MyDialogProps extends CloseDialogProps{ + //弹窗内容 + content:JSX.Element|null; + //弹窗状态 + open:boolean; +} + +/** + * 分页信息 + */ +export interface PageProps{ + //当前页 + currentPage:number; + //总页数 + totalPage:number; + //分页大小 + pageSize:number; +} + +/** + * 分页点击 + */ +export interface PageClickProps extends PageProps{ + //分页点击事件 + onClick:Function; +} + +export enum UserType { + seekHelp="seekHelp", + help="help" +} + +export interface ManagerActivity { + activityId:number; + content:string; + title:string; + activityImg:string; + activityStartTime:number; + activityEndTime:number; + seekHelpUser:number; + helpUser:Array; +} + diff --git a/src/index.css b/src/index.css index 7e7bb08..3c3b1b6 100644 --- a/src/index.css +++ b/src/index.css @@ -16,3 +16,14 @@ code { width: 100px; height: 100px; } + +/*关闭图标尺寸*/ +.closeIcon40{ + height: 40px; + width: 40px; +} +/*关闭图标尺寸*/ +.closeIcon20{ + height: 20px; + width: 20px; +} diff --git a/src/interface.ts b/src/interface.ts new file mode 100644 index 0000000..376beab --- /dev/null +++ b/src/interface.ts @@ -0,0 +1,110 @@ +//服务端地址 + + +import {server} from "./api"; + +export enum Method { + PUT="PUT", + POST="POST", + GET="GET" +} + +export enum Result { + OK="OK", + FAIL="FAIL" +} + + +/** + * 响应数据 + */ +export class JSONResponse { + result?:Result + customResult?:Q +} + +/** + * 数据类型转换 + */ +export abstract class TransformData> { + protected target: T + + constructor() { + this.target = this.newObject(); + } + + protected abstract newObject(): T + + public transform(data:any){ + this.transformResult(data) + this.transformBody(data) + return this.target + } + + protected transformBody(data:any){ + + } + + private transformResult(data:any){ + if("result" in data ) { + this.target.result = data.result + } + if("customResult" in data){ + this.target.customResult = data.customResult + } + } +} + +//发送请求 +export function request,T extends TransformData>(api:string,method:Method,formParams: {[propName:string]: string | Blob|Array},transform:T,callback:Function) { + let formData + let queryParams='' + if(method===Method.GET) { + for(let formParam in formParams){ + let params=formParams[formParam] + if(params instanceof Array) { + for(let value in params){ + queryParams+='&'+formParam+'='+params[value] + } + }else{ + queryParams += '&' + formParam + '=' + params + } + } + queryParams='?'+queryParams.substr(1) + }else{ + formData=new FormData() + for (let formParam in formParams) { + let params= formParams[formParam] + if(params instanceof Array){ + for(let value in params){ + if(params.hasOwnProperty(value)) { + formData.append(formParam + '[]', params[value]) + } + } + }else if(params instanceof Blob||typeof params==="string"){ + formData.append(formParam,params) + } + + } + + } + fetch(server+api+queryParams,{ + method:method, + body:formData, + credentials: 'include', + }) + .then( + response=>{if(response.status===200){ + return response.json() + }else{ + throw new Error("遇到无法处理的错误,请联系管理员") + + }} + ) + .catch( + error =>console.error('Error:', error) + ) + .then((response:JSONResponse)=>{ + callback(transform.transform(response)) + }) +} diff --git a/src/public.tsx b/src/public.tsx new file mode 100644 index 0000000..247d3c5 --- /dev/null +++ b/src/public.tsx @@ -0,0 +1,37 @@ + +//注册 +import {JSONResponse, Method, request} from "./interface"; +import {API} from "./api"; +import {RegisterRes, RegisterTransform} from "./result"; +import {Button} from "react-bootstrap"; +import * as React from "react"; + + +export function register(that:React.Component,managerId:string,password:string,onSuccess?:Function){ + request(API.account.register,Method.POST, { + managerId:managerId, + password:password + },new RegisterTransform(),function (res:JSONResponse) { + switch (res.customResult) { + case RegisterRes.ok: + that.setState({ + tipContent:

注册成功

+ {that.props.toLogin?:null}
+ }) + if(onSuccess){ + onSuccess() + } + break + case RegisterRes.fail: + that.setState({ + tipContent:

注册失败,请联系管理员

+ }) + break + case RegisterRes.user_repeat: + that.setState({ + tipContent:

注册失败,账号:{that.state.managerId}已存在

+ }) + break + } + }) +} diff --git a/src/result.ts b/src/result.ts new file mode 100644 index 0000000..6ba9519 --- /dev/null +++ b/src/result.ts @@ -0,0 +1,138 @@ +import {JSONResponse, Result, TransformData} from "./interface"; +import {ManagerActivity, ManagerEntity, PageProps, UserEntity} from "./entity"; +import {User} from "./User"; + +/** + * 空body响应 + */ +export enum SimpleMessage { + //操作失败 + ok="ok", + //操作成功 + fail="fail" +} + +/** + * 空body响应 + */ +export class EmptyBodyTransform extends TransformData>{ + protected newObject(): JSONResponse { + return new JSONResponse(); + } +} + +export abstract class EmptyBodyDiffMsg extends TransformData>{} + +export enum LoginMessage{ + ok='ok', + fail='fail', + form_fail='form_fail', + valid_fail='valid_fail' +} + +export class LoginRes extends JSONResponse{ + managerId?:string +} + +export class LoginTransform extends TransformData{ + protected newObject(): LoginRes { + return new LoginRes(); + } + + + protected transformBody(data: any) { + if(data.body) { + this.target.managerId = data.body.managerId + } + } +} + +export enum RegisterRes { + //注册成功 + ok='ok', + //系统异常,注册失败 + fail='fail', + //用户id重复 + user_repeat='user_repeat', + //表单解析错误 + form_parse_error='form_parse_error' +} + +export class RegisterTransform extends EmptyBodyDiffMsg{ + protected newObject(): JSONResponse { + return new JSONResponse(); + } +} + + +export class ManagerList extends JSONResponse{ + dataList?:Array +} + +export class ManagerTransform extends TransformData{ + protected newObject(): ManagerList { + return new ManagerList(); + } + + protected transformBody(data: any) { + if (data.body) { + this.target.dataList = data.body.body + } + } +} + +/** + * 分页数据转换 + */ +export enum PageDataMessage { + ok="ok", + fail="fail", + //空数据 + empty="empty" +} + +export abstract class PageDataRes extends JSONResponse{ + dataList?:any; + page?:PageProps; +} + +export abstract class PageDataTransform extends TransformData{ + + protected transformBody(data: any) { + if(data.body!==null){ + this.target.dataList=data.body.body + this.target.page={ + currentPage:data.body.currentPage, + totalPage:data.body.totalPage, + pageSize:data.body.pageSize + } + } + + } +} +/** + * 用户信息实体 + */ +export class FindUserRes extends PageDataRes{ + dataList?:Array +} + +/** + * 用户数据转换 + */ +export class FindUserTransform extends PageDataTransform{ + protected newObject(): FindUserRes { + return new FindUserRes(); + } +} + +export class FindActivityRes extends PageDataRes{ + dataList?:Array +} + +export class FindActivityTransform extends PageDataTransform{ + protected newObject(): FindActivityRes { + return new FindActivityRes(); + } + +} diff --git a/src/setupProxy.js b/src/setupProxy.js new file mode 100644 index 0000000..facc066 --- /dev/null +++ b/src/setupProxy.js @@ -0,0 +1,12 @@ +const { createProxyMiddleware } = require('http-proxy-middleware'); + +module.exports = function (app) { + app.use(createProxyMiddleware('/image', { + target: 'http://localhost:8080', + secure: false, + changeOrigin: true, + pathRewrite: { + "^/image": "/image" + } + })) +} diff --git a/src/ui/CloseDialog.tsx b/src/ui/CloseDialog.tsx new file mode 100644 index 0000000..6614fad --- /dev/null +++ b/src/ui/CloseDialog.tsx @@ -0,0 +1,24 @@ +import React from "react"; +import {Tooltip} from "@material-ui/core"; +import {CloseDialogProps} from "../entity"; + +/** + * 关闭弹窗 + */ +export class CloseDialog extends React.Component{ + + + render() { + return ( +
+ + +

{this.props.menuName}

+
+ + 关闭弹窗this.props.onClose()}/> + +
+ ) + } +} diff --git a/src/bootstrap/InputGroup.tsx b/src/ui/InputGroup.tsx similarity index 51% rename from src/bootstrap/InputGroup.tsx rename to src/ui/InputGroup.tsx index e732857..32bcdfb 100644 --- a/src/bootstrap/InputGroup.tsx +++ b/src/ui/InputGroup.tsx @@ -1,6 +1,6 @@ import React from "react"; -import {InputGroup,FormControl} from 'react-bootstrap' -import {InputFormDesc} from "./LoginFormDesc"; +import {FormControl, InputGroup} from 'react-bootstrap' +import {FormInputProps} from "../entity"; const defaultValid={ @@ -11,7 +11,7 @@ const defaultValid={ /** * bootstrap InputGroup组件封装 */ -export class Input extends React.Component{ +export class Input extends React.Component{ merge(){ return {...defaultValid,...this.props.valid} @@ -27,12 +27,16 @@ export class Input extends React.Component{ render() { return ( - + {this.props.desc} - this.props.onChange(e.target.value)}/> + 0?this.props.placeholder:"请输入"+this.props.desc} + aria-describedby={this.props.name} value={this.props.value} + onChange={(e)=>this.props.onChange?this.props.onChange(e.target.value):null} maxLength={this.props.maxLength }> + {this.props.as==="select"?this.props.options?this.props.options.map(option=>option):null:null} +
{this.merge().valid}
diff --git a/src/ui/MyDialog.tsx b/src/ui/MyDialog.tsx new file mode 100644 index 0000000..121b946 --- /dev/null +++ b/src/ui/MyDialog.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import Dialog from "@material-ui/core/Dialog"; +import Draggable from "react-draggable"; +import {Paper} from "@material-ui/core"; +import {MyDialogProps} from "../entity"; +import {CloseDialog} from "./CloseDialog"; + +/** + * 我的弹窗 + */ +export class MyDialog extends React.Component{ + + + render() { + return ( + + + + } + aria-labelledby={this.props.titleId} + classes={{paper:"w-100"}} + > + this.props.onClose()} titleId={this.props.titleId}/> + +
+ {this.props.content} +
+
+ ); + } +} diff --git a/src/ui/Page.tsx b/src/ui/Page.tsx new file mode 100644 index 0000000..db951b2 --- /dev/null +++ b/src/ui/Page.tsx @@ -0,0 +1,21 @@ +import {PageClickProps} from "../entity"; +import React from "react"; +import {Pagination} from "react-bootstrap"; + +/** + * 分页组件 + */ +export class Page extends React.Component{ + + render() { + return ( + + {this.props.currentPage===1?:this.props.onClick(1)}/>} + {this.props.currentPage>1?this.props.onClick(this.props.currentPage-1)}/>:} + {this.props.currentPage} + {this.props.currentPagethis.props.onClick(this.props.currentPage+1)}/>:} + {this.props.currentPage===this.props.totalPage?:this.props.onClick(this.props.totalPage)}/>} + + ); + } +} diff --git a/yarn.lock b/yarn.lock index ded8e6c..7f9ae12 100644 --- a/yarn.lock +++ b/yarn.lock @@ -995,6 +995,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.3.1", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7": + version "7.10.1" + resolved "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.10.1.tgz?cache=0&sync_timestamp=1590619532605&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.10.1.tgz#b6eb75cac279588d3100baecd1b9894ea2840822" + integrity sha1-tut1ysJ5WI0xALrs0bmJTqKECCI= + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6": version "7.8.6" resolved "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" @@ -1046,6 +1053,11 @@ resolved "https://registry.npm.taobao.org/@csstools/normalize.css/download/@csstools/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" integrity sha1-8JULuhiBlRLUL3GX5WxRiqSRzxg= +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.npm.taobao.org/@emotion/hash/download/@emotion/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha1-u7/2iXj+/b5ozLUzvIy+HRr7VBM= + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.npm.taobao.org/@hapi/address/download/@hapi/address-2.1.4.tgz?cache=0&sync_timestamp=1584145510980&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Faddress%2Fdownload%2F%40hapi%2Faddress-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -1236,6 +1248,70 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@material-ui/core@^4.10.0": + version "4.10.0" + resolved "https://registry.npm.taobao.org/@material-ui/core/download/@material-ui/core-4.10.0.tgz#e214e8f7981ff7975a918404b94508418642e463" + integrity sha1-4hTo95gf95dakYQEuUUIQYZC5GM= + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.10.0" + "@material-ui/system" "^4.9.14" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.9.12" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "^1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0" + react-transition-group "^4.4.0" + +"@material-ui/styles@^4.10.0": + version "4.10.0" + resolved "https://registry.npm.taobao.org/@material-ui/styles/download/@material-ui/styles-4.10.0.tgz#2406dc23aa358217aa8cc772e6237bd7f0544071" + integrity sha1-JAbcI6o1gheqjMdy5iN71/BUQHE= + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.9.6" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.0.3" + jss-plugin-camel-case "^10.0.3" + jss-plugin-default-unit "^10.0.3" + jss-plugin-global "^10.0.3" + jss-plugin-nested "^10.0.3" + jss-plugin-props-sort "^10.0.3" + jss-plugin-rule-value-function "^10.0.3" + jss-plugin-vendor-prefixer "^10.0.3" + prop-types "^15.7.2" + +"@material-ui/system@^4.9.14": + version "4.9.14" + resolved "https://registry.npm.taobao.org/@material-ui/system/download/@material-ui/system-4.9.14.tgz#4b00c48b569340cefb2036d0596b93ac6c587a5f" + integrity sha1-SwDEi1aTQM77IDbQWWuTrGxYel8= + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.9.6" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@^5.1.0": + version "5.1.0" + resolved "https://registry.npm.taobao.org/@material-ui/types/download/@material-ui/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + integrity sha1-76HHoLDqpMfIesA5BEXw+IsNiPI= + +"@material-ui/utils@^4.9.12", "@material-ui/utils@^4.9.6": + version "4.9.12" + resolved "https://registry.npm.taobao.org/@material-ui/utils/download/@material-ui/utils-4.9.12.tgz#0d639f1c1ed83fffb2ae10c21d15a938795d9e65" + integrity sha1-DWOfHB7YP/+yrhDCHRWpOHldnmU= + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1249,6 +1325,24 @@ resolved "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs= +"@popperjs/core@^2.0.0": + version "2.4.0" + resolved "https://registry.npm.taobao.org/@popperjs/core/download/@popperjs/core-2.4.0.tgz#0e1bdf8d021e7ea58affade33d9d607e11365915" + integrity sha1-DhvfjQIefqWK/63jPZ1gfhE2WRU= + +"@restart/context@^2.1.4": + version "2.1.4" + resolved "https://registry.npm.taobao.org/@restart/context/download/@restart/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02" + integrity sha1-qZ2HwpmjTCi9hbtInLB7/SMUnAI= + +"@restart/hooks@^0.3.12", "@restart/hooks@^0.3.21": + version "0.3.25" + resolved "https://registry.npm.taobao.org/@restart/hooks/download/@restart/hooks-0.3.25.tgz#11004139ad1c70d2f5965a8939dcb5aeb96aa652" + integrity sha1-EQBBOa0ccNL1llqJOdy1rrlqplI= + dependencies: + lodash "^4.17.15" + lodash-es "^4.17.15" + "@sheerun/mutationobserver-shim@^0.3.2": version "0.3.3" resolved "https://registry.npm.taobao.org/@sheerun/mutationobserver-shim/download/@sheerun/mutationobserver-shim-0.3.3.tgz#5405ee8e444ed212db44e79351f0c70a582aae25" @@ -1437,6 +1531,11 @@ resolved "https://registry.npm.taobao.org/@types/color-name/download/@types/color-name-1.1.1.tgz?cache=0&sync_timestamp=1588200011932&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fcolor-name%2Fdownload%2F%40types%2Fcolor-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha1-HBJhu+qhCoBVu8XYq4S3sq/IRqA= +"@types/cookie@^0.3.3": + version "0.3.3" + resolved "https://registry.npm.taobao.org/@types/cookie/download/@types/cookie-0.3.3.tgz?cache=0&sync_timestamp=1589385151733&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fcookie%2Fdownload%2F%40types%2Fcookie-0.3.3.tgz#85bc74ba782fb7aa3a514d11767832b0e3bc6803" + integrity sha1-hbx0ungvt6o6UU0RdngysOO8aAM= + "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.npm.taobao.org/@types/eslint-visitor-keys/download/@types/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" @@ -1456,6 +1555,21 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/hoist-non-react-statics@^3.0.1": + version "3.3.1" + resolved "https://registry.npm.taobao.org/@types/hoist-non-react-statics/download/@types/hoist-non-react-statics-3.3.1.tgz?cache=0&sync_timestamp=1588200643669&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fhoist-non-react-statics%2Fdownload%2F%40types%2Fhoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha1-ESSq/lEYy1kZd66xzqrtEHDrA58= + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/http-proxy@^1.17.4": + version "1.17.4" + resolved "https://registry.npm.taobao.org/@types/http-proxy/download/@types/http-proxy-1.17.4.tgz#e7c92e3dbe3e13aa799440ff42e6d3a17a9d045b" + integrity sha1-58kuPb4+E6p5lED/QubToXqdBFs= + dependencies: + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.2" resolved "https://registry.npm.taobao.org/@types/istanbul-lib-coverage/download/@types/istanbul-lib-coverage-2.0.2.tgz#79d7a78bad4219f4c03d6557a1c72d9ca6ba62d5" @@ -1503,6 +1617,11 @@ resolved "https://registry.npm.taobao.org/@types/node/download/@types/node-12.12.39.tgz#532d25c1e639d89dd6f3aa1d7b3962e3e7fa943d" integrity sha1-Uy0lweY52J3W86odezli4+f6lD0= +"@types/object-assign@^4.0.30": + version "4.0.30" + resolved "https://registry.npm.taobao.org/@types/object-assign/download/@types/object-assign-4.0.30.tgz#8949371d5a99f4381ee0f1df0a9b7a187e07e652" + integrity sha1-iUk3HVqZ9Dge4PHfCpt6GH4H5lI= + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.npm.taobao.org/@types/parse-json/download/@types/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -1525,7 +1644,14 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.9.0": +"@types/react-transition-group@^4.2.0": + version "4.4.0" + resolved "https://registry.npm.taobao.org/@types/react-transition-group/download/@types/react-transition-group-4.4.0.tgz#882839db465df1320e4753e6e9f70ca7e9b4d46d" + integrity sha1-iCg520Zd8TIOR1Pm6fcMp+m01G0= + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^16.9.0", "@types/react@^16.9.11", "@types/react@^16.9.23": version "16.9.35" resolved "https://registry.npm.taobao.org/@types/react/download/@types/react-16.9.35.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Freact%2Fdownload%2F%40types%2Freact-16.9.35.tgz#a0830d172e8aadd9bd41709ba2281a3124bbd368" integrity sha1-oIMNFy6Krdm9QXCboigaMSS702g= @@ -1561,6 +1687,11 @@ "@types/testing-library__dom" "*" pretty-format "^25.1.0" +"@types/warning@^3.0.0": + version "3.0.0" + resolved "https://registry.npm.taobao.org/@types/warning/download/@types/warning-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fwarning%2Fdownload%2F%40types%2Fwarning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" + integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI= + "@types/yargs-parser@*": version "15.0.0" resolved "https://registry.npm.taobao.org/@types/yargs-parser/download/@types/yargs-parser-15.0.0.tgz?cache=0&sync_timestamp=1588203262235&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fyargs-parser%2Fdownload%2F%40types%2Fyargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" @@ -2420,6 +2551,11 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= +bootstrap@^4.5.0: + version "4.5.0" + resolved "https://registry.npm.taobao.org/bootstrap/download/bootstrap-4.5.0.tgz#97d9dbcb5a8972f8722c9962483543b907d9b9ec" + integrity sha1-l9nby1qJcvhyLJliSDVDuQfZuew= + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2444,7 +2580,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@~3.0.2: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc= @@ -2835,6 +2971,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classnames@^2.2.5, classnames@^2.2.6: + version "2.2.6" + resolved "https://registry.npm.taobao.org/classnames/download/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha1-Q5Nb/90pHzJtrQogUwmzjQD2UM4= + clean-css@^4.2.3: version "4.2.3" resolved "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" @@ -2897,6 +3038,11 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +clsx@^1.0.4: + version "1.1.1" + resolved "https://registry.npm.taobao.org/clsx/download/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha1-mLMTT5q73yOyZjSRrOE8XAOnMYg= + co@^4.6.0: version "4.6.0" resolved "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3097,6 +3243,11 @@ cookie@0.4.0: resolved "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz?cache=0&sync_timestamp=1587525865178&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcookie%2Fdownload%2Fcookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo= +cookie@^0.4.0: + version "0.4.1" + resolved "https://registry.npm.taobao.org/cookie/download/cookie-0.4.1.tgz?cache=0&sync_timestamp=1587525865178&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcookie%2Fdownload%2Fcookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha1-r9cT/ibr0hupXOth+agRblClN9E= + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -3325,6 +3476,14 @@ css-tree@1.0.0-alpha.39: mdn-data "2.0.6" source-map "^0.6.1" +css-vendor@^2.0.7: + version "2.0.8" + resolved "https://registry.npm.taobao.org/css-vendor/download/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha1-5H+R070xF9SRgKPJNeYuPZ9/RJ0= + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + css-what@2.1: version "2.1.3" resolved "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" @@ -3452,7 +3611,7 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: dependencies: cssom "0.3.x" -csstype@^2.2.0: +csstype@^2.2.0, csstype@^2.5.2, csstype@^2.6.5, csstype@^2.6.7: version "2.6.10" resolved "https://registry.npm.taobao.org/csstype/download/csstype-2.6.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsstype%2Fdownload%2Fcsstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" integrity sha1-5jr1DmbXwmbttrMpCc/Qqr4Dkos= @@ -3706,6 +3865,14 @@ dom-converter@^0.2: dependencies: utila "~0.4" +dom-helpers@^5.0.1, dom-helpers@^5.1.0, dom-helpers@^5.1.2: + version "5.1.4" + resolved "https://registry.npm.taobao.org/dom-helpers/download/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" + integrity sha1-RgloCrXHmkXyUxRB8ZSbedZYf0s= + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^2.6.7" + dom-serializer@0: version "0.2.2" resolved "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -4979,6 +5146,13 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.npm.taobao.org/hoist-non-react-statics/download/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha1-7OCsr3HWLClpwuxZ/v9CpLGoW0U= + dependencies: + react-is "^16.7.0" + hosted-git-info@^2.1.4: version "2.8.8" resolved "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" @@ -5115,6 +5289,17 @@ http-proxy-middleware@0.19.1: lodash "^4.17.11" micromatch "^3.1.10" +http-proxy-middleware@^1.0.4: + version "1.0.4" + resolved "https://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-1.0.4.tgz?cache=0&sync_timestamp=1589915518285&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-proxy-middleware%2Fdownload%2Fhttp-proxy-middleware-1.0.4.tgz#425ea177986a0cda34f9c81ec961c719adb6c2a9" + integrity sha1-Ql6hd5hqDNo0+cgeyWHHGa22wqk= + dependencies: + "@types/http-proxy" "^1.17.4" + http-proxy "^1.18.1" + is-glob "^4.0.1" + lodash "^4.17.15" + micromatch "^4.0.2" + http-proxy@^1.17.0: version "1.18.0" resolved "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" @@ -5124,6 +5309,15 @@ http-proxy@^1.17.0: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-proxy%2Fdownload%2Fhttp-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk= + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -5138,6 +5332,11 @@ https-browserify@^1.0.0: resolved "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +hyphenate-style-name@^1.0.3: + version "1.0.3" + resolved "https://registry.npm.taobao.org/hyphenate-style-name/download/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" + integrity sha1-CXu3+guPGpzwvVxzTPlYmZgam0g= + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1579333981154&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5534,6 +5733,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.npm.taobao.org/is-in-browser/download/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + is-number@^3.0.0: version "3.0.0" resolved "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -6284,6 +6488,75 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jss-plugin-camel-case@^10.0.3: + version "10.1.1" + resolved "https://registry.npm.taobao.org/jss-plugin-camel-case/download/jss-plugin-camel-case-10.1.1.tgz#8e73ecc4f1d0f8dfe4dd31f6f9f2782588970e78" + integrity sha1-jnPsxPHQ+N/k3TH2+fJ4JYiXDng= + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.1.1" + +jss-plugin-default-unit@^10.0.3: + version "10.1.1" + resolved "https://registry.npm.taobao.org/jss-plugin-default-unit/download/jss-plugin-default-unit-10.1.1.tgz#2df86016dfe73085eead843f5794e3890e9c5c47" + integrity sha1-LfhgFt/nMIXurYQ/V5TjiQ6cXEc= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.1.1" + +jss-plugin-global@^10.0.3: + version "10.1.1" + resolved "https://registry.npm.taobao.org/jss-plugin-global/download/jss-plugin-global-10.1.1.tgz#36b0d6d9facb74dfd99590643708a89260747d14" + integrity sha1-NrDW2frLdN/ZlZBkNwiokmB0fRQ= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.1.1" + +jss-plugin-nested@^10.0.3: + version "10.1.1" + resolved "https://registry.npm.taobao.org/jss-plugin-nested/download/jss-plugin-nested-10.1.1.tgz#5c3de2b8bda344de1ebcef3a4fd30870a29a8a8c" + integrity sha1-XD3iuL2jRN4evO86T9MIcKKaiow= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.1.1" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.0.3: + version "10.1.1" + resolved "https://registry.npm.taobao.org/jss-plugin-props-sort/download/jss-plugin-props-sort-10.1.1.tgz#34bddcbfaf9430ec8ccdf92729f03bb10caf1785" + integrity sha1-NL3cv6+UMOyMzfknKfA7sQyvF4U= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.1.1" + +jss-plugin-rule-value-function@^10.0.3: + version "10.1.1" + resolved "https://registry.npm.taobao.org/jss-plugin-rule-value-function/download/jss-plugin-rule-value-function-10.1.1.tgz#be00dac6fc394aaddbcef5860b9eca6224d96382" + integrity sha1-vgDaxvw5Sq3bzvWGC57KYiTZY4I= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.1.1" + +jss-plugin-vendor-prefixer@^10.0.3: + version "10.1.1" + resolved "https://registry.npm.taobao.org/jss-plugin-vendor-prefixer/download/jss-plugin-vendor-prefixer-10.1.1.tgz#8348b20749f790beebab3b6a8f7075b07c2cfcfd" + integrity sha1-g0iyB0n3kL7rqztqj3B1sHws/P0= + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.7" + jss "10.1.1" + +jss@10.1.1, jss@^10.0.3: + version "10.1.1" + resolved "https://registry.npm.taobao.org/jss/download/jss-10.1.1.tgz#450b27d53761af3e500b43130a54cdbe157ea332" + integrity sha1-RQsn1Tdhrz5QC0MTClTNvhV+ozI= + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^2.6.5" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: version "2.2.3" resolved "https://registry.npm.taobao.org/jsx-ast-utils/download/jsx-ast-utils-2.2.3.tgz?cache=0&sync_timestamp=1571953116713&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsx-ast-utils%2Fdownload%2Fjsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" @@ -6462,6 +6735,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash-es@^4.17.15: + version "4.17.15" + resolved "https://registry.npm.taobao.org/lodash-es/download/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" + integrity sha1-Ib2Wg5NUQS8j16EDQOXqxu5FXXg= + lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.npm.taobao.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -6676,6 +6954,14 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk= + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -7524,7 +7810,7 @@ performance-now@^2.1.0: resolved "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.2.1: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz?cache=0&sync_timestamp=1584790434095&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpicomatch%2Fdownload%2Fpicomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha1-IfMz6ba46v8CRo9RRupAbTRfTa0= @@ -7617,6 +7903,11 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" +popper.js@^1.16.1-lts: + version "1.16.1" + resolved "https://registry.npm.taobao.org/popper.js/download/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha1-KiI8s9x7YhPXQOQDcr5A3kPmWxs= + portfinder@^1.0.25: version "1.0.26" resolved "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" @@ -8375,7 +8666,15 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.4" -prop-types@^15.6.2, prop-types@^15.7.2: +prop-types-extra@^1.1.0: + version "1.1.1" + resolved "https://registry.npm.taobao.org/prop-types-extra/download/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + integrity sha1-WMO3TL+7ldMEYll1qi8ISDKaAQs= + dependencies: + react-is "^16.3.2" + warning "^4.0.0" + +prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.npm.taobao.org/prop-types/download/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha1-UsQedbjIfnK52TYOAga5ncv/psU= @@ -8541,6 +8840,34 @@ react-app-polyfill@^1.0.6: regenerator-runtime "^0.13.3" whatwg-fetch "^3.0.0" +react-bootstrap@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/react-bootstrap/download/react-bootstrap-1.0.1.tgz#044b51f34a9db8e17dbfb321a71267a8d6ad11b4" + integrity sha1-BEtR80qduOF9v7MhpxJnqNatEbQ= + dependencies: + "@babel/runtime" "^7.4.2" + "@restart/context" "^2.1.4" + "@restart/hooks" "^0.3.21" + "@types/react" "^16.9.23" + classnames "^2.2.6" + dom-helpers "^5.1.2" + invariant "^2.2.4" + prop-types "^15.7.2" + prop-types-extra "^1.1.0" + react-overlays "^3.1.2" + react-transition-group "^4.0.0" + uncontrollable "^7.0.0" + warning "^4.0.3" + +react-cookie@^4.0.3: + version "4.0.3" + resolved "https://registry.npm.taobao.org/react-cookie/download/react-cookie-4.0.3.tgz#ba8e5ea0047c916516e1181a3ad394c9b7580b56" + integrity sha1-uo5eoAR8kWUW4RgaOtOUybdYC1Y= + dependencies: + "@types/hoist-non-react-statics" "^3.0.1" + hoist-non-react-statics "^3.0.0" + universal-cookie "^4.0.0" + react-dev-utils@^10.2.1: version "10.2.1" resolved "https://registry.npm.taobao.org/react-dev-utils/download/react-dev-utils-10.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-dev-utils%2Fdownload%2Freact-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" @@ -8581,16 +8908,43 @@ react-dom@^16.13.1: prop-types "^15.6.2" scheduler "^0.19.1" +react-draggable@^4.4.2: + version "4.4.2" + resolved "https://registry.npm.taobao.org/react-draggable/download/react-draggable-4.4.2.tgz?cache=0&sync_timestamp=1589467659645&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-draggable%2Fdownload%2Freact-draggable-4.4.2.tgz#f3cefecee25f467f865144cda0d066e5f05f94a0" + integrity sha1-887+zuJfRn+GUUTNoNBm5fBflKA= + dependencies: + classnames "^2.2.5" + prop-types "^15.6.0" + react-error-overlay@^6.0.7: version "6.0.7" resolved "https://registry.npm.taobao.org/react-error-overlay/download/react-error-overlay-6.0.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-error-overlay%2Fdownload%2Freact-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha1-Hc+0WatnHVP2YKmRUTyy8KBVMQg= -react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4: +react-is@^16.12.0, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4: version "16.13.1" resolved "https://registry.npm.taobao.org/react-is/download/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha1-eJcppNw23imZ3BVt1sHZwYzqVqQ= +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.npm.taobao.org/react-lifecycles-compat/download/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha1-TxonOv38jzSIqMUWv9p4+HI1I2I= + +react-overlays@^3.1.2: + version "3.2.0" + resolved "https://registry.npm.taobao.org/react-overlays/download/react-overlays-3.2.0.tgz#ed8335adb0871e701b0fc8396c44dfd2467e7a55" + integrity sha1-7YM1rbCHHnAbD8g5bETf0kZ+elU= + dependencies: + "@babel/runtime" "^7.4.5" + "@popperjs/core" "^2.0.0" + "@restart/hooks" "^0.3.12" + "@types/warning" "^3.0.0" + dom-helpers "^5.1.0" + prop-types "^15.7.2" + uncontrollable "^7.0.0" + warning "^4.0.3" + react-scripts@3.4.1: version "3.4.1" resolved "https://registry.npm.taobao.org/react-scripts/download/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a" @@ -8651,6 +9005,16 @@ react-scripts@3.4.1: optionalDependencies: fsevents "2.1.2" +react-transition-group@^4.0.0, react-transition-group@^4.4.0: + version "4.4.1" + resolved "https://registry.npm.taobao.org/react-transition-group/download/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha1-Y4aPkyWjjqXulTXYKDJ/hXczRck= + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@^16.13.1: version "16.13.1" resolved "https://registry.npm.taobao.org/react/download/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" @@ -9989,6 +10353,11 @@ timsort@^0.3.0: resolved "https://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.npm.taobao.org/tiny-warning/download/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha1-lKMNtFPfTGQ9D9VmBg1gqHXYR1Q= + tmp@^0.0.33: version "0.0.33" resolved "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz?cache=0&sync_timestamp=1588178571895&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftmp%2Fdownload%2Ftmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -10147,6 +10516,16 @@ typescript@~3.7.2: resolved "https://registry.npm.taobao.org/typescript/download/typescript-3.7.5.tgz?cache=0&sync_timestamp=1589699667442&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftypescript%2Fdownload%2Ftypescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" integrity sha1-BpLiH2X9QQi5MwI4qsEd0uF3oa4= +uncontrollable@^7.0.0: + version "7.1.1" + resolved "https://registry.npm.taobao.org/uncontrollable/download/uncontrollable-7.1.1.tgz#f67fed3ef93637126571809746323a9db815d556" + integrity sha1-9n/tPvk2NxJlcYCXRjI6nbgV1VY= + dependencies: + "@babel/runtime" "^7.6.3" + "@types/react" "^16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -10204,6 +10583,16 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +universal-cookie@^4.0.0: + version "4.0.3" + resolved "https://registry.npm.taobao.org/universal-cookie/download/universal-cookie-4.0.3.tgz#c2fa59127260e6ad21ef3e0cdd66ad453cbc41f6" + integrity sha1-wvpZEnJg5q0h7z4M3WatRTy8QfY= + dependencies: + "@types/cookie" "^0.3.3" + "@types/object-assign" "^4.0.30" + cookie "^0.4.0" + object-assign "^4.1.1" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz?cache=0&sync_timestamp=1583530825899&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -10391,6 +10780,13 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +warning@^4.0.0, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.npm.taobao.org/warning/download/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha1-Fungd+uKhtavfWSqHgX9hbRnjKM= + dependencies: + loose-envify "^1.0.0" + watchpack-chokidar2@^2.0.0: version "2.0.0" resolved "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"