212 lines
5.7 KiB
C++
212 lines
5.7 KiB
C++
//
|
|
// Created by dongl on 23-4-23.
|
|
//
|
|
|
|
#include "UserService.h"
|
|
#include "handler.h"
|
|
#include <experimental/random>
|
|
|
|
///************************************************* 登陆 ***********************************************************///
|
|
|
|
// 登陆 按subtype 分类是帐号登陆还是手机登陆
|
|
mp::sri* UserService::login(mp::MP_SUB_TYPE subType, const std::string& account, const std::string& password) {
|
|
sri_clear();
|
|
|
|
if (subType == mp::MP_REQUEST_LOGIN_EMAIL) {
|
|
login_fun(account, password, "email");
|
|
}
|
|
else if (subType == mp::MP_REQUEST_LOGIN_PHONE) {
|
|
login_fun(account, password, "phone");
|
|
}
|
|
else if (subType == mp::MP_REQUEST_LOGIN_ACCOUNT) {
|
|
login_fun(account, password, "account");
|
|
}
|
|
|
|
return sri;
|
|
}
|
|
|
|
// 登陆基函数
|
|
void UserService::login_fun(const std::string& account, const std::string& password, const std::string& filed) {
|
|
|
|
// 判断密码
|
|
auto [exist, user] = userDb.select_user(strtol(account.c_str(), nullptr, 0), filed);
|
|
|
|
// 无账户
|
|
if (!exist) {
|
|
sri->set_sri_msg("无此账户");
|
|
sri->set_sri_code(mp::MP_LOGIN_ACCOUNT_NOT);
|
|
return;
|
|
}
|
|
|
|
std::string source = account + password + user.password_salt;
|
|
size_t password_hash = std::hash<std::string>()(source);
|
|
|
|
if (user.password == std::to_string(password_hash)) {
|
|
printf("登陆成功\n");
|
|
sri->set_sri_msg("登陆成功!");
|
|
sri->set_sri_code(mp::MP_LOGIN_SUCCESS);
|
|
sri->set_sri_token("token");
|
|
sri->set_sri_username(user.username);
|
|
sri->set_sri_email(user.email);
|
|
sri->set_sri_phone(user.phone);
|
|
sri->set_sri_account(user.account);
|
|
|
|
// 这里redis 更新帐号信息
|
|
|
|
|
|
} else {
|
|
printf("登陆失败\n");
|
|
sri->set_sri_msg("登陆失败!");
|
|
sri->set_sri_code(mp::MP_LOGIN_FAIL);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
///********************************************** 注册 *****************************************************////
|
|
|
|
// 注册 邮箱注册
|
|
mp::sri *UserService::register_(mp::MP_SUB_TYPE subType, const std::string &phone_email,
|
|
const std::string &password, const std::string& code,
|
|
const std::optional<std::string>& session_code) {
|
|
sri_clear();
|
|
|
|
if (session_code.has_value()) {
|
|
if (session_code.value() != code) {
|
|
sri->set_sri_code(mp::MP_PE_CODE_FAIL);
|
|
sri->set_sri_msg("验证码不正确");
|
|
return sri;
|
|
}
|
|
} else {
|
|
sri->set_sri_code(mp::MP_PE_CODE_FAIL);
|
|
sri->set_sri_msg("验证码失效");
|
|
return sri;
|
|
}
|
|
|
|
// 号池取号
|
|
auto account = userDb.fetch_account();
|
|
if (account.has_value()) {
|
|
// 注册
|
|
bool state = register_(account.value(), password);
|
|
|
|
// 注册成功
|
|
if (state) {
|
|
bool state1;
|
|
/// 判断什么方式注册
|
|
// 邮箱方式
|
|
if (subType == mp::MP_REQUEST_REGISTER_EMAIL) {
|
|
// 将邮箱绑定到帐号上
|
|
state1 = userDb.bind_email(account.value(), phone_email);
|
|
sri->set_sri_email(phone_email);
|
|
sri->set_sri_code(mp::MP_REGISTER_SUCCESS_EMAIL);
|
|
}
|
|
// 手机号方式
|
|
else {
|
|
// 将手机绑定到帐号上
|
|
state1 = userDb.bind_phone(account.value(), phone_email);
|
|
sri->set_sri_phone(strtol(phone_email.c_str(), nullptr, 0));
|
|
sri->set_sri_code(mp::MP_REGISTER_SUCCESS_PHONE);
|
|
}
|
|
|
|
if (!state1) {
|
|
sri->set_sri_msg("sql:生成的帐号为绑定上本邮箱, 请重新注册");
|
|
sri->set_sri_code(mp::MP_REGISTER_SQL_ERR);
|
|
} else {
|
|
// 注册成功就将取出的号在号池内删除
|
|
userDb.remove_pool_account(account.value());
|
|
}
|
|
}
|
|
|
|
}
|
|
// 号池无号
|
|
else {
|
|
sri->set_sri_msg("暂无帐号可提供");
|
|
sri->set_sri_code(mp::MP_REGISTER_SQL_ERR);
|
|
}
|
|
|
|
return sri;
|
|
}
|
|
|
|
|
|
// 注册 基函数
|
|
bool UserService::register_(uint64_t account, const std::string &password) {
|
|
// 查看账户是否存在
|
|
auto exist = userDb.select_user_exist(account);
|
|
if (!exist) {
|
|
sri->set_sri_msg("账户已经存在");
|
|
sri->set_sri_code(mp::MP_REGISTER_EXIST);
|
|
return false;
|
|
}
|
|
|
|
// 生成salt
|
|
std::string password_salt;
|
|
for (int i = 0; i < std::experimental::randint(5, 8); ++i) {
|
|
password_salt.push_back((char )std::experimental::randint(33, 126));
|
|
}
|
|
|
|
// 加密密码 生成hash
|
|
std::string source = std::to_string(account) + password + password_salt;
|
|
size_t password_hash = std::hash<std::string>()(source);
|
|
|
|
// 注册 插入用户
|
|
auto add_user = userDb.insert_user(account, std::to_string(password_hash), password_salt);
|
|
if (!add_user) {
|
|
sri->set_sri_msg("注册失败, 用户表, sql");
|
|
sri->set_sri_code(mp::MP_REGISTER_SQL_ERR);
|
|
return false;
|
|
}
|
|
|
|
auto add_friends_table = userDb.insert_user_friends(account);
|
|
if (!add_friends_table) {
|
|
if (!userDb.remove_user(account)) {
|
|
sri->set_sri_msg("注册失败, 用户已添加, 但附属好友表生成失败, sql");
|
|
sri->set_sri_code(mp::MP_REGISTER_SQL_ERR);
|
|
return false;
|
|
}
|
|
|
|
sri->set_sri_msg("注册失败, 附属好友表, sql");
|
|
sri->set_sri_code(mp::MP_REGISTER_SQL_ERR);
|
|
return false;
|
|
}
|
|
|
|
sri->set_sri_msg("注册成功");
|
|
sri->set_sri_code(mp::MP_REGISTER_SUCCESS);
|
|
|
|
return true;
|
|
}
|
|
|
|
mp::sri *UserService::logout(const std::string& account, bool state) {
|
|
// return userDb.logout(account, state);
|
|
return nullptr;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|