'登录完善'

main
fwb 3 months ago
parent e3289e6b5b
commit f7ef90558a
  1. 2
      index.html
  2. 3
      src/api/user/index.ts
  3. 3
      src/api/user/type.ts
  4. 4
      src/store/modules/types/types.ts
  5. 32
      src/store/modules/user.ts
  6. 15
      src/utils/time.ts
  7. 10
      src/utils/token.ts
  8. 91
      src/views/login/index.vue

@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>小得盈满,爱逢其时</title>
<title>Control is Power</title>
</head>
<body>
<div id="app"></div>

@ -5,7 +5,6 @@ import type { loginForm, loginResponseDate, userReponseData } from './type'
enum API {
LOGIN_URL = '/user/login',
USERINFO_URL = '/user/info',
// LOGOUT_URL = '/admin/acl/index/logout',
}
//登录接口
export const reqLogin = (data: loginForm) =>
@ -13,5 +12,3 @@ export const reqLogin = (data: loginForm) =>
//获取用户信息
export const reqUserInfo = () =>
request.get<any, userReponseData>(API.USERINFO_URL)
//退出登录
// export const reqLogout = () => request.post<any, any>(API.LOGOUT_URL)

@ -5,7 +5,8 @@ export interface loginForm {
}
interface dataType {
token: string
token?: string
message?: string
}
//登录接口返回数据类型
export interface loginResponseDate {

@ -0,0 +1,4 @@
//定义小仓库数据state类型
export interface UserState {
token: string | null
}

@ -3,23 +3,41 @@ import { defineStore } from 'pinia'
//引入登录接口
import { reqLogin } from '@/api/user'
//引入数据类型
import type { loginForm } from '@/api/user/type'
import type { loginForm, loginResponseDate } from '@/api/user/type'
import type { UserState } from '@/store/modules/types/types'
//引入操作本地存储的工具方法
import { SET_TOKEN, GET_TOKEN } from '@/utils/token'
//创建小仓库
let useUserStore = defineStore('User', {
//小仓库存储数据的地方
state: () => {},
state: (): UserState => {
return {
token: GET_TOKEN(),
// token: localStorage.getItem('TOKEN'), //用户唯一标识token
}
},
//异步|逻辑的地方
actions: {
//用户登录方法
//括号内data收集参数(实参)
async userLogin(data: loginForm) {
//登录请求
let result = await reqLogin(data)
console.log(result)
},
let result: loginResponseDate = await reqLogin(data)
// console.log(result)
if (result.code == 200) {
//pinia仓库存储token
//由于pinia|vuex存储数据其实利用js对象
this.token = result.data.token as string
//本地存储持久化存储一份
// localStorage.setItem('TOKEN', (result.data.token as string))
SET_TOKEN(result.data.token as string)
//能保证当前async函数返回一个成功的promise
return 'OK'
} else {
return Promise.reject(new Error(result.data.message))
}
},
getters: {
},
getters: {},
})
export default useUserStore

@ -0,0 +1,15 @@
//封装一个函数判断时间
export const getTime = () => {
let message = ''
let hours = new Date().getHours()
if (hours <= 9) {
message = '早上'
} else if (hours <= 12) {
message = '上午'
} else if (hours <= 18) {
message = '下午'
} else {
message = '晚上'
}
return message
}

@ -0,0 +1,10 @@
//封装本地存储数据与读取数据方法
//存储数据
export const SET_TOKEN = (token: string) => {
localStorage.setItem('TOKEN', token)
}
//本地存储获取数据
export const GET_TOKEN = () => {
return localStorage.getItem('TOKEN')
}

@ -3,20 +3,26 @@
<el-row>
<el-col :span="12" :xs="0"></el-col>
<el-col :span="12" :xs="24">
<el-form class="login_form">
<el-form
class="login_form"
:model="loginForm"
:rules="rules"
ref="loginforms"
>
<h1>Hello</h1>
<h2>欢迎登录</h2>
<el-form-item>
<el-form-item prop="username">
<el-input
:prefix-icon="User"
v-model="loginForm.username"
></el-input>
</el-form-item>
<el-form-item>
<el-form-item prop="password">
<el-input
:prefix-icon="Lock"
type="password"
v-model="loginForm.password"
show-password
></el-input>
</el-form-item>
<el-form-item>
@ -25,6 +31,7 @@
type="primary"
size="large"
@click="loginHandle"
:loading="loading"
>
登录
</el-button>
@ -37,21 +44,88 @@
<script setup lang="ts">
import { User, Lock } from '@element-plus/icons-vue'
import { reactive } from 'vue'
import { reactive, ref } from 'vue'
import { useRouter } from 'vue-router'
const $router = useRouter()
import { ElNotification } from 'element-plus'
//
import useUserStore from '@/store/modules/user'
import { getTime } from '@/utils/time'
let useStore = useUserStore()
let loading = ref(false)
//el-form
let loginforms = ref()
//
const loginForm = reactive({
username: 'admin',
password: '111111',
})
const loginHandle = () => {
const loginHandle = async () => {
//
await loginforms.value.validate()
//
loading.value = true
//
//home
//
useStore.userLogin(loginForm) //loginForm
try {
await useStore.userLogin(loginForm) //loginForm
ElNotification({
type: 'success',
message: '登陆成功',
title: `Hi!${getTime()}好!`,
})
// 2
setTimeout(() => {
//
$router.push('/home')
//
loading.value = false
}, 1000) // 2000 = 2
} catch (error) {
loading.value = false
ElNotification({
type: 'error',
message: (error as Error).message,
})
}
}
//
const validatorUserName = (rule: any, value: any, callback: any) => {
//rule:
// value:
// :callBack
// callBack,
if (value.length >= 5) {
callback()
} else {
callback(new Error('账号长度至少五位!'))
}
}
const validatorUserPassword = (rule: any, value: any, callback: any) => {
//rule:
// value:
// :callBack
// callBack,
if (value.length >= 6) {
callback()
} else {
callback(new Error('账号长度至少六位!'))
}
}
//
const rules = {
username: [
// { required: true, message: '', trigger: 'change' },
// { min: 1, max: 5, message: '5', trigger: 'change' },
{ trigger: 'change', validator: validatorUserName }, //
],
password: [
// { required: true, message: '', trigger: 'change' },
// { min: 1, max: 6, message: '6', trigger: 'change' },
{ trigger: 'change', validator: validatorUserPassword }, //
],
}
</script>
@ -68,7 +142,10 @@ const loginHandle = () => {
position: relative; //
background: url('@/assets/images/login_form.png') no-repeat;
background-size: cover;
padding: 40px;
padding-right: 150px;
padding-left: 150px;
padding-top: 50px;
padding-bottom: 20px;
h1 {
color: white;
font-size: 40px;

Loading…
Cancel
Save