From 1b66a5467a380602a3ac88da8753f06d0ba1c68e Mon Sep 17 00:00:00 2001 From: wzhqwq Date: Fri, 30 Jul 2021 13:08:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BC=BA=E5=88=B6=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC=E7=99=BB=E5=BD=95=E9=A1=B5=E9=9D=A2=E3=80=81=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + public/image/user.jpg | Bin 0 -> 33775 bytes src/App.css | 20 +++++++- src/App.js | 46 +++++++++++++----- src/components/Spinner/spinner.css | 4 +- src/components/UserControl/UserControl.js | 53 +++++++++++++++++++++ src/components/UserControl/userControl.css | 19 ++++++++ src/helper/Context.js | 3 ++ src/helper/axios.js | 21 ++++---- src/login/login.js | 42 ++++++++++++---- src/resources.json | 3 +- src/upload/upload.css | 20 -------- src/upload/upload.js | 6 +-- 13 files changed, 178 insertions(+), 60 deletions(-) create mode 100644 public/image/user.jpg create mode 100644 src/components/UserControl/UserControl.js create mode 100644 src/components/UserControl/userControl.css create mode 100644 src/helper/Context.js diff --git a/package.json b/package.json index bc6efbb..2f44883 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "axios": "^0.21.1", "cra-template": "1.1.2", "dotenv": "^10.0.0", + "qs": "^6.10.1", "react": "^17.0.2", "react-dom": "^17.0.2", "react-scripts": "4.0.3", diff --git a/public/image/user.jpg b/public/image/user.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70c639ecd2bacd659c60f12a3a9159c7f01f4155 GIT binary patch literal 33775 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 Q$^YLn{2vR+_;2Qa02+X(a{vGU literal 0 HcmV?d00001 diff --git a/src/App.css b/src/App.css index a3a1b19..593f7a0 100644 --- a/src/App.css +++ b/src/App.css @@ -5,6 +5,7 @@ a.btn { color: white !important; border-radius: .3em; padding: .375em 0; + line-height: 1.5em; font-size: 1.1em; cursor: pointer; transition: filter .3s ease-out; @@ -14,7 +15,7 @@ a.btn { } .btn:disabled { cursor: not-allowed; - filter: grayscale(100%); + filter: grayscale(100%) opacity(.5); } .btn:active { color: white !important; @@ -57,4 +58,19 @@ button.btn { .btn-straight { border-radius: .15em; width: 6em; -} \ No newline at end of file +} + +.sdu, +.user { + height: 100%; + display: flex; + align-items: center; +} +.sdu-logo, +.user-logo { + height: 100%; +} +.sdu-name { + height: 30px; + margin-left: 10px; +} diff --git a/src/App.js b/src/App.js index 74f0baf..62e5dcf 100644 --- a/src/App.js +++ b/src/App.js @@ -1,21 +1,43 @@ import './App.css'; -import { Route, SingleRouter } from './components/SingleRouter/SingleRouter'; +import { Redirect, Route, SingleRouter } from './components/SingleRouter/SingleRouter'; import { AppContainer } from './index/index'; import { UploadContainer } from './upload/upload'; import { LogInContainer } from './login/login'; import { ReviewContainer } from './review/review'; -import History from './helper/history'; +import { Component } from 'react'; +import { UserContext } from './helper/Context'; -function App() { - // TODO check login - return ( - - - - - - - ); +class App extends Component { + constructor(props) { + super(props); + this.state = { + name: '', + role: -1 + }; + this.setUserData = this.setUserData.bind(this); + } + + setUserData({ name, role }) { + this.setState({ name, role }); + } + + render() { + return ( + + + + + + + + + + ); + } +} + +function CheckLogIn() { + return localStorage.getItem('jwt') ? null : ; } export default App; diff --git a/src/components/Spinner/spinner.css b/src/components/Spinner/spinner.css index daab551..92481c2 100644 --- a/src/components/Spinner/spinner.css +++ b/src/components/Spinner/spinner.css @@ -1,6 +1,6 @@ .spinner { - width: 20px; - height: 20px; + width: 1.5em; + height: 1.5em; margin: 0 auto; } .spinner > svg { diff --git a/src/components/UserControl/UserControl.js b/src/components/UserControl/UserControl.js new file mode 100644 index 0000000..bda17fc --- /dev/null +++ b/src/components/UserControl/UserControl.js @@ -0,0 +1,53 @@ +import './userControl.css'; +import { images } from '../../resources.json'; +import { UserContext } from '../../helper/Context'; +import Spinner from '../Spinner/Spinner'; +import { get } from '../../helper/axios'; +import { apis } from '../../helper/apis'; +import { alert } from '../../helper/alert'; + +export default function UserControl(props) { + return ( + + {({ userData, setUserData }) => ( + userData.role === 2 + ? ( +
+ +
+ ) : ( +
+ { + userData.role === -1 + ? ( + + ) : ( +
+ user avatar +
+ ) + } +
{userData.name || "加载中"}
+ { + (() => { + if (userData.role !== -1) return null; + get(apis.getProfile).then(({ data, status, networkStatus }) => { + if (networkStatus !== 200) return; + if (!status) return alert('获取用户信息失败:' + data + ',请稍候刷新再试'); + setUserData({ + name: data.realName, + role: data.role + }); + }); + return null; + })() + } +
+ ) + )} +
+ ); +} \ No newline at end of file diff --git a/src/components/UserControl/userControl.css b/src/components/UserControl/userControl.css new file mode 100644 index 0000000..b014fe7 --- /dev/null +++ b/src/components/UserControl/userControl.css @@ -0,0 +1,19 @@ +.user-name { + height: 100%; + font-size: 18px; + height: 50px; + line-height: 50px; + color: white; + margin-left: 10px; +} + +.user-avatar { + width: 40px; + height: 40px; +} + +.user-avatar > img { + border-radius: 50%; + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/src/helper/Context.js b/src/helper/Context.js new file mode 100644 index 0000000..92e7865 --- /dev/null +++ b/src/helper/Context.js @@ -0,0 +1,3 @@ +import { createContext } from "react"; + +export const UserContext = createContext({}); \ No newline at end of file diff --git a/src/helper/axios.js b/src/helper/axios.js index ef983ff..454c358 100644 --- a/src/helper/axios.js +++ b/src/helper/axios.js @@ -1,11 +1,13 @@ import axios from 'axios'; import { failed } from './alert'; +import qs from 'qs'; +import History from './history'; export function get(url) { return send( axios.get(url, { headers: { - Authorization: 'Bearer ' + localStorage.getItem('jwt'), + Authorization: localStorage.getItem('jwt'), "Allow-Control-Allow-Origin": "*" } }), @@ -14,9 +16,9 @@ export function get(url) { } export function post(url, data) { return send( - axios.post(url, data, { + axios.post(url, qs.stringify(data), { headers: { - Authorization: 'Bearer ' + localStorage.getItem('jwt'), + Authorization: localStorage.getItem('jwt'), "Allow-Control-Allow-Origin": "*" } }), @@ -33,6 +35,7 @@ async function send(xhr, retryFunc) { } try { const { data } = await xhr; + console.log("recv: ", data); return { ...data, networkStatus: 200 @@ -43,16 +46,16 @@ async function send(xhr, retryFunc) { networkStatus: err?.response?.status ?? -1, status: false }; + if (err?.response?.status === 401) { + History.force('/login'); + return failData; + } waitToSend.push(retryFunc); if (err.message === 'Network Error') return await failed('您的设备似乎断网了,请检查网络后重试或刷新', flushWaitList) || failData; - else if (err?.response?.status === 401) - History.force('/login'); - else if (err?.response?.status === 504) + if (err?.response?.status === 504) return await failed('请求超时,请耐心等待几秒后重试或刷新', flushWaitList) || failData; - else - return await failed('服务器出现问题,请稍后重试或刷新', flushWaitList) || failData; - return failData; + return await failed('服务器出现问题,请稍后重试或刷新', flushWaitList) || failData; } } diff --git a/src/login/login.js b/src/login/login.js index fc20626..d3f5b7d 100644 --- a/src/login/login.js +++ b/src/login/login.js @@ -1,4 +1,8 @@ import { Component } from 'react'; +import { apis } from '../helper/apis'; +import { post } from '../helper/axios'; +import History from '../helper/history'; +import Spinner from '../components/Spinner/Spinner'; import './login.css'; export class LogInContainer extends Component { @@ -7,6 +11,7 @@ export class LogInContainer extends Component { this.state = { username: '', password: '', + processing: false, error: false, errorMessage: '', }; @@ -20,40 +25,57 @@ export class LogInContainer extends Component { handleSubmit(e) { e.preventDefault(); const { username, password } = this.state; - this.props.login(username, password); + if (!username) + return this.setState({ error: true, errorMessage: '学号不能为空' }); + if (!password) + return this.setState({ error: true, errorMessage: '密码不能为空' }); + if (!username.match(/^\d*$/)) + return this.setState({ error: true, errorMessage: '学号必须为数字' }); + this.setState({ processing: true }); + post(apis.login, { username, password }).then(({ data, status, networkStatus }) => { + this.setState({ processing: false }); + if (networkStatus !== 200) return; + if (!status) return this.setState({ error: true, errorMessage: data }); + localStorage.setItem('jwt', data); + History.replace('/'); + }); } render() { - const { error, errorMessage } = this.state; + const { error, errorMessage, processing } = this.state; return (
-

Login

+

登录

-
-
- {error && -
+
{errorMessage}
} diff --git a/src/resources.json b/src/resources.json index b43a718..a1589c4 100644 --- a/src/resources.json +++ b/src/resources.json @@ -2,6 +2,7 @@ "images": { "poster": "image/poster.jpg", "icon": "image/sdu_icon.png", - "name": "image/sdu_name.png" + "name": "image/sdu_name.png", + "avatar": "image/user.jpg" } } \ No newline at end of file diff --git a/src/upload/upload.css b/src/upload/upload.css index f565873..e4c367c 100644 --- a/src/upload/upload.css +++ b/src/upload/upload.css @@ -8,26 +8,6 @@ background-color: #9D0004; } -.sdu, -.user { - height: 100%; - display: flex; - align-items: center; -} -.sdu-logo, -.user-logo { - height: 100%; -} -.sdu-name { - height: 40px; - margin-left: 10px; -} -.user-name { - height: 100%; - line-height: 60px; - font-size: 24px; -} - .content { width: 800px; margin: 0 auto; diff --git a/src/upload/upload.js b/src/upload/upload.js index f4e87b5..3e2d832 100644 --- a/src/upload/upload.js +++ b/src/upload/upload.js @@ -7,6 +7,7 @@ import { alert } from '../helper/alert'; import { images } from '../resources.json'; import './upload.css'; +import UserControl from '../components/UserControl/UserControl'; export class UploadContainer extends Component { constructor(props) { @@ -60,10 +61,7 @@ export class UploadContainer extends Component { logo
-
- avatar -
-
+