登录注册业务实现
-
indexedDB 存储的用户数据样式
-
前端输入框要实现校验功能,并且反馈信息
-
使用 vuex 存储用户登录状态值
4.1 实现三个 mock 接口
这个也是和数据库对接,来自己模拟用户的登录登出注册功能
// code 说明
// '000000': 操作成功
// '000001': 手机号已被注册
// '000002': 密码不正确
// '000003': 手机号不正确
// '000004': 其他异常
// '000005': 登录过期
import { ElLoading } from 'element-plus'
import { airbnbDB } from '@/db/index';
// 对象仓库名
const storeName = 'user'
- 用户注册接口
export async function userSignApi(params: any) {
// 创建 mock 加载效果
const loading = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(255, 255, 255, 0.7)',
})
// 获取仓库中所有的用户数组
let usersData = await airbnbDB.getList(storeName)
let hasMobile = false
usersData.map((user) => {
if(user.mobile == params.mobile) hasMobile = true
})
if (hasMobile) {
// 加载结束
setTimeout(() => { loading.close() }, 500)
return { code: '000001', message: '失败', data: false, ok: false }
}
// 将用户加入数据库
Object.assign(params, { status: 0, token: '' })
let result = await airbnbDB.updateItem(storeName, params)
// 加载结束
setTimeout(() => { loading.close() }, 500)
if (result) {
return { code: '000000', message: '成功', data: result, ok: true }
} else {
return { code: '000004', message: '失败', data: false, ok: false }
}
}
// 简单测试
let result = await userSignApi({ mobile: '18579152301', password: '123' })
- 用户登录
export async function usersLoginApi(params: any) {
// 创建 mock 加载效果
const loading = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(255, 255, 255, 0.7)',
})
// 获取仓库中所有的用户数组
let usersData = await airbnbDB.getList(storeName)
// 如果没有用户
if (!usersData) {
// 加载结束
setTimeout(() => { loading.close() }, 500)
return { code: '000003', message: '失败', data: false, ok: false }
}
let correct = false
let codeData = '000003' // 默认手机号不正确
// 校验手机号和密码
usersData?.map(async function(user) {
if (user.mobile == params.mobile && user.password == params.password) {
correct = true
codeData = '000000' // 成功
// 成功后设置该用户 token 并更新状态
const token = (new Date()).getTime() + ''
const obj = { status: 1, token, id: user.id }
localStorage.setItem('usertoken', token)
Object.assign(params, obj)
// 更新数据库中用户数据
await airbnbDB.updateItem(storeName, params)
}
if (user.mobile == params.mobile && user.password != params.password) {
codeData = '000002' // 密码不正确
}
})
// 加载结束
setTimeout(() => { loading.close() }, 500)
if(correct) {
return { code: codeData, message: '成功', data: true, ok: true }
} else {
return { code: codeData, message: '失败', data: false, ok: false }
}
}
// 简单测试
let result = await usersLoginApi({ mobile: '18579152301', password: '123' })
- 用户登出
export async function userLogoutApi() {
// 创建 mock 加载效果
const loading = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(255, 255, 255, 0.7)',
})
// 获取仓库中所有的用户数组
let usersData = await airbnbDB.getList(storeName)
// 获取当前登录用户的 usertoken
const token = localStorage.getItem('usertoken')
let hasToken = false
// 更新当前用户状态
usersData.map(async function (user) {
if (user.token == token) {
hasToken = true
localStorage.removeItem('usertoken');
Object.assign(user, { status: 0, token: '' })
// 更新数据库中用户数据
await airbnbDB.updateItem(storeName, user)
}
})
// 加载结束
setTimeout(() => { loading.close() }, 500)
if(hasToken) {
return { code: '000000', message: '成功', data: true, ok: true }
} else {
return { code: '000004', message: '失败', data: false, ok: false }
}
}
// 简单测试
let result = await userLogoutApi()