index.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <template>
  2. <div class="grid full login-view">
  3. <div class="login-modal">
  4. <div class="p-l-large p-r-large login-modal-header">
  5. <span>欢迎登录</span>
  6. <span class="version">版本号:V{{ version }}</span>
  7. </div>
  8. <div class="login-modal-content">
  9. <base-form
  10. ref="formRef"
  11. :model="loginModel"
  12. :disabled="loading"
  13. :items="formItems"
  14. :rules="loginRules"
  15. size="large"
  16. >
  17. <template #form-item-password>
  18. <el-input
  19. ref="pwdRef"
  20. v-model="loginModel.password"
  21. type="password"
  22. clearable
  23. placeholder="请输入登录密码"
  24. show-password
  25. @keydown="pwdKeyDown"
  26. ></el-input>
  27. </template>
  28. <el-button type="primary" class="full-w m-t-base" :loading="loading" @click="onSubmit"> 立即登录 </el-button>
  29. </base-form>
  30. </div>
  31. </div>
  32. </div>
  33. </template>
  34. <script setup lang="ts" name="Login">
  35. import { reactive, shallowRef, ref } from 'vue'
  36. import { useRouter } from 'vue-router'
  37. import { ElButton, ElInput } from 'element-plus'
  38. import BaseForm from '@/components/element/BaseForm.vue'
  39. import useMainStore from '@/store/main'
  40. import useMainLayoutStore from '@/store/layout'
  41. import useFetch from '@/hooks/useFetch'
  42. import useForm from '@/hooks/useForm'
  43. import { sessionStorage, localStorage } from '@/plugins/storage'
  44. import { initConfigModelData } from '@/utils/common'
  45. import type { EpFormItem, EpFormRules } from 'global-type'
  46. import type { ExtractApiParams, ExtractApiResponse } from '@/api/api'
  47. const pwdRef = ref(null)
  48. const { replace } = useRouter()
  49. const mainStore = useMainStore()
  50. const mainLayoutStore = useMainLayoutStore()
  51. const { loading, fetch: login } = useFetch('userLogin')
  52. const { result: version, fetch: fetchVersion } = useFetch('getVersion', 'get')
  53. fetchVersion()
  54. const { formRef, elFormRef } = useForm()
  55. const loginModel = reactive<ExtractApiParams<'userLogin'>>({ loginName: '', password: '' })
  56. const loginRules: EpFormRules = {
  57. loginName: [{ required: true, message: '请输入登录账号' }],
  58. password: [{ required: true, message: '请输入登录密码' }],
  59. }
  60. const formItems = shallowRef<EpFormItem[]>([
  61. {
  62. slotType: 'input',
  63. prop: 'loginName',
  64. slot: {
  65. placeholder: '请输入登录账号',
  66. onKeydown(event: any) {
  67. if (event.keyCode == 13) {
  68. if (loginModel.password.length > 0) {
  69. onSubmit()
  70. } else {
  71. ;(pwdRef.value as any).ref.focus()
  72. }
  73. }
  74. },
  75. },
  76. },
  77. {
  78. prop: 'password',
  79. slotName: 'password',
  80. },
  81. ])
  82. const pwdKeyDown = (e: any) => {
  83. if (e.key === 'Enter') {
  84. onSubmit()
  85. }
  86. }
  87. async function onSubmit() {
  88. if (!elFormRef?.value) {
  89. return
  90. }
  91. try {
  92. await elFormRef.value.validate()
  93. const loginResult = await login(loginModel)
  94. loginSuccess(loginResult)
  95. } catch (error) {
  96. console.error(error)
  97. }
  98. }
  99. function loginSuccess(loginInfo: ExtractApiResponse<'userLogin'>) {
  100. mainStore.setMarkerPausedLimit(loginInfo.markerPausedLimit || 0)
  101. /** sessionStorage 缓存login result */
  102. sessionStorage.set('LOGIN_RESULT', loginInfo)
  103. let config: any = localStorage.get('USER_CONFIG')
  104. if (!config) {
  105. localStorage.set('USER_CONFIG', { [loginInfo.id]: initConfigModelData() })
  106. } else {
  107. if (!config[loginInfo.id]) {
  108. config[loginInfo.id] = initConfigModelData()
  109. localStorage.set('USER_CONFIG', config)
  110. }
  111. }
  112. /** pinia store 存储 login result */
  113. mainStore.loginInfo = loginInfo
  114. mainStore.loginSuccessTime = Date.now()
  115. mainStore.getUserMarkConfig()
  116. mainLayoutStore.getRenderMenuList().then((renderMenus: any) => {
  117. let path = '/analysis'
  118. let find = renderMenus.find((item: any) => item.index === 'analysis')
  119. if (find && (find.children || []).find((v: any) => v.index === 'analysis-monitoring')) {
  120. path = '/analysis/monitoring'
  121. }
  122. /**
  123. * 超级管理员每次登录完成之后需要选择考试批次
  124. * 其它角色如果是首次登录,需要去设置名称.
  125. * 否则大小组长进入监控首页, 评卷员进入评卷首页
  126. */
  127. if (loginInfo.role !== 'ADMIN') {
  128. if (!loginInfo.needRealName) {
  129. mainStore.getMyUserInfo()
  130. }
  131. let next =
  132. loginInfo.needRealName || loginInfo.needRealEmployer
  133. ? { name: 'InitUserName' }
  134. : loginInfo.role === 'MARKER'
  135. ? { name: 'MarkingMark' }
  136. : { path: path }
  137. // : { path: renderMenus[0].path || '/' }
  138. replace(next)
  139. // replace({
  140. // name: loginInfo.needRealName
  141. // ? 'InitUserName'
  142. // : loginInfo.role === 'MARKER'
  143. // ? 'MarkingMark'
  144. // : 'AnalysisMonitoring',
  145. // })
  146. } else {
  147. replace({ name: 'CheckExam' })
  148. }
  149. })
  150. }
  151. function initLogin() {
  152. const dialogModeBeforeSubmit = sessionStorage.get('dialogModeBeforeSubmit')
  153. const lockScreenStatus = sessionStorage.get('lockScreenStatus')
  154. sessionStorage.clear()
  155. dialogModeBeforeSubmit && sessionStorage.set('dialogModeBeforeSubmit', dialogModeBeforeSubmit)
  156. lockScreenStatus && sessionStorage.set('lockScreenStatus', lockScreenStatus)
  157. mainStore.$reset()
  158. }
  159. initLogin()
  160. </script>
  161. <style scoped lang="scss">
  162. .login-view {
  163. place-items: center;
  164. .login-modal {
  165. width: 480px;
  166. height: 416px;
  167. background: $LoginModalBg;
  168. border-radius: $LoginModalRadius;
  169. overflow: hidden;
  170. .login-modal-header {
  171. height: $LoginModalHeaderHeight;
  172. line-height: $LoginModalHeaderHeight;
  173. background: $LoginModalHeaderBg;
  174. font-size: $LoginModalHeaderFontSize;
  175. font-weight: normal;
  176. color: $LoginModalHeaderFontColor;
  177. display: flex;
  178. align-items: center;
  179. justify-content: space-between;
  180. .version {
  181. color: #ccf2ff;
  182. font-size: 16px;
  183. }
  184. }
  185. .login-modal-content {
  186. height: 336px;
  187. padding: 52px 80px;
  188. position: relative;
  189. }
  190. }
  191. }
  192. </style>