login.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import React, { useState } from 'react'
  2. import '../assets/css/login.css'
  3. import SchoolImg from '../assets/image/school.png'
  4. import UserImg from '../assets/image/user.png'
  5. import PassworldImg from '../assets/image/passworld.png'
  6. import config from '../config'
  7. import { Alert, CircularProgress } from '@mui/joy';
  8. import qs from 'qs';
  9. import axios from 'axios'
  10. // eslint-disable-next-line no-useless-escape
  11. const regEmail = new RegExp("^[A-Za-z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$");
  12. // const regpass = new RegExp(/^(?=.*\d)(?=.*[A-Za-z]).{6,}$/);
  13. function Login(props) {
  14. const [school, setSchool] = useState('')
  15. const [user, setUser] = useState('')
  16. const [passworld, setPassworld] = useState('')
  17. const [timer, setTimer] = useState(0)
  18. const [schoolNum, setSchoolNum] = useState('')
  19. const [schoolName, setSchoolName] = useState('')
  20. const [schoolShow, setSchoolShow] = useState(false)
  21. const [progressValue, setProgressValue] = useState(0)
  22. const [loading, setLoading] = useState(false)
  23. const [alertStr, setAlertStr] = useState('')
  24. const [alertShow, setAlertShow] = useState(false)
  25. const showAlert = (str) => {
  26. setAlertStr(str)
  27. setAlertShow(true)
  28. setTimeout(() => {
  29. setAlertShow(false)
  30. }, 1500);
  31. }
  32. // 登录
  33. const login = () => {
  34. console.log('login')
  35. let schoolStr = schoolNum ? ('@' + schoolNum) : '@cocorobo.cc'
  36. let email = ''
  37. let str = user.replace(/(^\s*)|(\s*$)/g, "")
  38. if (!regEmail.test(str)) {
  39. email = str + schoolStr
  40. } else {
  41. email = str
  42. }
  43. if (passworld.length < 6 || /[\u4e00-\u9fa5]/.test(passworld)) {
  44. // this.geetestRegister();
  45. showAlert(props.lang.passwordError)
  46. return;
  47. }
  48. setLoading(true)
  49. let progressTimer = setInterval(() => {
  50. setProgress()
  51. }, 100);
  52. let aa = window.location.hostname.indexOf('cocorobo.cn') > -1||window.location.hostname.indexOf('localhost') > -1
  53. let params = {
  54. loginUsername: email.trim(),
  55. // loginPassword: passworld.trim(),
  56. loginPassword: aa ? window.btoa(passworld.trim()) : passworld.trim(),
  57. geetest_challenge: "",
  58. geetest_validate: "",
  59. geetest_seccode: ""
  60. }
  61. axios.defaults.withCredentials = true;
  62. axios.post(`${config.api}api/user`, qs.stringify(params)).then(res => {
  63. clearInterval(progressTimer)
  64. if (res.data.length > 0) {
  65. setProgressValue(100)
  66. showAlert(props.lang.loginSuccess)
  67. setAlertShow(true)
  68. setTimeout(() => {
  69. setLoading(false)
  70. setProgressValue(0)
  71. setAlertShow(false)
  72. postMessageToParent('loginVerify', 'logged', res.data[0][0])
  73. }, 1000)
  74. } else {
  75. setLoading(false)
  76. setProgressValue(0)
  77. showAlert(res)
  78. setAlertShow(true)
  79. setTimeout(() => {
  80. setAlertShow(false)
  81. }, 1500);
  82. }
  83. }).catch(err => {
  84. setProgressValue(0)
  85. clearInterval(progressTimer)
  86. setLoading(false)
  87. showAlert(props.lang.loginError)
  88. console.log(err)
  89. })
  90. }
  91. const postMessageToParent = (id, status, data) => {
  92. //TODO: replace origin
  93. let result = {
  94. id,
  95. status,
  96. data
  97. }
  98. window.parent.postMessage(result, '*')
  99. }
  100. const schoolChange = (e) => {
  101. let value = e.target.value
  102. if (value) {
  103. clearTimeout(timer)
  104. setTimer(setTimeout(() => {
  105. getSchool(value)
  106. }, 500))
  107. } else {
  108. setSchoolShow(false)
  109. }
  110. setSchool(e.target.value)
  111. }
  112. const getSchool = e => {
  113. // 获取学校信息
  114. axios.post(`${config.edu}admin/selectorganize`, qs.stringify({ mode: e })).then(res => {
  115. console.log(res)
  116. if (res.data.length > 0) {
  117. setSchoolNum(res.data[0][0].mail)
  118. setSchoolName(res.data[0][0].name)
  119. setSchoolShow(true)
  120. } else {
  121. setSchoolName(props.lang.notSchool)
  122. setSchoolNum("")
  123. setSchoolShow(true)
  124. }
  125. }).catch(err => {
  126. setSchoolName(props.lang.notSchool)
  127. setSchoolNum("")
  128. setSchoolShow(true)
  129. })
  130. }
  131. const userChange = (e) => {
  132. setUser(e.target.value)
  133. }
  134. const passworldChange = (e) => {
  135. setPassworld(e.target.value)
  136. }
  137. const setProgress = () => {
  138. let num = progressValue + 10
  139. if (num > 80) {
  140. num = 85
  141. }
  142. setProgressValue(num)
  143. }
  144. const enter = (e) => {
  145. if (e.keyCode === 13) {
  146. login()
  147. }
  148. }
  149. return (
  150. <div className="login" onKeyDown={enter}>
  151. {(alertShow || props.alertShow) && <div className='login-Progress'>
  152. <Alert color="danger">{alertStr || props.alertStr}</Alert>
  153. </div>}
  154. {loading && <div className='login-Progress'>
  155. <CircularProgress size="lg" determinate value={progressValue}></CircularProgress>
  156. </div>}
  157. <div className='login-input'>
  158. <img src={SchoolImg} alt="school" />
  159. <input onChange={schoolChange} type="text" onBlur={schoolChange} placeholder={props.lang.schoolName} value={school} />
  160. {schoolShow && <p style={{ marginTop: 5, textAlign: 'left' }}>{schoolName}</p>}
  161. </div>
  162. <div className='login-input'>
  163. <img src={UserImg} alt="user" />
  164. <input type="text" onChange={userChange} placeholder={props.lang.username} value={user} />
  165. </div>
  166. <div className='login-input'>
  167. <img src={PassworldImg} alt="passworld" />
  168. <input type="Password" onChange={passworldChange} placeholder={props.lang.password} value={passworld} />
  169. </div>
  170. <div className='login-input'>
  171. <button onClick={login}>{props.lang.login}</button>
  172. </div>
  173. </div>
  174. )
  175. }
  176. export default Login;