study_xxqg/web/xxqg/src/App.tsx

375 lines
9.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, {Component} from 'react';
import './App.css';
import {Button, Dialog, Divider, Form, Input, List, Modal, NavBar, Popup, TextArea, Toast,} from "antd-mobile";
import {UnorderedListOutline} from "antd-mobile-icons";
import {ListItem} from "antd-mobile/es/components/list/list-item";
import {checkQrCode, getLog, getScore, getToken, getUsers, getLink, stopStudy, study, login, checkToken} from "./utils/api";
import QrCode from 'qrcode.react';
class App extends React.Component<any, any> {
constructor(props: any) {
super(props);
this.state = {
popup_visible: false,
index: "login",
is_login: false
};
}
set_login = ()=>{
this.setState({
is_login: true
})
}
componentDidMount() {
checkToken().then((t) =>{
console.log(t)
if (t){
this.set_login()
}
})
}
render() {
let home = (
<>
<NavBar style={{background: "#c0a8c0", margin: 10}} backArrow={false}
left={<UnorderedListOutline fontSize={36} onClick={this.back}/>}>
{"study_xxqg"}
</NavBar>
<Router data={this.state.index}/>
<Popup
bodyStyle={{width: '50vw'}}
visible={this.state.popup_visible}
position={"left"}
onMaskClick={(() => {
this.setState({popup_visible: false})
})}>
<h1 style={{textAlign:"center"}}>XXQG</h1>
<List>
<ListItem onClick={()=>{this.setState({"index":"login"})}}></ListItem>
<ListItem onClick={()=>{this.setState({"index":"user_list"})}}></ListItem>
<ListItem onClick={()=>{this.setState({"index":"config"})}}></ListItem>
<ListItem onClick={()=>{this.setState({"index":"log"})}}></ListItem>
<ListItem onClick={()=>{this.setState({"index":"help"})}}></ListItem>
<ListItem onClick={()=>{
window.localStorage.removeItem("xxqg_token")
this.setState({
is_login: false
})
}}>退</ListItem>
</List>
</Popup>
</>
)
if (this.state.is_login) {
return home
} else {
return <Login parent={this}/>
}
}
back = () => {
this.setState({
popup_visible: true,
})
}
}
class Login extends Component<any, any>{
constructor(props: any) {
super(props);
this.state = {
img : "你还未获取登录链接"
};
}
onFinish = (value:string)=>{
login(JSON.stringify(value)).then(resp => {
console.log(resp)
if (resp.success){
window.localStorage.setItem("xxqg_token",resp.data)
this.props.parent.set_login()
}else {
Dialog.show(resp.message)
}
})
}
render() {
return <>
<Form
onFinish = {this.onFinish}
footer={
<Button block type='submit' color='primary' size='large'>
</Button>
}
>
<Form.Header><h1>XXQG </h1></Form.Header>
<Form.Item name='account' label='账号' rules={[{ required: true }]}>
<Input placeholder='请输入账号' />
</Form.Item>
<Form.Item name='password' label='密码' rules={[{ required: true }]}>
<Input placeholder='请输入密码' type={"password"}/>
</Form.Item>
</Form>
</>;
}
}
class Router extends Component<any, any>{
constructor(props: any) {
super(props);
this.state = {
img : "你还未获取登录链接"
};
}
isWechat = ()=> {
if (/MicroMessenger/i.test(window.navigator.userAgent)){
return "inline"
}else {
return "none"
}
}
render() {
let login = <>
<h2 style={{margin:10,color:"red",display:this.isWechat()}}></h2>
<Button onClick={this.click} color={"primary"} style={{margin:10,marginRight:10}} block></Button>
<QrCode style={{margin:10}} fgColor={"#000000"} size={200} value={this.state.img} />
</>;
let userList = <Users data={"12"}/>;
let config = <h1></h1>
let help = <Help />
let log = <Log />
if (this.props.data === "login"){
return login;
}else if (this.props.data === "user_list"){
return userList;
}else if (this.props.data === "help"){
return help;
} else if (this.props.data === "log"){
return log;
} else {
return config;
}
}
componentWillUnmount() {
if (this.state.check !== undefined){
clearInterval(this.state.check)
}
}
click = async () => {
let data = await getLink()
this.setState({
img: data.url
})
let check = setInterval(async ()=>{
let resp = await checkQrCode(data.code);
if (resp.success){
clearInterval(check)
console.log("登录成功")
console.log(resp.data)
let token = await getToken(resp.data.split("=")[1],data.sign)
console.log(token)
if (token.success){
Toast.show("登录成功")
}
}
},5000)
this.setState({
check: check
})
setTimeout(()=>{
clearInterval(check)
},1000*300)
let element = document.createElement("a");
element.href = "dtxuexi://appclient/page/study_feeds?url="+escape(data.url)
element.click()
}
}
class Log extends Component<any, any>{
constructor(props:any) {
super(props);
this.state = {
data : ""
}
}
reverse = ( str:string ):string=>{
return str.split("\n").reverse().join("\n").trim()
};
timer: any
componentDidMount() {
getLog().then(data=>{
this.setState({
data:this.reverse(data)
})
})
this.timer = setInterval(()=>{
getLog().then((data:string)=>{
this.setState({
data:this.reverse(data)
})
})
},30000)
}
componentWillUnmount() {
clearInterval(this.timer)
}
render() {
return <>
<TextArea style={{margin:10}} autoSize disabled={true} value={this.state.data}/>
</>
}
}
class Help extends Component<any, any> {
render() {
return <>
<h2 style={{margin:10}}><a href="https://github.com/johlanse/study_xxqg">https://github.com/johlanse/study_xxqg</a></h2>
</>
}
}
class Users extends Component<any, any>{
constructor(props: any) {
super(props);
this.state = {
users:[]
};
}
componentDidMount() {
getUsers().then(users =>{
console.log(users)
this.setState({
users: users.data
})
})
}
format = (value:any)=> {
const date = new Date(value*1000);
let y = date.getFullYear(),
m = date.getMonth() + 1,
d = date.getDate(),
h = date.getHours(),
i = date.getMinutes(),
s = date.getSeconds();
if (m < 10) { m = parseInt('0') + m; }
if (d < 10) { d = parseInt('0') + d; }
if (h < 10) { h = parseInt('0') + h; }
if (i < 10) { i = parseInt('0') + i; }
if (s < 10) { s = parseInt('0') + s; }
return y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s;
}
getScore = (token:string,nick:string)=>{
getScore(token).then((data)=>{
console.log(data)
Modal.alert({
title: nick,
content: data.data,
closeOnMaskClick: true,
})
})
}
checkStudy = (is_study:boolean)=>{
if (is_study){
return "停止学习"
}else {
return "开始学习"
}
}
checkStudyColor = (is_study:boolean)=>{
if (is_study){
return "danger"
}else {
return "primary"
}
}
study = (uid:string,is_study:boolean) =>{
if (!is_study){
study(uid).then(()=>{
Toast.show("开始学习成功")
getUsers().then(users =>{
console.log(users)
this.setState({
users: users.data
})
})
})
}else {
stopStudy(uid).then(()=>{
Toast.show("已停止学习")
getUsers().then(users =>{
console.log(users)
this.setState({
users: users.data
})
})
})
}
}
render() {
let elements = []
for (let i = 0; i < this.state.users.length; i++) {
elements.push(
<>
<ListItem key={this.state.users[i].uid} style={{border:"blue soild 1px"}}>
<h3>{this.state.users[i].nick}</h3>
<h3>UID: {this.state.users[i].uid}</h3>
<h3>{this.format(this.state.users[i].login_time)}</h3>
<Button onClick={this.study.bind(this,this.state.users[i].uid,this.state.users[i].is_study)} color={this.checkStudyColor(this.state.users[i].is_study)} block={true}>
{this.checkStudy(this.state.users[i].is_study)}
</Button>
<br />
<Button onClick={this.getScore.bind(this,this.state.users[i].token,this.state.users[i].nick)} color={"success"} block={true}></Button>
</ListItem>
<Divider />
</>
)
}
return <List>{elements}</List>;
}
}
export default App;