对接服务端

0603
pan 5 years ago
parent 37243c54dc
commit bff2d70529
  1. 6
      package.json
  2. 1
      public/close.svg
  3. 73
      src/Active.tsx
  4. 47
      src/App.tsx
  5. 19
      src/Main.tsx
  6. 295
      src/Manager.tsx
  7. 223
      src/User.tsx
  8. 74
      src/account/Login.tsx
  9. 15
      src/account/LoginForm.ts
  10. 91
      src/account/Register.tsx
  11. 11
      src/account/RegisterForm.tsx
  12. 33
      src/api.ts
  13. 23
      src/bootstrap/LoginFormDesc.ts
  14. 183
      src/entity.ts
  15. 11
      src/index.css
  16. 110
      src/interface.ts
  17. 37
      src/public.tsx
  18. 138
      src/result.ts
  19. 12
      src/setupProxy.js
  20. 24
      src/ui/CloseDialog.tsx
  21. 16
      src/ui/InputGroup.tsx
  22. 34
      src/ui/MyDialog.tsx
  23. 21
      src/ui/Page.tsx
  24. 408
      yarn.lock

@ -3,6 +3,7 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@material-ui/core": "^4.10.0",
"@testing-library/jest-dom": "^4.2.4", "@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2", "@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2", "@testing-library/user-event": "^7.1.2",
@ -10,8 +11,13 @@
"@types/node": "^12.0.0", "@types/node": "^12.0.0",
"@types/react": "^16.9.0", "@types/react": "^16.9.0",
"@types/react-dom": "^16.9.0", "@types/react-dom": "^16.9.0",
"bootstrap": "^4.5.0",
"http-proxy-middleware": "^1.0.4",
"react": "^16.13.1", "react": "^16.13.1",
"react-bootstrap": "^1.0.1",
"react-cookie": "^4.0.3",
"react-dom": "^16.13.1", "react-dom": "^16.13.1",
"react-draggable": "^4.4.2",
"react-scripts": "3.4.1", "react-scripts": "3.4.1",
"typescript": "~3.7.2" "typescript": "~3.7.2"
}, },

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg fill="red" t="1590093580067" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1144" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M810.666667 273.493333L750.506667 213.333333 512 451.84 273.493333 213.333333 213.333333 273.493333 451.84 512 213.333333 750.506667 273.493333 810.666667 512 572.16 750.506667 810.666667 810.666667 750.506667 572.16 512z" p-id="1145"></path></svg>

After

Width:  |  Height:  |  Size: 637 B

@ -1,48 +1,56 @@
import React from "react"; import React from "react";
import {Tabs,Tab,Table,Button} from "react-bootstrap"; import {Button, Tab, Table, Tabs} from "react-bootstrap";
import {ActiveForm} from "./entity"; 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<any, any>{ export class Active extends React.Component<any, {
activeList?:Array<ManagerActivity>;
tipContent:JSX.Element|null
}>{
constructor(props: Readonly<any>) { constructor(props: Readonly<any>) {
super(props); super(props);
this.state={ this.state={
activeList:[] tipContent:null
} }
} }
//加载活动信息 //加载活动信息
loadActive(){ loadActive(page:number){
this.setState({ let that=this
activeList:[ request(API.account.findActivity,Method.GET,{
{ currentPage:String(page)
title:"fuck", },new FindActivityTransform(),function (res:FindActivityRes) {
content:"fuck" switch (res.customResult) {
} case PageDataMessage.ok:
] that.setState({
}) activeList:res.dataList
})
// that.loadActive(1)
break
case PageDataMessage.fail:
that.setState({
tipContent:<h3></h3>
})
break
}
} )
} }
componentDidMount() { componentDidMount() {
this.loadActive() this.loadActive(1)
} }
render() { render() {
//构建活动信息
const activeTr=this.state.activeList.map((active:ActiveForm,index:number)=>
<tr key={"tr"+index}>
<td>{index+1}</td>
<td>{active.title}</td>
<td>{active.content}</td>
<td><Button variant="danger"></Button></td>
</tr>
)
return ( return (
<Tabs defaultActiveKey="info" id="uncontrolled-tab-example"> <Tabs defaultActiveKey="info" id="uncontrolled-tab-example">
@ -57,9 +65,24 @@ export class Active extends React.Component<any, any>{
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{activeTr} {this.state.activeList?this.state.activeList.length>0?this.state.activeList.map((active:ActiveForm,index:number)=>
<tr key={"tr"+index}>
<td>{index+1}</td>
<td>{active.title}</td>
<td>{active.content}</td>
<td>
{/*<Button variant="danger">删除</Button>*/}
</td>
</tr>
):<h3 className="text-center text-info"></h3>:null
}
</tbody> </tbody>
</Table> </Table>
<MyDialog content={this.state.tipContent} open={this.state.tipContent!=null} titleId={"user-dialog"} menuName={"操作提示"}
onClose={()=>this.setState({
tipContent:null
})}/>
</Tab> </Tab>
</Tabs> </Tabs>
); );

@ -2,16 +2,25 @@ import React from 'react';
import './App.css'; import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css'; import 'bootstrap/dist/css/bootstrap.min.css';
import {Login} from './account/Login'; import {Login} from './account/Login';
import { instanceOf } from 'prop-types'; import {instanceOf} from 'prop-types';
import { withCookies, Cookies } from 'react-cookie'; import {Cookies, withCookies} from 'react-cookie';
import {Main} from "./Main"; import {Main} from "./Main";
import {Register} from "./account/Register"; import {Register} from "./account/Register";
import {manager_cookie} from "./account/PropCookie"; import {manager_cookie} from "./account/PropCookie";
import {Method, request} from "./interface";
import {API} from "./api";
import {LoginRes} from "./result";
class App extends React.Component<any, any> {
static propTypes = { class App extends React.Component<
cookies: instanceOf(Cookies).isRequired {
}; allCookies:any;
cookies:Cookies
},
{
page?:JSX.Element;
}
> {
constructor(props: Readonly<any>) { constructor(props: Readonly<any>) {
@ -24,7 +33,7 @@ class App extends React.Component<any, any> {
const { cookies } = this.props const { cookies } = this.props
if((cookies.get(manager_cookie)||"").length>0){ if((cookies.get(manager_cookie)||"").length>0){
this.setState({ this.setState({
page:<Main manager={cookies.get(manager_cookie)} logout={()=>this.logout()}/> page:<Main cookies={this.props.cookies} logout={()=>this.logout()}/>
}) })
}else{ }else{
this.toLogin() this.toLogin()
@ -34,8 +43,7 @@ class App extends React.Component<any, any> {
//注销登录 //注销登录
logout(){ logout(){
const { cookies } = this.props this.props.cookies.remove(manager_cookie)
cookies.remove(manager_cookie)
this.toLogin() this.toLogin()
} }
@ -48,24 +56,19 @@ class App extends React.Component<any, any> {
}) })
} }
//登录
login(manager:string,password:string){
const { cookies } = this.props
console.debug("manager_cookie="+manager)
cookies.set(manager_cookie,manager)
this.setState({
page:<Main manager={manager} logout={()=>this.logout()}/>
})
}
/** /**
* *
*/ */
toLogin(){ toLogin(){
this.setState({ this.setState({
page:<Login cookies={this.props.cookies} toRegister={()=>this.toRegister()} login={(manager:string,password:string)=>this.login(manager,password)}/> page:<Login cookies={this.props.cookies} toRegister={()=>this.toRegister()} onLoginSuccess={(res:LoginRes)=>{
this.props.cookies.set(manager_cookie,res.managerId)
this.setState({
page:<Main logout={()=>this.logout()} cookies={this.props.cookies}/>
})
}
}/>
}) })
} }

@ -3,6 +3,8 @@ import {Navbar,Nav,Button} from "react-bootstrap";
import {Manager} from "./Manager"; import {Manager} from "./Manager";
import {User} from "./User"; import {User} from "./User";
import {Active} from "./Active"; 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<any, any>{ export class Main extends React.Component<
{
cookies:Cookies;
logout:Function;
},
{
menu:Menu;
subMenu:JSX.Element
}>{
constructor(props: Readonly<any>) { constructor(props: Readonly<any>) {
super(props); super(props);
//默认菜单 //默认菜单
this.state={ this.state={
menu:Menu.manager, menu:Menu.manager,
subMenu:<Manager/> subMenu:<Manager cookies={this.props.cookies}/>
} }
} }
@ -41,7 +51,7 @@ export class Main extends React.Component<any, any>{
switch (menu) { switch (menu) {
case Menu.manager: case Menu.manager:
this.setState({ this.setState({
subMenu:<Manager/> subMenu:<Manager cookies={this.props.cookies}/>
});break; });break;
case Menu.user: case Menu.user:
this.setState({ this.setState({
@ -56,6 +66,7 @@ export class Main extends React.Component<any, any>{
render() { render() {
return ( return (
<div> <div>
<Navbar bg="light"> <Navbar bg="light">
@ -65,7 +76,7 @@ export class Main extends React.Component<any, any>{
<Nav.Link style={{color:this.getMenuColor(Menu.active)}} onClick={()=>this.changeMenu(Menu.active)}></Nav.Link> <Nav.Link style={{color:this.getMenuColor(Menu.active)}} onClick={()=>this.changeMenu(Menu.active)}></Nav.Link>
</Nav> </Nav>
<Navbar.Text> <Navbar.Text>
{this.props.manager} {this.props.cookies.get(manager_cookie)}
</Navbar.Text> </Navbar.Text>
<Button variant="outline-primary" className="ml-3" onClick={()=>this.props.logout()}></Button> <Button variant="outline-primary" className="ml-3" onClick={()=>this.props.logout()}></Button>

@ -1,46 +1,151 @@
import React from "react"; import React from "react";
import {Tabs,Tab,Button,Table,Modal} from "react-bootstrap"; import {Button, Form, Tab, Table, Tabs} from "react-bootstrap";
import {ManagerForm} from "./entity"; import {ManagerEntity} from "./entity";
import {Input} from "./bootstrap/InputGroup"; 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<any>) {
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 (
<Form>
{this.props.type===Type.modify?null:
<Input name="managerId" desc="管理员账号" onChange={(value:string)=>
this.setState({
managerId:value
})
} valid={{check:this.state.managerId?this.state.managerId.length>0:false}}/>
}
<Input name="password" type="password" desc="密码" onChange={(value:string)=>
this.setState({
password:value
})
} valid={{check:this.state.password.length>0}}/>
<Input name="confirmPwd" type="password" desc="确认密码" onChange={(value: string)=>{
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?"密码和确认密码不一致":"验证失败"}}/>
<Button block={true} disabled={this.isDisable()} className="col-3 mt-3 ml-auto mr-auto" onClick={
()=>Type.register===this.props.type?this.props.onClick(this.state.managerId,this.state.password):this.props.onClick(this.state.password)}></Button>
</Form>
)
}
}
/** /**
* *
*/ */
export class Manager extends React.Component<any, any>{ export class Manager extends React.Component<
{
cookies:Cookies;
},
{
//管理员列表数据
managerList?:Array<ManagerEntity>;
//弹框界面
dialog:JSX.Element|null;
//操作反馈
tipContent:JSX.Element|null;
}>{
constructor(props: Readonly<any>) { constructor(props: Readonly<any>) {
super(props); super(props);
this.state={ this.state={
managerList:[], tipContent: null,
//修改密码模态框状态位 dialog:null,
showModifyPwd:false,
//修改密码表单
modify:{
password:"",
confirmPwd:""
},
//添加管理员模态框状态位
showAddManager:false,
//添加管理员表单
addManager:{
manager:"",
password:"",
confirmPwd:""
}
} }
} }
/**
*
*/
private modifyPwd(managerId:string,password:string) {
let that=this
request(API.account.update,Method.POST, {
managerId:managerId,
password:password
},new EmptyBodyTransform(),function (res:JSONResponse<SimpleMessage>) {
switch (res.customResult) {
case SimpleMessage.ok:
that.setState({
tipContent:<h3 className="text-center text-info"></h3>,
dialog:null
})
break
case SimpleMessage.fail:
that.setState({
tipContent:<h3 className="text-center text-danger"></h3>
})
break
}
})
}
/** /**
* *
*/ */
loadManager(){ loadManager(page:number){
this.setState({ let that=this
managerList:[ request(API.account.list,Method.GET,{
{ currentPage:page+""
manager:"admin123" },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<any, any>{
} }
componentDidMount() { 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=<Input name="manager" type="text" desc="管理员账号" value={form.manager} onChange={(value: string)=>{this.setState({[key]:{
manager:value,
password:form.password,
confirmPwd:form.confirmPwd
}})}}/>
}else{
key='modify'
form=this.state.modify
}
return <Modal.Body>
{manager}
<Input name="password" type="password" desc="密码" value={form.password} onChange={(value: string)=>{this.setState({[key]:{
manager:form.manager,
password:value,
confirmPwd:form.confirmPwd
}})}}/>
<Input name="confirmPwd" type="password" desc="确认密码" value={form.confirmPwd} onChange={(value: string)=>{this.setState({[key]:{
manager:form.manager,
password:form.password,
confirmPwd:value
}})}}
valid={this.checkPwd(form)}
/>
</Modal.Body>
}
render() { render() {
//构造表格行数据
const managerTr=this.state.managerList.map((manager:ManagerForm,index:number)=>
<tr key={"tr"+index}>
<td>{index+1}</td>
<td>{manager.manager}</td>
<td>
<Button variant="info" className="mr-3" onClick={()=>this.setState({showModifyPwd:true})}></Button>
<Button variant="danger"></Button>
</td>
</tr>
)
const modalTitle=this.state.showModifyPwd?'修改密码':'添加管理员'
return ( return (
<Tabs defaultActiveKey="info" id="uncontrolled-tab-example"> <Tabs defaultActiveKey="info" id="uncontrolled-tab-example">
<Tab eventKey="info" title="管理员信息"> <Tab eventKey="info" title="管理员信息">
<Button variant="primary" className="mt-3" onClick={()=>this.setState({showAddManager:true})}></Button> <Button variant="primary" className="mt-3" onClick={() => this.setState({dialog:
<MyDialog content={<EditManager onClick={(managerId:string, password:string)=>{
let that=this
register(this,managerId,password,function(){
that.setState({
dialog:null
})
that.loadManager(1)
})
}} type={Type.register}/>}
open={true} titleId={"manager-dialog"}
menuName={"添加管理员"} onClose={()=>{
this.setState({dialog:null});
}}/>})}></Button>
<Table striped bordered hover className="mt-3"> <Table striped bordered hover className="mt-3">
<thead> <thead>
<tr> <tr>
@ -139,28 +210,66 @@ export class Manager extends React.Component<any, any>{
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{managerTr} {this.state.managerList?
this.state.managerList.map((manager:ManagerEntity, index:number)=>
<tr key={"tr" + index}>
<td>{index + 1}</td>
<td>{manager.managerId}</td>
<td>
<Button variant={"info"} className="mr-3"
onClick={() => this.setState({dialog:
<MyDialog content={<EditManager type={Type.modify} onClick={(password:string)=>this.modifyPwd(manager.managerId,password)}/>}
open={true} titleId={"manager-dialog"}
menuName={"修改密码"} onClose={()=>this.setState({dialog:null})}/>})}></Button>
{this.props.cookies.get(manager_cookie)===manager.managerId?null:
<Button variant="danger" onClick={()=>this.delete(manager.managerId)}></Button>
}
</td>
</tr>
)
:null
}
</tbody> </tbody>
</Table> </Table>
<Modal show={this.state.showModifyPwd||this.state.showAddManager} size="lg" {this.state.dialog}
aria-labelledby="contained-modal-title-vcenter"
centered>
<Modal.Header closeButton>
<Modal.Title id="contained-modal-title-vcenter"> <MyDialog content={this.state.tipContent} open={this.state.tipContent!=null}
{modalTitle} titleId={"manager-tip"} menuName={"提示信息"} onClose={()=>this.setState({
</Modal.Title> tipContent:null
</Modal.Header> })}/>
{this.getForm()}
<Modal.Footer className="ml-auto mr-auto">
<Button variant="info" onClick={()=>this.setState({showModifyPwd:false,showAddManager:false})}>{modalTitle}</Button>
<Button onClick={()=>this.setState({showModifyPwd:false,showAddManager:false})}></Button>
</Modal.Footer>
</Modal>
</Tab> </Tab>
</Tabs> </Tabs>
); );
} }
/**
*
* @param managerId
*/
private delete(managerId: string) {
let that=this
request(API.account.delete+managerId,Method.POST, {},new EmptyBodyTransform(),
function (res:JSONResponse<SimpleMessage>) {
switch (res.customResult) {
case SimpleMessage.ok:
that.setState({
tipContent:<h3 className="text-center text-info"></h3>,
})
that.loadManager(1)
break
case SimpleMessage.fail:
that.setState({
tipContent:<h3 className="text-center text-info"></h3>,
})
break
}
})
}
} }

@ -1,87 +1,102 @@
import React from "react"; import React from "react";
import {Tabs,Tab,Table,Button,Modal} from "react-bootstrap"; import {Button, Form, Image, Tab, Table, Tabs} from "react-bootstrap";
import {UserForm} from "./entity"; import {UserEntity, UserType} from "./entity";
import {Input} from "./bootstrap/InputGroup"; 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 (
<Form>
<Input name="name" desc="姓名" value={this.state.user.name} onChange={(value:string)=>this.setState({
user:{...this.state.user,...{name:value}}
})}/>
<Button variant="info" block={true} className={"ml-auto mr-auto mt-3 col-3"} onClick={()=>this.props.modifyUser(this.state.user)}></Button>
</Form>
);
}
}
/** /**
* *
*/ */
export class User extends React.Component<any, any>{ export class User extends React.Component<
{
undefined?:undefined
},
{
userList?:Array<UserEntity>;
tipContent:JSX.Element|null;
user?:UserEntity;
headImg?:string;
dialog:JSX.Element|null;
}>{
constructor(props: Readonly<any>) { constructor(props: Readonly<any>) {
super(props); super(props);
this.state={ this.state={
userList:[], tipContent:null,
showUser:false dialog:null
} }
} }
/** /**
* *
*/ */
loadUser(){ loadUser(page:number){
this.setState({userList:[ let that=this
{ request(API.account.userList,Method.GET,{
username:"ffff", currentPage:String(page),
name:"ffff", userTypes:[UserType.help,UserType.seekHelp]
sex:"男", },new FindUserTransform(),function (res:FindUserRes) {
age:12, switch (res.customResult) {
headImg:"https://www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg", case PageDataMessage.ok:
phone:1234567890, that.setState({
mail:"abc@qq.com", userList:res.dataList
address:"广州", })
timeMoney:22, break
desc:"自我介绍" case PageDataMessage.fail:
}, that.setState({
{ tipContent:<h3 className="text-danger text-center"></h3>
username:"ffff", })
name:"草", break
sex:"男",
age:12,
headImg:"https://www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg",
phone:1234567890,
mail:"abc@qq.com",
address:"广州",
timeMoney:22,
desc:"自我介绍"
} }
]}) })
} }
//修改个人信息
modifyUser(){
alert("您修改的用户是"+this.state.user.name)
this.setState({showUser:false})
}
componentDidMount() { componentDidMount() {
this.loadUser() this.loadUser(1)
} }
render() { render() {
//构造表格行数据
const userTr=this.state.userList.map((user:UserForm,index:number)=>
<tr key={"tr"+index}>
<td className="align-middle">{index+1}</td>
<td className="align-middle">{user.username}</td>
<td className="align-middle">{user.name}</td>
<td className="align-middle">{user.sex}</td>
<td className="align-middle">{user.age}</td>
<td className="align-middle"><img className="head-img" src={user.headImg} alt="头像" onClick={()=>this.setState({headImg:user.headImg})}/></td>
<td className="align-middle">{user.phone}</td>
<td className="align-middle">{user.mail}</td>
<td className="align-middle">{user.address}</td>
<td className="align-middle">{user.timeMoney}</td>
<td className="align-middle">{user.desc}</td>
<td className="align-middle">
<Button variant="info" className="mr-3" onClick={()=>this.setState({showUser:true,user:user})}></Button>
<Button variant="danger" className="mr-3"></Button>
<Button variant="primary"></Button>
</td>
</tr>
)
return ( return (
<Tabs defaultActiveKey="info" id="uncontrolled-tab-example"> <Tabs defaultActiveKey="info" id="uncontrolled-tab-example">
@ -104,36 +119,76 @@ export class User extends React.Component<any, any>{
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{userTr} {this.state.userList?this.state.userList.length>0?this.state.userList.map((user:UserEntity, index:number)=>
<tr key={"tr"+index}>
<td className="align-middle">{index+1}</td>
<td className="align-middle">{user.userId}</td>
<td className="align-middle">{user.name}</td>
<td className="align-middle">{user.sex}</td>
<td className="align-middle">{user.age}</td>
<td className="align-middle">
{<Image className="head-img" src={prefix.image+user.headImg} onClick={()=>this.setState({
dialog:<MyDialog content={<Image src={prefix.image + user.headImg}/>}
open={true}
titleId={"image-dialog"} menuName={"图片放大"} onClose={()=>this.setState({
dialog:null
})}/>
})}/>}
</td>
<td className="align-middle">{user.mobile}</td>
<td className="align-middle">{user.email}</td>
<td className="align-middle">{user.address}</td>
<td className="align-middle">{user.timeScore}</td>
<td className="align-middle">{user.info}</td>
<td className="align-middle">
<Button variant="info" className="mr-3" onClick={()=>this.setState({
dialog:<MyDialog content={<EditUser modifyUser={(user:UserEntity)=>this.modifyUser(user)} user={user}/>} open={true} titleId={"user-edit-dialog"} menuName={"修改用户信息"}
onClose={()=>this.setState({dialog:null})}/>
})}></Button>
<Button variant="danger" className="mr-3"></Button>
</td>
</tr>):<h3 className="text-center text-danger"></h3>:null}
</tbody> </tbody>
</Table> </Table>
<Modal show={(this.state.headImg||"").length>0} centered onClick={()=>this.setState({headImg:""})} onHide={()=>{}}>
<Modal.Header closeButton/> {this.state.dialog}
<Modal.Body>
<img alt="头像" src={this.state.headImg} style={{width:"100%",height:"100%"}}/> <MyDialog content={this.state.tipContent} open={this.state.tipContent!=null} titleId={"user-dialog"} menuName={"操作提示"}
</Modal.Body> onClose={()=>this.setState({
</Modal> tipContent:null
})}/>
<Modal show={this.state.showUser} centered onHide={()=>{}}>
<Modal.Header closeButton onClick={()=>this.setState({showUser:false})}>
<Modal.Title id="contained-modal-title-vcenter">
</Modal.Title>
</Modal.Header>
<Modal.Body>
<Input name="name" desc="姓名" value={{...{user:{}},...this.state.user}.name} onChange={(value:string)=>this.setState({
user:{
name:value
}
})}/>
</Modal.Body>
<Modal.Footer className="ml-auto mr-auto">
<Button variant="info" onClick={()=>this.modifyUser()}></Button>
</Modal.Footer>
</Modal>
</Tab> </Tab>
</Tabs> </Tabs>
); );
} }
/**
*
* @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<SimpleMessage>) {
switch (res.customResult) {
case SimpleMessage.ok:
that.setState({
tipContent:<h3 className="text-center text-info"></h3>,
dialog:null
})
that.loadUser(1)
break
case SimpleMessage.fail:
that.setState({
tipContent:<h3 className="text-center text-danger"></h3>
})
break
}
})
}
} }

@ -1,37 +1,87 @@
import React from "react"; import React from "react";
import {Button} from 'react-bootstrap' import {Button, Form} from 'react-bootstrap'
import {LoginForm} from "./LoginForm"; import {Input} from "../ui/InputGroup";
import {Input} from "../bootstrap/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<LoginForm, LoginForm>{ export class Login extends React.Component<LoginProps, LoginState>{
constructor(props: Readonly<LoginForm>) { constructor(props: Readonly<LoginProps>) {
super(props) super(props)
this.state={ this.state={
manager:"", managerId:"",
password:"", password:"",
toRegister:props.toRegister, tipContent:null
cookies:props.cookies,
login:props.login
} }
} }
//检查是否为空
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:<h3 className="text-center text-danger"></h3>
})
break
case LoginMessage.fail:
that.setState({
tipContent:<h3 className="text-center text-danger"></h3>
})
break
}
})
}
render() { render() {
return ( return (
<div className="d-flex align-items-center" style={{height:window.screen.availHeight+'px'}}> <div className="d-flex align-items-center" style={{height:window.screen.availHeight+'px'}}>
<div className="container"> <div className="container">
<Input name="manager" type="text" desc="管理员账号" value={this.state.manager} onChange={(value: string)=>{this.setState({manager:value})}}/>
<Input name="password" type="password" desc="管理员密码" value={this.state.password} onChange={(value: string)=>{this.setState({password:value})}}/> <Form>
<Button variant="success" className="mt-3 col-2 mr-3" onClick={()=>this.state.login(this.state.manager,this.state.password)}></Button> <Input name="managerId" type="text" desc="管理员账号" value={this.state.managerId}
onChange={(value: string)=>{this.setState({managerId:value})}} valid={{check:this.state.managerId.length>0}}/>
<Input name="password" type="password" desc="管理员密码" value={this.state.password}
onChange={(value: string)=>{this.setState({password:value})}} valid={{check:this.state.password.length>0}}/>
<Button variant="success" className="mt-3 col-2 mr-3" disabled={!(this.state.managerId.length>0&&this.state.password.length>0)} onClick={()=>this.login()}></Button>
<Button variant="info" className="mt-3 col-2" onClick={()=>this.props.toRegister()}></Button> <Button variant="info" className="mt-3 col-2" onClick={()=>this.props.toRegister()}></Button>
</Form>
</div> </div>
<MyDialog content={this.state.tipContent} open={this.state.tipContent!=null} titleId={"login-dialog"}
menuName={"提示"} onClose={()=>this.setState({
tipContent:null
})}/>
</div> </div>
); );
} }

@ -1,15 +0,0 @@
/**
*
*/
import {PropCookie} from "./PropCookie";
export interface LoginForm extends PropCookie{
//管理员名
manager?:string;
//密码
password?:string;
//跳转注册
toRegister:Function;
//登录
login:Function;
}

@ -1,38 +1,105 @@
import React from "react"; import React from "react";
import {RegisterForm} from "./RegisterForm"; import {Input} from "../ui/InputGroup";
import {Input} from "../bootstrap/InputGroup"; import {Button, Form} from 'react-bootstrap'
import {Button} 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<RegisterForm, RegisterForm>{ export class Register extends React.Component<RegisterProps, RegisterState>{
constructor(props: Readonly<RegisterForm>) { constructor(props: Readonly<RegisterProps>) {
super(props) super(props)
this.state={ this.state={
manager:"", confirmPwd: "",
managerId:"",
password:"", password:"",
toLogin:props.toLogin tipContent:null
} }
} }
//注册 //注册
register(){ 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<RegisterRes>) {
switch (res.customResult) {
case RegisterRes.ok:
that.setState({
tipContent:<div><h3 className="text-center text-info"></h3>
<Button className={"col-3 ml-auto mr-auto"} block={true} onClick={()=>that.props.toLogin()}></Button></div>
})
break
case RegisterRes.fail:
that.setState({
tipContent:<h3 className="text-center text-danger">,</h3>
})
break
case RegisterRes.user_repeat:
that.setState({
tipContent:<h3 className="text-center text-danger">{that.state.managerId}</h3>
})
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() { render() {
return ( return (
<div className="d-flex align-items-center" style={{height:window.screen.availHeight+'px'}}> <div className="d-flex align-items-center" style={{height:window.screen.availHeight+'px'}}>
<div className="container"> <div className="container">
<Input name="manager" type="text" desc="管理员名" value={this.state.manager} onChange={(value: string)=>{this.setState({manager:value})}}/>
<Input name="password" type="password" desc="密码" value={this.state.password} onChange={(value: string)=>{this.setState({password:value})}}/> <Form>
<Input col={4} name="managerId" type="text" desc="管理员账号" value={this.state.managerId} onChange={(value: string)=>{
this.setState({...this.state,...{managerId:value}})}} valid={{check:this.isNotEmpty(this.state.managerId)}}/>
<Input col={4} name="password" type="password" desc="管理员密码" value={this.state.password}
onChange={(value: string)=>{this.setState({password:value})}} valid={{check:this.isNotEmpty(this.state.password)}}/>
<Button variant="success" className="mt-3 col-2 mr-3" onClick={()=>this.register()}></Button> <Input col={4} name="confirmPwd" type="password" desc="确认密码" placeholder="请确认密码" value={this.state.confirmPwd}
onChange={(value: string)=>{this.setState({confirmPwd:value})}}
valid={{check:this.checkPwd(),
invalid:this.state.confirmPwd.length>0&&this.state.password!==this.state.confirmPwd?"密码和确认密码不一致":"验证失败"}}/>
<Button variant="info" className="mt-3 col-2" onClick={()=>this.props.toLogin()}></Button> <Button variant="success" className="mt-3 col-2 mr-3" disabled={!this.check()} onClick={()=>register(this,this.state.managerId,this.state.password)}></Button>
<Button variant="info" className="mt-3 col-2" onClick={()=>this.props.toLogin()}></Button>
</Form>
</div> </div>
<MyDialog content={this.state.tipContent} open={this.state.tipContent!=null} titleId={"register-dialog"}
menuName={"提示"} onClose={()=>this.setState({
tipContent:null
})}/>
</div> </div>
); );
} }

@ -1,11 +0,0 @@
/**
*
*/
export interface RegisterForm {
//管理员名
manager?:string;
//密码
password?:string;
//跳转登录
toLogin:Function;
}

@ -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:{
}
}

@ -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;
}
}

@ -1,20 +1,45 @@
//管理员 //管理员
export interface ManagerForm { import {PropCookie} from "./account/PropCookie";
manager:string;
export interface ManagerEntity {
managerId:string;
} }
//用户
export interface UserForm { /**
username:string; *
*/
export interface UserEntity{
//用户ID
userId:string;
//用户姓名
name:string; name:string;
sex:string; //用户年龄
age:number; age:number;
headImg:string; //用户电话
phone:number; mobile:string;
mail:string; //用户邮箱
email:string;
//住址
address: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; 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<JSX.Element>;
}
/**
*
*/
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<string>;
}

@ -16,3 +16,14 @@ code {
width: 100px; width: 100px;
height: 100px; height: 100px;
} }
/*关闭图标尺寸*/
.closeIcon40{
height: 40px;
width: 40px;
}
/*关闭图标尺寸*/
.closeIcon20{
height: 20px;
width: 20px;
}

@ -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<Q> {
result?:Result
customResult?:Q
}
/**
*
*/
export abstract class TransformData<Q,T extends JSONResponse<Q>> {
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<Q,E extends JSONResponse<Q>,T extends TransformData<Q,E>>(api:string,method:Method,formParams: {[propName:string]: string | Blob|Array<string>},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<Q>)=>{
callback(transform.transform(response))
})
}

@ -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<any,any>,managerId:string,password:string,onSuccess?:Function){
request(API.account.register,Method.POST, {
managerId:managerId,
password:password
},new RegisterTransform(),function (res:JSONResponse<RegisterRes>) {
switch (res.customResult) {
case RegisterRes.ok:
that.setState({
tipContent:<div><h3 className="text-center text-info"></h3>
{that.props.toLogin?<Button className={"col-3 ml-auto mr-auto"} block={true} onClick={()=>that.props.toLogin()}></Button>:null}</div>
})
if(onSuccess){
onSuccess()
}
break
case RegisterRes.fail:
that.setState({
tipContent:<h3 className="text-center text-danger">,</h3>
})
break
case RegisterRes.user_repeat:
that.setState({
tipContent:<h3 className="text-center text-danger">{that.state.managerId}</h3>
})
break
}
})
}

@ -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<SimpleMessage, JSONResponse<SimpleMessage>>{
protected newObject(): JSONResponse<SimpleMessage> {
return new JSONResponse<SimpleMessage>();
}
}
export abstract class EmptyBodyDiffMsg<T> extends TransformData<T, JSONResponse<T>>{}
export enum LoginMessage{
ok='ok',
fail='fail',
form_fail='form_fail',
valid_fail='valid_fail'
}
export class LoginRes extends JSONResponse<LoginMessage>{
managerId?:string
}
export class LoginTransform extends TransformData<LoginMessage,LoginRes>{
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<RegisterRes>{
protected newObject(): JSONResponse<RegisterRes> {
return new JSONResponse<RegisterRes>();
}
}
export class ManagerList extends JSONResponse<SimpleMessage>{
dataList?:Array<ManagerEntity>
}
export class ManagerTransform extends TransformData<SimpleMessage, ManagerList>{
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<PageDataMessage>{
dataList?:any;
page?:PageProps;
}
export abstract class PageDataTransform<T extends PageDataRes> extends TransformData<PageDataMessage, T>{
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<UserEntity>
}
/**
*
*/
export class FindUserTransform extends PageDataTransform<FindUserRes>{
protected newObject(): FindUserRes {
return new FindUserRes();
}
}
export class FindActivityRes extends PageDataRes{
dataList?:Array<ManagerActivity>
}
export class FindActivityTransform extends PageDataTransform<FindActivityRes>{
protected newObject(): FindActivityRes {
return new FindActivityRes();
}
}

@ -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"
}
}))
}

@ -0,0 +1,24 @@
import React from "react";
import {Tooltip} from "@material-ui/core";
import {CloseDialogProps} from "../entity";
/**
*
*/
export class CloseDialog extends React.Component<CloseDialogProps, {undefined?:undefined}>{
render() {
return (
<div className="d-flex justify-content-between p-3" >
<span className="invisible"/>
<Tooltip title="按下光标拖放弹窗到其他位置" placement="left">
<h3 id={this.props.titleId} style={{cursor:"move"}}>{this.props.menuName}</h3>
</Tooltip>
<Tooltip title="关闭弹窗" placement="left">
<img src="close.svg" alt="关闭弹窗" className="closeIcon40" onClick={()=>this.props.onClose()}/>
</Tooltip>
</div>
)
}
}

@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import {InputGroup,FormControl} from 'react-bootstrap' import {FormControl, InputGroup} from 'react-bootstrap'
import {InputFormDesc} from "./LoginFormDesc"; import {FormInputProps} from "../entity";
const defaultValid={ const defaultValid={
@ -11,7 +11,7 @@ const defaultValid={
/** /**
* bootstrap InputGroup组件封装 * bootstrap InputGroup组件封装
*/ */
export class Input extends React.Component<InputFormDesc, any>{ export class Input extends React.Component<FormInputProps, { undefined?:undefined }>{
merge(){ merge(){
return {...defaultValid,...this.props.valid} return {...defaultValid,...this.props.valid}
@ -27,12 +27,16 @@ export class Input extends React.Component<InputFormDesc, any>{
render() { render() {
return ( return (
<InputGroup className="col-7 ml-auto mr-auto mt-3"> <InputGroup className={"col-"+(this.props.col||7)+" ml-auto mr-auto mt-3"}>
<InputGroup.Prepend> <InputGroup.Prepend>
<InputGroup.Text id={this.props.name}>{this.props.desc}</InputGroup.Text> <InputGroup.Text id={this.props.name}>{this.props.desc}</InputGroup.Text>
</InputGroup.Prepend> </InputGroup.Prepend>
<FormControl className={this.valid()} type={this.props.type} placeholder={'请输入'+this.props.desc} aria-describedby={this.props.name} value={this.props.value} <FormControl autoComplete={this.props.name} className={this.valid()} type={this.props.type} as={this.props.as}
onChange={(e)=>this.props.onChange(e.target.value)}/> placeholder={(this.props.placeholder||"").length>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}
</FormControl>
<div className="valid-feedback text-center"> <div className="valid-feedback text-center">
{this.merge().valid} {this.merge().valid}
</div> </div>

@ -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<MyDialogProps, { undefined?:undefined }>{
render() {
return (
<Dialog
hideBackdrop={true}
open={this.props.open}
PaperComponent={(props)=>
<Draggable handle={"#"+this.props.titleId} cancel={'[class*="MuiDialogContent-root"]'}>
<Paper {...props} />
</Draggable>}
aria-labelledby={this.props.titleId}
classes={{paper:"w-100"}}
>
<CloseDialog menuName={this.props.menuName} onClose={()=>this.props.onClose()} titleId={this.props.titleId}/>
<div className="p-3">
{this.props.content}
</div>
</Dialog>
);
}
}

@ -0,0 +1,21 @@
import {PageClickProps} from "../entity";
import React from "react";
import {Pagination} from "react-bootstrap";
/**
*
*/
export class Page extends React.Component<PageClickProps, { undefined?:undefined }>{
render() {
return (
<Pagination className="justify-content-center">
{this.props.currentPage===1?<Pagination.First disabled/>:<Pagination.First onClick={()=>this.props.onClick(1)}/>}
{this.props.currentPage>1?<Pagination.Prev onClick={()=>this.props.onClick(this.props.currentPage-1)}/>:<Pagination.Prev disabled/>}
<Pagination.Item active>{this.props.currentPage}</Pagination.Item>
{this.props.currentPage<this.props.totalPage?<Pagination.Next onClick={()=>this.props.onClick(this.props.currentPage+1)}/>:<Pagination.Next disabled/>}
{this.props.currentPage===this.props.totalPage?<Pagination.Last disabled/>:<Pagination.Last onClick={()=>this.props.onClick(this.props.totalPage)}/>}
</Pagination>
);
}
}

@ -995,6 +995,13 @@
dependencies: dependencies:
regenerator-runtime "^0.13.4" 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": "@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6":
version "7.8.6" version "7.8.6"
resolved "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" 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" resolved "https://registry.npm.taobao.org/@csstools/normalize.css/download/@csstools/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18"
integrity sha1-8JULuhiBlRLUL3GX5WxRiqSRzxg= 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": "@hapi/address@2.x.x":
version "2.1.4" 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" 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" "@types/yargs" "^15.0.0"
chalk "^3.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": "@mrmlnc/readdir-enhanced@^2.2.1":
version "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" 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" resolved "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs= 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": "@sheerun/mutationobserver-shim@^0.3.2":
version "0.3.3" version "0.3.3"
resolved "https://registry.npm.taobao.org/@sheerun/mutationobserver-shim/download/@sheerun/mutationobserver-shim-0.3.3.tgz#5405ee8e444ed212db44e79351f0c70a582aae25" 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" 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= 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": "@types/eslint-visitor-keys@^1.0.0":
version "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" 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/minimatch" "*"
"@types/node" "*" "@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": "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
version "2.0.2" version "2.0.2"
resolved "https://registry.npm.taobao.org/@types/istanbul-lib-coverage/download/@types/istanbul-lib-coverage-2.0.2.tgz#79d7a78bad4219f4c03d6557a1c72d9ca6ba62d5" 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" resolved "https://registry.npm.taobao.org/@types/node/download/@types/node-12.12.39.tgz#532d25c1e639d89dd6f3aa1d7b3962e3e7fa943d"
integrity sha1-Uy0lweY52J3W86odezli4+f6lD0= 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": "@types/parse-json@^4.0.0":
version "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" resolved "https://registry.npm.taobao.org/@types/parse-json/download/@types/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
@ -1525,7 +1644,14 @@
dependencies: dependencies:
"@types/react" "*" "@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" 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" 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= integrity sha1-oIMNFy6Krdm9QXCboigaMSS702g=
@ -1561,6 +1687,11 @@
"@types/testing-library__dom" "*" "@types/testing-library__dom" "*"
pretty-format "^25.1.0" 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@*": "@types/yargs-parser@*":
version "15.0.0" 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" 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" resolved "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= 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: brace-expansion@^1.1.7:
version "1.1.11" version "1.1.11"
resolved "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 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" split-string "^3.0.2"
to-regex "^3.0.1" to-regex "^3.0.1"
braces@~3.0.2: braces@^3.0.1, braces@~3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc= integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc=
@ -2835,6 +2971,11 @@ class-utils@^0.3.5:
isobject "^3.0.0" isobject "^3.0.0"
static-extend "^0.1.1" 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: clean-css@^4.2.3:
version "4.2.3" version "4.2.3"
resolved "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" 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" kind-of "^6.0.2"
shallow-clone "^3.0.0" 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: co@^4.6.0:
version "4.6.0" version "4.6.0"
resolved "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 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" 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= 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: copy-concurrently@^1.0.0:
version "1.0.5" version "1.0.5"
resolved "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" 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" mdn-data "2.0.6"
source-map "^0.6.1" 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: css-what@2.1:
version "2.1.3" version "2.1.3"
resolved "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" 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: dependencies:
cssom "0.3.x" 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" 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" 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= integrity sha1-5jr1DmbXwmbttrMpCc/Qqr4Dkos=
@ -3706,6 +3865,14 @@ dom-converter@^0.2:
dependencies: dependencies:
utila "~0.4" 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: dom-serializer@0:
version "0.2.2" version "0.2.2"
resolved "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" 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-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1" 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: hosted-git-info@^2.1.4:
version "2.8.8" version "2.8.8"
resolved "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" 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" lodash "^4.17.11"
micromatch "^3.1.10" 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: http-proxy@^1.17.0:
version "1.18.0" version "1.18.0"
resolved "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" 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" follow-redirects "^1.0.0"
requires-port "^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: http-signature@~1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 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" resolved "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= 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: iconv-lite@0.4.24, iconv-lite@^0.4.24:
version "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" 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: dependencies:
is-extglob "^2.1.1" 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: is-number@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 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" json-schema "0.2.3"
verror "1.10.0" 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: jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3:
version "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" 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: dependencies:
p-locate "^4.1.0" 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: lodash._reinterpolate@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.npm.taobao.org/lodash._reinterpolate/download/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 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" snapdragon "^0.8.1"
to-regex "^3.0.2" 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: miller-rabin@^4.0.0:
version "4.0.1" version "4.0.1"
resolved "https://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" 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" resolved "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 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" 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" 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= integrity sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=
@ -7617,6 +7903,11 @@ pnp-webpack-plugin@1.6.4:
dependencies: dependencies:
ts-pnp "^1.1.6" 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: portfinder@^1.0.25:
version "1.0.26" version "1.0.26"
resolved "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" 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" kleur "^3.0.3"
sisteransi "^1.0.4" 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" version "15.7.2"
resolved "https://registry.npm.taobao.org/prop-types/download/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" resolved "https://registry.npm.taobao.org/prop-types/download/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha1-UsQedbjIfnK52TYOAga5ncv/psU= integrity sha1-UsQedbjIfnK52TYOAga5ncv/psU=
@ -8541,6 +8840,34 @@ react-app-polyfill@^1.0.6:
regenerator-runtime "^0.13.3" regenerator-runtime "^0.13.3"
whatwg-fetch "^3.0.0" 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: react-dev-utils@^10.2.1:
version "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" 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" prop-types "^15.6.2"
scheduler "^0.19.1" 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: react-error-overlay@^6.0.7:
version "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" 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= 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" version "16.13.1"
resolved "https://registry.npm.taobao.org/react-is/download/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" resolved "https://registry.npm.taobao.org/react-is/download/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha1-eJcppNw23imZ3BVt1sHZwYzqVqQ= 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: react-scripts@3.4.1:
version "3.4.1" version "3.4.1"
resolved "https://registry.npm.taobao.org/react-scripts/download/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a" 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: optionalDependencies:
fsevents "2.1.2" 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: react@^16.13.1:
version "16.13.1" version "16.13.1"
resolved "https://registry.npm.taobao.org/react/download/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" 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" resolved "https://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= 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: tmp@^0.0.33:
version "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" 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" 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= 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: unicode-canonical-property-names-ecmascript@^1.0.4:
version "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" 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: dependencies:
imurmurhash "^0.1.4" 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: universalify@^0.1.0:
version "0.1.2" 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" 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: dependencies:
makeerror "1.0.x" 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: watchpack-chokidar2@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" resolved "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"

Loading…
Cancel
Save