|
|
|
@ -4,7 +4,7 @@ |
|
|
|
|
* * @author: x7129 |
|
|
|
|
* * @date: 2023-03-23 17:44 |
|
|
|
|
* * */ |
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
|
import { Injectable, UnauthorizedException } from '@nestjs/common'; |
|
|
|
|
import { CreateStarlightDto } from './dto/create-starlight.dto'; |
|
|
|
|
import { UpdateStarlightDto } from './dto/update-starlight.dto'; |
|
|
|
|
import { |
|
|
|
@ -19,7 +19,10 @@ import { GdatabaseService } from '@/Gservice/GDATABASE/gdatabase.service'; |
|
|
|
|
import { GredisService } from '@/Gservice/GREDIS/gredis.service'; |
|
|
|
|
import { GemailService } from '@/Gservice/GEMAIL/gemail.service'; |
|
|
|
|
import { GtoolsService } from '@/Gservice/GTOOLS/gtools.service'; |
|
|
|
|
import { SignInPasswdEntryDto } from '@/starlight/dto/signIn.dto'; |
|
|
|
|
import { |
|
|
|
|
SignInEmailEntryDto, |
|
|
|
|
SignInPasswdEntryDto, |
|
|
|
|
} from '@/starlight/dto/signIn.dto'; |
|
|
|
|
|
|
|
|
|
// C C
|
|
|
|
|
// C 类名称: StarlightService
|
|
|
|
@ -53,7 +56,7 @@ export class StarlightService { |
|
|
|
|
// ! 从数据库用户身份表查询有没有已经使用的邮箱
|
|
|
|
|
const [rows] = await this.database.DB.execute( |
|
|
|
|
`SELECT * FROM user_info_verify WHERE email = ? AND state = 0`, |
|
|
|
|
[params.email.trim()], |
|
|
|
|
[params.email.trim().toLowerCase()], |
|
|
|
|
); |
|
|
|
|
// ! 判断是否存在此邮箱
|
|
|
|
|
const resd = { |
|
|
|
@ -79,7 +82,7 @@ export class StarlightService { |
|
|
|
|
// ! 从数据库用户身份表查询有没有已经使用的用户名
|
|
|
|
|
const [rows] = await this.database.DB.execute( |
|
|
|
|
`SELECT * FROM user_info_verify WHERE username = ? AND state = 0`, |
|
|
|
|
[params.username.trim()], |
|
|
|
|
[params.username.trim().toLowerCase()], |
|
|
|
|
); |
|
|
|
|
// ! 判断是否存在此用户名
|
|
|
|
|
const resd = { |
|
|
|
@ -98,7 +101,8 @@ export class StarlightService { |
|
|
|
|
// ? 函数描述: 发送邮箱注册验证码
|
|
|
|
|
// ? ?
|
|
|
|
|
public async registerEmailSendCode(params: RegisterEmailCheckoutEmailDto) { |
|
|
|
|
const { email } = params; |
|
|
|
|
let { email } = params; |
|
|
|
|
email = email.trim().toLowerCase(); |
|
|
|
|
// ! 1. 验证是否存在已经注册的
|
|
|
|
|
const checkoutEmail = await this.registerEmailCheckoutEmail({ |
|
|
|
|
email, |
|
|
|
@ -165,6 +169,9 @@ export class StarlightService { |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
} catch (e) { |
|
|
|
|
if (e.data != null) { |
|
|
|
|
this.logger.error(e); |
|
|
|
|
} |
|
|
|
|
resd.message = e.message; |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
@ -182,9 +189,9 @@ export class StarlightService { |
|
|
|
|
const uuid = this.tools.makeUUID(); |
|
|
|
|
const createTime = new Date(); |
|
|
|
|
const s = { |
|
|
|
|
email: email.trim(), |
|
|
|
|
email: email.trim().toLowerCase(), |
|
|
|
|
username: username.trim(), |
|
|
|
|
realname: body.realname?.trim(), |
|
|
|
|
realname: body.realname?.trim().toLowerCase(), |
|
|
|
|
nickname: body.nickname?.trim(), |
|
|
|
|
birthday: new Date(body.birthday), |
|
|
|
|
sex: sex[body.sex], |
|
|
|
@ -315,28 +322,275 @@ export class StarlightService { |
|
|
|
|
// ? ?
|
|
|
|
|
public async signInPasswdEntry(body: SignInPasswdEntryDto) { |
|
|
|
|
const { username, password } = body; |
|
|
|
|
// ! 加密密码
|
|
|
|
|
const passwordHash = this.tools.makeHASH(password); |
|
|
|
|
// ! 验证密码
|
|
|
|
|
// 查找最后一条
|
|
|
|
|
// ! 生成token
|
|
|
|
|
const resd = { |
|
|
|
|
data: {}, |
|
|
|
|
message: '未找到该用户信息!', |
|
|
|
|
success: false, |
|
|
|
|
}; |
|
|
|
|
// ! 1. 从库中获取uuid
|
|
|
|
|
const getUserUUIDSQL = `SELECT uuid from user_info_verify where username = ? AND state = 0 ORDER BY id desc limit 1;`; |
|
|
|
|
let uuid: string = null; |
|
|
|
|
try { |
|
|
|
|
const [rows] = await this.database.DB.execute(getUserUUIDSQL, [ |
|
|
|
|
username.trim().toLowerCase(), |
|
|
|
|
]); |
|
|
|
|
if (rows.length == 0) { |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
uuid = rows[0].uuid; |
|
|
|
|
} catch (e) { |
|
|
|
|
const message = '查找用户UUID出错!'; |
|
|
|
|
resd.message = message; |
|
|
|
|
this.logger.error({ |
|
|
|
|
message, |
|
|
|
|
data: e, |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
// ! 2. 判断是否存在用户
|
|
|
|
|
// ! 2.1 查找登陆异常数量Redis
|
|
|
|
|
const errorNumber = await this.redis.getSignInErrorNumber(uuid); |
|
|
|
|
if (!errorNumber.state) { |
|
|
|
|
const message = errorNumber.message; |
|
|
|
|
if (!errorNumber.ttl) { |
|
|
|
|
this.logger.warn({ |
|
|
|
|
message, |
|
|
|
|
e: errorNumber.error, |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (errorNumber.ttl) { |
|
|
|
|
resd.data = { |
|
|
|
|
ttl: errorNumber.ttl, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
resd.message = message; |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
// ! 3. 加密密码
|
|
|
|
|
const passwordHASH = this.tools.makeHASH(password.trim()); |
|
|
|
|
// ! 4. 查找,比对密码
|
|
|
|
|
let sqlPassword; |
|
|
|
|
const getPasswordSQL = `SELECT passwd FROM user_info_passwd WHERE uuid = ? ORDER BY id desc limit 1;`; |
|
|
|
|
try { |
|
|
|
|
const [rows] = await this.database.DB.execute(getPasswordSQL, [ |
|
|
|
|
uuid, |
|
|
|
|
]); |
|
|
|
|
if (rows.length == 0) { |
|
|
|
|
resd.message = '未找到密码!'; |
|
|
|
|
return resd; |
|
|
|
|
} else { |
|
|
|
|
this.logger.info(passwordHASH, rows[0]); |
|
|
|
|
if (passwordHASH != rows[0].passwd) { |
|
|
|
|
// ! 5. 登陆异常累加器
|
|
|
|
|
const setErrorNumber = |
|
|
|
|
await this.redis.setSignInErrorNumber(uuid); |
|
|
|
|
if (!setErrorNumber.state) { |
|
|
|
|
const message = setErrorNumber.message; |
|
|
|
|
this.logger.error({ |
|
|
|
|
data: setErrorNumber.error, |
|
|
|
|
message, |
|
|
|
|
}); |
|
|
|
|
resd.message = message; |
|
|
|
|
return resd; |
|
|
|
|
} else { |
|
|
|
|
resd.message = '账户和密码不匹配,请重试。'; |
|
|
|
|
resd.data = { |
|
|
|
|
number: setErrorNumber.number, |
|
|
|
|
}; |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (e) { |
|
|
|
|
const message = '查找用户密码时出错'; |
|
|
|
|
this.logger.error({ |
|
|
|
|
data: e, |
|
|
|
|
message, |
|
|
|
|
}); |
|
|
|
|
resd.message = message; |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
// ! 6. 创建Token
|
|
|
|
|
const token = this.tools.createToken({ |
|
|
|
|
username, |
|
|
|
|
uuid, |
|
|
|
|
signInTime: new Date().getTime(), |
|
|
|
|
}); |
|
|
|
|
this.logger.info(token); |
|
|
|
|
// ! Redis 登陆存储策略
|
|
|
|
|
// ! 返回数据
|
|
|
|
|
// ! 7. Redis存储策略
|
|
|
|
|
const setToken = await this.redis.setToken(uuid, token); |
|
|
|
|
if (!setToken.state) { |
|
|
|
|
const message = setToken.message; |
|
|
|
|
this.logger.error({ |
|
|
|
|
data: setToken.error, |
|
|
|
|
message, |
|
|
|
|
}); |
|
|
|
|
resd.message = message; |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
message: '登陆成功', |
|
|
|
|
data: { |
|
|
|
|
token: '', |
|
|
|
|
token, |
|
|
|
|
tokenKey: setToken.data.tokenKey, |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//#endredion
|
|
|
|
|
// ? ?
|
|
|
|
|
// ? 函数名称: signInEmailSendCode
|
|
|
|
|
// ? 函数描述: 获取邮箱登录验证码
|
|
|
|
|
// ? ?
|
|
|
|
|
public async signInEmailSendCode(params: RegisterEmailCheckoutEmailDto) { |
|
|
|
|
const email = params.email.trim().toLowerCase(); |
|
|
|
|
// ! 1. 验证是否存在已经注册的
|
|
|
|
|
const checkoutEmail = await this.registerEmailCheckoutEmail({ |
|
|
|
|
email, |
|
|
|
|
}); |
|
|
|
|
const resd = { |
|
|
|
|
data: {}, |
|
|
|
|
message: '不存在此邮箱账户!', |
|
|
|
|
success: false, |
|
|
|
|
}; |
|
|
|
|
if (checkoutEmail.success) { |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
// ! 2. 验证是否存在验证码
|
|
|
|
|
let registerCode: any; |
|
|
|
|
try { |
|
|
|
|
const redisResd = await this.redis.setSignInEmailCode(email); |
|
|
|
|
registerCode = redisResd.signInCode as string; |
|
|
|
|
} catch (e) { |
|
|
|
|
this.logger.error(e); |
|
|
|
|
resd.message = e.message; |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
// ! 3. 发送验证码
|
|
|
|
|
try { |
|
|
|
|
const result = await this.email.sendSignInCodeMail( |
|
|
|
|
email, |
|
|
|
|
registerCode, |
|
|
|
|
); |
|
|
|
|
resd.success = true; |
|
|
|
|
resd.message = '发送验证码成功,请注意查收!'; |
|
|
|
|
return resd; |
|
|
|
|
} catch (e) { |
|
|
|
|
this.logger.error(e); |
|
|
|
|
resd.message = e.message; |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
return {}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// ? ?
|
|
|
|
|
// ? 函数名称: signInEmailEntry
|
|
|
|
|
// ? 函数描述: 邮箱验证登录
|
|
|
|
|
// ? ?
|
|
|
|
|
public async signInEmailEntry(body: SignInEmailEntryDto) { |
|
|
|
|
let { email, code } = body; |
|
|
|
|
email = email.trim().toLowerCase(); |
|
|
|
|
code = code.trim().toUpperCase(); |
|
|
|
|
const resd = { |
|
|
|
|
data: {}, |
|
|
|
|
message: '未找到该用户信息!', |
|
|
|
|
success: false, |
|
|
|
|
}; |
|
|
|
|
// ! 1.从库中获取UUID
|
|
|
|
|
const getUserUUIDSQL = `SELECT uuid from user_info_verify where email = ? AND state = 0 ORDER BY id desc limit 1;`; |
|
|
|
|
let uuid: string = null; |
|
|
|
|
try { |
|
|
|
|
const [rows] = await this.database.DB.execute(getUserUUIDSQL, [ |
|
|
|
|
email.trim().toLowerCase(), |
|
|
|
|
]); |
|
|
|
|
if (rows.length == 0) { |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
uuid = rows[0].uuid; |
|
|
|
|
} catch (e) { |
|
|
|
|
const message = '查找用户UUID出错!'; |
|
|
|
|
resd.message = message; |
|
|
|
|
this.logger.error({ |
|
|
|
|
message, |
|
|
|
|
data: e, |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
// ! 2. 查找登陆异常数量Redis
|
|
|
|
|
const errorNumber = await this.redis.getSignInErrorNumber(uuid); |
|
|
|
|
if (!errorNumber.state) { |
|
|
|
|
const message = errorNumber.message; |
|
|
|
|
if (!errorNumber.ttl) { |
|
|
|
|
this.logger.warn({ |
|
|
|
|
message, |
|
|
|
|
e: errorNumber.error, |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (errorNumber.ttl) { |
|
|
|
|
resd.data = { |
|
|
|
|
ttl: errorNumber.ttl, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
resd.message = message; |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
// ! 3. 获取、比对验证码
|
|
|
|
|
try { |
|
|
|
|
const { signInCode } = await this.redis.getSignInEmailEntryCode( |
|
|
|
|
email, |
|
|
|
|
); |
|
|
|
|
if (signInCode != code) { |
|
|
|
|
const setErrorNumber = await this.redis.setSignInErrorNumber( |
|
|
|
|
uuid, |
|
|
|
|
); |
|
|
|
|
if (!setErrorNumber.state) { |
|
|
|
|
const message = setErrorNumber.message; |
|
|
|
|
this.logger.error({ |
|
|
|
|
data: setErrorNumber.error, |
|
|
|
|
message, |
|
|
|
|
}); |
|
|
|
|
resd.message = message; |
|
|
|
|
return resd; |
|
|
|
|
} else { |
|
|
|
|
resd.message = '验证码不匹配!'; |
|
|
|
|
resd.data = { |
|
|
|
|
number: setErrorNumber.number, |
|
|
|
|
}; |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (e) { |
|
|
|
|
if (e.data != null) { |
|
|
|
|
this.logger.error(e); |
|
|
|
|
} |
|
|
|
|
resd.message = e.message; |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
// ! 6. 创建Token
|
|
|
|
|
const token = this.tools.createToken({ |
|
|
|
|
email, |
|
|
|
|
uuid, |
|
|
|
|
signInTime: new Date().getTime(), |
|
|
|
|
}); |
|
|
|
|
// ! 7. Redis存储策略
|
|
|
|
|
const setToken = await this.redis.setToken(uuid, token); |
|
|
|
|
if (!setToken.state) { |
|
|
|
|
const message = setToken.message; |
|
|
|
|
this.logger.error({ |
|
|
|
|
data: setToken.error, |
|
|
|
|
message, |
|
|
|
|
}); |
|
|
|
|
resd.message = message; |
|
|
|
|
return resd; |
|
|
|
|
} |
|
|
|
|
return { |
|
|
|
|
message: '登陆成功', |
|
|
|
|
data: { |
|
|
|
|
token, |
|
|
|
|
tokenKey: setToken.data.tokenKey, |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
//#endregion
|
|
|
|
|
|
|
|
|
|
//#region 测试啊
|
|
|
|
|
|
|
|
|
|