index.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <template>
  2. <div class="login df fdc aic" :style="{height: viewWidth + 'px'}">
  3. <div class="login_logo">
  4. <!-- <img src="http://gm.nkfzs.com/favicon.ico"> -->
  5. <img v-if="VITEPLA === 'QingQue'" src="@/assets/img/logo.png"/>
  6. </div>
  7. <el-form
  8. ref="ruleFormRef"
  9. :rules="rules"
  10. class="login_from df fdc aic jcc"
  11. label-position="left"
  12. label-width="80px"
  13. :model="loginForm"
  14. style="max-width: 400px"
  15. @submit.prevent="submitForm(ruleFormRef)">
  16. <el-tabs v-model="login_typ" style="" @tab-change="resetForm(ruleFormRef)">
  17. <el-tab-pane label="密码登录" name="pwd" />
  18. <el-tab-pane label="验证码登录" name="sms" />
  19. </el-tabs>
  20. <template v-if="login_typ === 'pwd'">
  21. <el-form-item label="用户名" prop="account">
  22. <el-input v-model="loginForm.account" type="text" placeholder="请输入账号" clearable :prefix-icon="User" />
  23. </el-form-item>
  24. <el-form-item label="密&emsp;码" prop="password">
  25. <el-input
  26. v-model="loginForm.password"
  27. type="password"
  28. show-password
  29. placeholder="请输入密码"
  30. :prefix-icon="Lock" />
  31. <el-input
  32. v-model="loginForm.password"
  33. type="hidden"
  34. id="md5_password"
  35. show-password
  36. placeholder="请输入密码"
  37. :prefix-icon="Lock" />
  38. </el-form-item>
  39. </template>
  40. <template v-else-if="login_typ === 'sms'">
  41. <el-form-item label="手机号" prop="account">
  42. <el-input v-model="loginForm.account" type="text" placeholder="请输入账号" clearable :prefix-icon="User" />
  43. </el-form-item>
  44. <el-form-item label="验证码" prop="smsCaptcha">
  45. <el-input v-model="loginForm.smsCaptcha" type="number" placeholder="请输入验证码" :prefix-icon="Lock">
  46. <template #append>
  47. <div>
  48. <el-button @click="getCaptcha" color="#ed8c0f" style="width: 100px;" :disabled ="!can_send">{{smsMessage}}</el-button>
  49. </div>
  50. </template>
  51. </el-input>
  52. </el-form-item>
  53. </template>
  54. <!-- <el-form-item style="margin-top:-10px;margin-bottom:-5px;">
  55. <el-checkbox v-model="checked" style="color:#a0a0a0;margin-top:-10px;">记住我</el-checkbox>
  56. </el-form-item> -->
  57. <div class="btn df aic jcsb">
  58. <el-button type="primary" plain round class="submit_btn" @click="resetForm(ruleFormRef)">重&emsp;置</el-button>
  59. <el-button
  60. color="#ed8c0f"
  61. plain
  62. round
  63. class="submit_btn"
  64. native-type="submit">登&emsp;录</el-button>
  65. </div>
  66. </el-form>
  67. </div>
  68. </template>
  69. <script setup lang="ts">
  70. import { reactive, ref, onMounted } from 'vue'
  71. import { Lock, User } from '@element-plus/icons-vue'
  72. import type { FormInstance, FormRules } from 'element-plus'
  73. import { getUserLogin, captchaLogin, getCaptchaHttp } from '@/api/index'
  74. // import '@/utils/md5'
  75. import Message from '@/utils/Message'
  76. import checkRestTime from '@/utils/captcha'
  77. import { useRouter } from 'vue-router'
  78. import { useStore } from '@/store/index'
  79. import local from '@/utils/local'
  80. const VITEPLA:'QingQue'|'KuPai' = import.meta.env.VITE_LOGO_VISIBLE
  81. const user = useStore('user')
  82. const router = useRouter()
  83. const VALID = 60
  84. const login_typ = ref<'pwd'| 'sms'>('pwd')
  85. const viewWidth = ref<number>(document.documentElement.clientHeight - 80)
  86. const smsMessage = ref<'获取验证码' | number>('获取验证码')
  87. const ruleFormRef = ref<FormInstance>()
  88. const can_send = ref<boolean>(true)
  89. interface login {
  90. account: string,
  91. password: string,
  92. timestamp: number | string,
  93. smsCaptcha:number | null
  94. }
  95. const loginForm = reactive<login>({
  96. account: '',
  97. password: '',
  98. timestamp: parseInt(`${Date.now() / 1000}`),
  99. smsCaptcha: null
  100. })
  101. const rules = reactive<FormRules>({
  102. account: [
  103. { required: true, message: '请输入账号', trigger: 'blur' },
  104. { min: 3, max: 255, message: '请正确输入账号', trigger: 'blur' }
  105. ],
  106. password: [
  107. { required: true, message: '请输入密码', trigger: 'blur' },
  108. { min: 6, max: 20, message: '请输入6-20位密码', trigger: 'blur,change' }
  109. ],
  110. smsCaptcha: [
  111. { required: true, message: '请输入验证码', trigger: 'blur' }
  112. ]
  113. })
  114. const submitForm = async(formEl: FormInstance | undefined) => {
  115. if (!formEl) return
  116. await formEl.validate(async(valid, fields) => {
  117. if (valid) {
  118. if (login_typ.value === 'pwd') {
  119. // 登录密码加密
  120. let md5Pwd: any = document.querySelector('#md5_password')
  121. md5Pwd = md5(md5(md5(loginForm.password)) + loginForm.timestamp)
  122. const params = {
  123. account: loginForm.account,
  124. password: md5Pwd,
  125. timestamp: loginForm.timestamp
  126. }
  127. getUserLogin(params).then(async(res) => {
  128. // console.log('res---->', res);
  129. if (res.data.code === 200) {
  130. Message.success('登录成功')
  131. // 保存用户信息 和 token
  132. localStorage.setItem('token', res.data.data.token)
  133. localStorage.setItem('account', loginForm.account)
  134. localStorage.setItem('from', '1')
  135. await user.getUserProfile()
  136. // 跳转我的游戏页面
  137. setTimeout(() => {
  138. router.push({ path: '/p_mine', query: { account: loginForm.account }})
  139. local.set('headerPath', '我的')
  140. }, 1000)
  141. }
  142. }).catch(err => {
  143. // console.log('err===>', err);
  144. Message.error(err.data.msg)
  145. })
  146. } else if (login_typ.value === 'sms') {
  147. const params = {
  148. mobile: loginForm.account,
  149. captcha: loginForm.smsCaptcha
  150. }
  151. console.log(params)
  152. await captchaLogin(params).then(async(res) => {
  153. console.log(res)
  154. if (res.data.code === 200) {
  155. Message.success('登录成功')
  156. localStorage.setItem('token', res.data.data.token)
  157. localStorage.setItem('account', loginForm.account)
  158. localStorage.setItem('from', '2')
  159. await user.getUserProfile()
  160. setTimeout(() => {
  161. router.push({ path: '/p_mine', query: { account: loginForm.account }})
  162. local.set('headerPath', '我的')
  163. }, 1000)
  164. }
  165. }).catch((error) => {
  166. console.log(error)
  167. Message.error(error.data.msg)
  168. })
  169. }
  170. } else {
  171. console.log('登录失败', fields)
  172. }
  173. })
  174. }
  175. const resetForm = (formEl: FormInstance | undefined) => {
  176. if (!formEl) return
  177. formEl.resetFields()
  178. }
  179. const getCaptcha = async() => {
  180. if (loginForm.account.length !== 11) {
  181. return Message.error('请输入有效手机号!')
  182. }
  183. await getCaptchaHttp({ mobile: loginForm.account }).then((res) => {
  184. console.log(res)
  185. can_send.value = false
  186. smsMessage.value = VALID
  187. settimes()
  188. sessionStorage.setItem('LOGIN_CAPTCHA', Math.round(new Date().getTime() / 1000).toString())
  189. Message.success('验证码已发送,请注意查收')
  190. }).catch((error) => {
  191. console.log(error)
  192. Message.error(error.data.msg)
  193. })
  194. }
  195. const settimes = () => {
  196. var interval
  197. const setTimeFn = () => {
  198. (smsMessage.value as number)--
  199. if (smsMessage.value as number < 0 || can_send.value === true) {
  200. clearInterval(interval)
  201. can_send.value = true
  202. smsMessage.value = '获取验证码'
  203. }
  204. }
  205. interval = setInterval(function() {
  206. setTimeFn()
  207. }, 1000)
  208. }
  209. onMounted(() => {
  210. const res = checkRestTime('LOGIN_CAPTCHA', VALID)
  211. if (res) {
  212. smsMessage.value = res
  213. can_send.value = false
  214. settimes()
  215. }
  216. })
  217. </script>
  218. <style scoped lang="scss">
  219. .login {
  220. // background-color: #fff;
  221. // padding-top: 130px;
  222. // background: url('https://t7.baidu.com/it/u=3939632370,2791869803&fm=193&f=GIF') no-repeat 100% / 100%;
  223. .login_logo{
  224. // width: 500px;
  225. // height: 200px;
  226. margin: 30px auto 20px;
  227. img{
  228. width: 100%;
  229. height: 100%;
  230. }
  231. }
  232. .login_from {
  233. width: 600px;
  234. height: 280px;
  235. background-color: rgba(255, 255, 255, .7);
  236. font-size: 16px;
  237. border-radius: 10px;
  238. box-sizing: border-box;
  239. .el-input {
  240. width: 280px;
  241. height: 45px;
  242. }
  243. .btn {
  244. width: 80%;
  245. height: 35px;
  246. font-size: 16px;
  247. margin-top: 20px;
  248. .submit_btn {
  249. width: 45%;
  250. height: 100%;
  251. }
  252. }
  253. }
  254. }
  255. .el-form-item {
  256. align-items: center;
  257. height: 50px;
  258. }
  259. </style>