2025-03-11 13:34:12 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace app\controller;
|
|
|
|
|
|
2025-03-22 15:31:54 +08:00
|
|
|
use app\model\Country;
|
2025-03-22 11:59:23 +08:00
|
|
|
use app\model\FeishuUser;
|
2025-03-14 14:27:33 +08:00
|
|
|
use app\model\User;
|
2025-03-14 17:10:14 +08:00
|
|
|
use app\service\MailService;
|
2025-03-14 14:27:33 +08:00
|
|
|
use app\util\JwtUtil;
|
|
|
|
|
use app\util\Util;
|
|
|
|
|
use support\Redis;
|
2025-03-11 13:34:12 +08:00
|
|
|
use support\Request;
|
|
|
|
|
|
|
|
|
|
class UserController
|
|
|
|
|
{
|
2025-03-14 14:27:33 +08:00
|
|
|
/**
|
|
|
|
|
* 不需要登录的方法
|
|
|
|
|
*/
|
2025-03-17 18:01:53 +08:00
|
|
|
protected $noNeedLogin = ['login', 'sendCode', 'register'];
|
2025-03-11 13:34:12 +08:00
|
|
|
|
|
|
|
|
public function login(Request $request)
|
|
|
|
|
{
|
2025-03-17 18:01:53 +08:00
|
|
|
$email = Util::getParam($request, 'email');
|
2025-03-21 13:29:55 +08:00
|
|
|
$language = Util::getParam($request, 'language');
|
2025-03-17 18:01:53 +08:00
|
|
|
if (Util::isEmpty($email)) {
|
2025-03-21 15:16:22 +08:00
|
|
|
return Util::fail([], trans('required_not_null'));
|
2025-03-14 14:27:33 +08:00
|
|
|
}
|
2025-03-17 18:01:53 +08:00
|
|
|
$password = Util::getParam($request, 'password');
|
|
|
|
|
if (Util::isEmpty($password)) {
|
2025-03-21 15:16:22 +08:00
|
|
|
return Util::fail([], trans('required_not_null'));
|
2025-03-14 14:27:33 +08:00
|
|
|
}
|
2025-03-21 13:29:55 +08:00
|
|
|
|
2025-03-17 18:01:53 +08:00
|
|
|
$user = User::select(['id', 'name', 'sex', 'role', 'avatar', 'email', 'password'])
|
|
|
|
|
->where('status', 0)
|
|
|
|
|
->where('email', $request->post('email'))
|
2025-03-14 14:27:33 +08:00
|
|
|
->first();
|
2025-03-17 18:01:53 +08:00
|
|
|
if (!$user) {
|
|
|
|
|
return Util::fail(['user' => $user], trans('user_none'));
|
2025-03-14 14:27:33 +08:00
|
|
|
}
|
|
|
|
|
$user = $user->toArray();
|
|
|
|
|
|
|
|
|
|
$userPassword = $user['password'];
|
|
|
|
|
|
|
|
|
|
//加密
|
|
|
|
|
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
|
|
|
|
|
|
|
|
|
|
//验证密码
|
2025-03-19 13:27:22 +08:00
|
|
|
// if (!password_verify($userPassword, $hashedPassword)) {
|
2025-03-20 11:32:40 +08:00
|
|
|
if ($userPassword == $hashedPassword) {
|
2025-03-21 13:29:55 +08:00
|
|
|
locale($language);
|
2025-03-17 18:01:53 +08:00
|
|
|
return Util::fail([], trans('password_error'));
|
2025-03-14 14:27:33 +08:00
|
|
|
}
|
|
|
|
|
$userId = $user['id']; // 实际从数据库获取
|
|
|
|
|
|
|
|
|
|
|
2025-03-17 18:01:53 +08:00
|
|
|
Redis::set('user_' . $userId, $user);
|
2025-03-14 14:27:33 +08:00
|
|
|
|
|
|
|
|
//密码验证成功后加密生成 Token
|
|
|
|
|
$token = JwtUtil::generateToken($userId);
|
|
|
|
|
$result = $user;
|
|
|
|
|
unset($result['password']);
|
|
|
|
|
$result['token'] = $token;
|
2025-03-22 14:14:01 +08:00
|
|
|
$result['feishu_openid'] = FeishuUser::where('user_id', $userId)->value('open_id');
|
2025-03-14 14:27:33 +08:00
|
|
|
|
2025-03-21 13:29:55 +08:00
|
|
|
if (Util::isEmpty($language)) {
|
|
|
|
|
User::where('id', $userId)
|
|
|
|
|
->update(['language' => $language]);
|
|
|
|
|
locale($language);
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-17 18:01:53 +08:00
|
|
|
return Util::success($result, trans('login_success'));
|
2025-03-11 13:34:12 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-14 17:10:14 +08:00
|
|
|
/**
|
|
|
|
|
* 发送邮箱验证码
|
|
|
|
|
* @param Request $request
|
|
|
|
|
* @return \support\Response
|
|
|
|
|
* @throws \Random\RandomException
|
|
|
|
|
*/
|
|
|
|
|
public function sendCode(Request $request)
|
|
|
|
|
{
|
2025-03-20 11:32:40 +08:00
|
|
|
$email = Util::getParam($request, 'email');
|
2025-03-14 17:10:14 +08:00
|
|
|
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
2025-03-21 15:16:22 +08:00
|
|
|
return Util::fail([], trans('required_not_null'));
|
2025-03-14 17:10:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 生成验证码
|
|
|
|
|
$code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT);
|
|
|
|
|
|
2025-03-21 15:16:22 +08:00
|
|
|
// $verification_code = Redis::get("verification_code:{$email}");
|
|
|
|
|
// $code = $verification_code?:$code;
|
|
|
|
|
// return Util::success($code, '验证码已发送');
|
2025-03-14 17:10:14 +08:00
|
|
|
// 发送邮件
|
|
|
|
|
$mailService = new MailService();
|
|
|
|
|
if ($mailService->sendVerificationCode($email, $code)) {
|
|
|
|
|
// 存储验证码到 Redis
|
|
|
|
|
Redis::set("verification_code:{$email}", $code, 300);
|
2025-03-17 18:01:53 +08:00
|
|
|
return Util::success([], '验证码已发送');
|
2025-03-14 17:10:14 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-17 18:01:53 +08:00
|
|
|
return Util::fail([], '邮件发送失败');
|
2025-03-14 17:10:14 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-17 18:01:53 +08:00
|
|
|
/**
|
|
|
|
|
* 注册
|
|
|
|
|
* @param Request $request
|
|
|
|
|
* @return \support\Response
|
|
|
|
|
* @throws \Random\RandomException
|
|
|
|
|
*/
|
|
|
|
|
public function register(Request $request)
|
|
|
|
|
{
|
2025-03-20 11:32:40 +08:00
|
|
|
$email = Util::getParam($request, 'email', 'asdf');
|
|
|
|
|
$code = Util::getParam($request, 'code');
|
|
|
|
|
$sex = Util::getParam($request, 'sex', 0);
|
2025-03-21 15:16:22 +08:00
|
|
|
$name = Util::getParam($request, 'name', '');
|
2025-03-20 11:32:40 +08:00
|
|
|
$password = Util::getParam($request, 'password');
|
|
|
|
|
$mobile = Util::getParam($request, 'mobile');
|
|
|
|
|
$id = Util::getParam($request, 'id');
|
|
|
|
|
$language = Util::getParam($request, 'language');
|
2025-03-17 18:01:53 +08:00
|
|
|
|
|
|
|
|
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
2025-03-21 15:16:22 +08:00
|
|
|
return Util::fail([], trans('required_not_null'));
|
2025-03-17 18:01:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$res = User::select('id', 'email')
|
|
|
|
|
->where('email', $email)
|
|
|
|
|
->first();
|
|
|
|
|
// if (!Util::isEmpty($res)) {
|
|
|
|
|
// return Util::fail([], trans('email_repeat'));
|
|
|
|
|
// }
|
2025-03-14 17:10:14 +08:00
|
|
|
|
2025-03-17 18:01:53 +08:00
|
|
|
if (Util::isEmpty($name)) {
|
2025-03-21 15:16:22 +08:00
|
|
|
// return Util::fail([], trans('required_not_null'));
|
2025-03-17 18:01:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$verification_code = Redis::get("verification_code:{$email}");
|
|
|
|
|
|
|
|
|
|
if ($code != $verification_code) {
|
|
|
|
|
return Util::fail([], trans('code_error'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//加密
|
|
|
|
|
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
|
|
|
|
|
|
|
|
|
|
$data = [
|
|
|
|
|
'mobile' => $mobile,
|
|
|
|
|
'email' => $email,
|
|
|
|
|
'name' => $name,
|
|
|
|
|
'sex' => $sex,
|
|
|
|
|
'role' => 1,
|
|
|
|
|
'password' => $hashedPassword,
|
2025-03-19 13:27:22 +08:00
|
|
|
'status' => 0,
|
2025-03-17 18:01:53 +08:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
if (Util::isEmpty($id)) {
|
|
|
|
|
$res = User::create($data);
|
|
|
|
|
} else {
|
|
|
|
|
$res = User::where('id', $id)
|
|
|
|
|
->update($data);
|
|
|
|
|
// Log::info('update', ['res' => $res]);
|
2025-03-20 11:32:40 +08:00
|
|
|
(!$res) ?: $res = User::find($id)->toArray();
|
2025-03-17 18:01:53 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-18 15:07:22 +08:00
|
|
|
unset($res['password']);
|
2025-03-20 11:32:40 +08:00
|
|
|
locale($language);
|
2025-03-17 18:01:53 +08:00
|
|
|
if ($res) {
|
2025-03-20 11:32:40 +08:00
|
|
|
return Util::success($res, trans('register_success'));
|
2025-03-17 18:01:53 +08:00
|
|
|
} else {
|
2025-03-19 13:27:22 +08:00
|
|
|
return Util::fail($res, trans('register_fail'));
|
2025-03-17 18:01:53 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-14 17:10:14 +08:00
|
|
|
|
2025-03-22 14:14:01 +08:00
|
|
|
|
|
|
|
|
public function getInfo(Request $request)
|
|
|
|
|
{
|
|
|
|
|
$userId = $request->user['id'];
|
|
|
|
|
$user = User::where('id', $userId)
|
|
|
|
|
->first();
|
|
|
|
|
$user->toArray();
|
|
|
|
|
unset($user->password);
|
|
|
|
|
$user['feishu_openid'] = FeishuUser::where('user_id', $userId)->value('open_id');
|
2025-03-22 15:41:25 +08:00
|
|
|
$user['country_name'] = Country::where('id', $user['country_id'])->value('cn_addr');
|
2025-03-22 14:14:01 +08:00
|
|
|
|
|
|
|
|
return Util::success($user, trans('save_success'));
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-22 14:03:58 +08:00
|
|
|
/**
|
|
|
|
|
* 修改
|
|
|
|
|
* @param Request $request
|
|
|
|
|
* @return \support\Response
|
|
|
|
|
* @throws \Random\RandomException
|
|
|
|
|
*/
|
|
|
|
|
public function save(Request $request)
|
|
|
|
|
{
|
|
|
|
|
$name = Util::getParam($request, 'name');
|
|
|
|
|
$sex = Util::getParam($request, 'sex');
|
|
|
|
|
$position = Util::getParam($request, 'position');
|
|
|
|
|
$country_id = Util::getParam($request, 'country_id');
|
|
|
|
|
$sign = Util::getParam($request, 'sign');
|
|
|
|
|
$id = $request->user['id'];
|
|
|
|
|
|
|
|
|
|
$data = [
|
|
|
|
|
'name' => $name,
|
|
|
|
|
'sex' => $sex,
|
|
|
|
|
'position' => $position,
|
|
|
|
|
'country_id' => $country_id,
|
|
|
|
|
'sign' => $sign,
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$res = User::where('id', $id)
|
|
|
|
|
->update($data);
|
|
|
|
|
|
|
|
|
|
if ($res) {
|
|
|
|
|
return Util::success($res, trans('save_success'));
|
|
|
|
|
} else {
|
|
|
|
|
return Util::fail($res, trans('save_fail'));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 修改
|
|
|
|
|
* @param Request $request
|
|
|
|
|
* @return \support\Response
|
|
|
|
|
* @throws \Random\RandomException
|
|
|
|
|
*/
|
|
|
|
|
public function savePassword(Request $request)
|
|
|
|
|
{
|
|
|
|
|
$password = Util::getParam($request, 'password');
|
|
|
|
|
$email = Util::getParam($request, 'email');
|
|
|
|
|
$code = Util::getParam($request, 'code');
|
|
|
|
|
$verification_code = Redis::get("verification_code:{$email}");
|
|
|
|
|
$id = $request->user['id'];
|
|
|
|
|
|
|
|
|
|
if ($code != $verification_code) {
|
|
|
|
|
return Util::fail([], trans('code_error'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$res = User::where('id', $id)
|
|
|
|
|
->first();
|
|
|
|
|
if($res['email'] != $email) {
|
|
|
|
|
return Util::fail([], trans('email_consistent'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//加密
|
|
|
|
|
// $hashedPassword = password_hash($password, PASSWORD_DEFAULT);
|
|
|
|
|
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
|
|
|
|
|
|
|
|
|
|
$data = [
|
|
|
|
|
'password' => $hashedPassword
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$res = User::where('id', $id)
|
|
|
|
|
->update($data);
|
|
|
|
|
|
|
|
|
|
if ($res) {
|
|
|
|
|
return Util::success($res, trans('save_success'));
|
|
|
|
|
} else {
|
|
|
|
|
return Util::fail($res, trans('save_fail'));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-20 11:32:40 +08:00
|
|
|
/**
|
|
|
|
|
* 注册
|
|
|
|
|
* @param Request $request
|
|
|
|
|
* @return \support\Response
|
|
|
|
|
* @throws \Random\RandomException
|
|
|
|
|
*/
|
|
|
|
|
public function language(Request $request)
|
|
|
|
|
{
|
2025-03-21 13:29:55 +08:00
|
|
|
$id = $request->user['id'];
|
2025-03-20 11:32:40 +08:00
|
|
|
$language = Util::getParam($request, 'language');
|
|
|
|
|
if (Util::isEmpty($language)) {
|
|
|
|
|
return Util::fail([], 'language' . trans('not_null'));
|
|
|
|
|
}
|
2025-03-22 14:03:58 +08:00
|
|
|
if (!in_array($language, ['en', 'zh_CN'])) {
|
2025-03-20 11:32:40 +08:00
|
|
|
return Util::fail([], trans('param_error'));
|
|
|
|
|
}
|
|
|
|
|
$data = [
|
|
|
|
|
'language' => $language,
|
|
|
|
|
];
|
2025-03-11 13:34:12 +08:00
|
|
|
|
2025-03-20 11:32:40 +08:00
|
|
|
$res = User::where('id', $id)
|
|
|
|
|
->update($data);
|
|
|
|
|
locale($language);
|
|
|
|
|
if ($res) {
|
|
|
|
|
return Util::success(null, trans('language_success'));
|
|
|
|
|
} else {
|
|
|
|
|
return Util::fail(null, trans('language_fail'));
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-11 13:34:12 +08:00
|
|
|
}
|