Files
crm-server/app/controller/UserController.php
T
2025-04-02 15:17:13 +08:00

322 lines
10 KiB
PHP

<?php
namespace app\controller;
use app\model\Country;
use app\model\FeishuUser;
use app\model\User;
use app\model\UserSn;
use app\service\MailService;
use app\service\UserService;
use app\util\HttpClient;
use app\util\JwtUtil;
use app\util\Util;
use support\Log;
use support\Redis;
use support\Request;
class UserController
{
/**
* 不需要登录的方法
*/
protected $noNeedLogin = ['login', 'sendCode', 'register'];
public function login(Request $request)
{
$email = Util::getParam($request, 'email');
$language = Util::getParam($request, 'language');
if (Util::isEmpty($email)) {
return Util::fail([], trans('required_not_null'));
}
$password = Util::getParam($request, 'password');
if (Util::isEmpty($password)) {
return Util::fail([], trans('required_not_null'));
}
$user = User::select(['id', 'name', 'sex', 'role', 'avatar', 'email', 'password'])
->where('status', 0)
->where('email', $request->post('email'))
->first();
if (!$user) {
return Util::fail(['user' => $user], trans('user_none'));
}
$user = $user->toArray();
$userPassword = $user['password'];
//加密
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
//验证密码
// if (!password_verify($userPassword, $hashedPassword)) {
if ($userPassword == $hashedPassword) {
locale($language);
return Util::fail([], trans('password_error'));
}
$userId = $user['id']; // 实际从数据库获取
Redis::set('user_' . $userId, $user);
//密码验证成功后加密生成 Token
$token = JwtUtil::generateToken($userId);
$result = $user;
unset($result['password']);
$result['token'] = $token;
$result['feishu_openid'] = FeishuUser::where('user_id', $userId)->value('open_id');
if (!Util::isEmpty($language)) {
User::where('id', $userId)
->update(['language' => $language]);
locale($language);
}
return Util::success($result, trans('login_success'));
}
/**
* 发送邮箱验证码
* @param Request $request
* @return \support\Response
* @throws \Random\RandomException
*/
public function sendCode(Request $request)
{
$email = Util::getParam($request, 'email');
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return Util::fail([], trans('email_error'));
}
// 生成验证码
$code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT);
// $verification_code = Redis::get("verification_code:{$email}");
// $code = $verification_code?:$code;
// return Util::success($code, '验证码已发送');
// 发送邮件
$mailService = new MailService();
if ($mailService->sendVerificationCode($email, $code)) {
// 存储验证码到 Redis
Redis::set("verification_code:{$email}", $code, 300);
return Util::success([], '验证码已发送');
}
return Util::fail([], '邮件发送失败');
}
/**
* 注册
* @param Request $request
* @return \support\Response
* @throws \Random\RandomException
*/
public function register(Request $request)
{
$email = Util::getParam($request, 'email', 'asdf');
$code = Util::getParam($request, 'code');
$sex = Util::getParam($request, 'sex', 0);
$name = Util::getParam($request, 'name', '');
$password = Util::getParam($request, 'password');
$mobile = Util::getParam($request, 'mobile');
$id = Util::getParam($request, 'id');
$language = Util::getParam($request, 'language');
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return Util::fail([], trans('required_not_null'));
}
$res = User::select('id', 'email')
->where('email', $email)
->first();
if (!empty($res)) {
return Util::fail($res, trans('email_repeat'));
}
if (Util::isEmpty($name)) {
// return Util::fail([], trans('required_not_null'));
}
$verification_code = Redis::get("verification_code:{$email}");
if ($code != $verification_code) {
return Util::fail([], trans('code_error'));
}
if(strlen($password) < 6) {
return Util::fail([], trans('password_short'));
}
//加密
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$data = [
'mobile' => $mobile,
'email' => $email,
'name' => '用户_'.rand(111111, 999999),
'sex' => $sex,
'role' => 1,
'password' => $hashedPassword,
'status' => 0,
'avatar' => 'lingke_crm/logo.png'
];
if (Util::isEmpty($id)) {
$option = ['email' => $email];
$userService = new UserService;
$res = $userService->createOrquery($option);
Log::info('register_rpc',$res);
// return Util::fail($res, trans('register_fail'));
if ($res['code'] != 200 && $res['data']['code'] != 0){
return Util::fail($res, trans('register_fail'));
}
$data['sn'] = $res['data']['data']['sn'];
$data['id'] = $res['data']['data']['uid'];
$res = User::firstOrCreate(['sn' => $data['sn']],$data);
$res['id'] = $data['id'];
} else {
$res = User::where('id', $id)
->update($data);
// Log::info('update', ['res' => $res]);
(!$res) ?: $res = User::find($id)->toArray();
}
unset($res['password']);
locale($language);
if ($res) {
return Util::success($res, trans('register_success'));
} else {
return Util::fail($res, trans('register_fail'));
}
}
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');
$user['country_name'] = Country::where('id', $user['country_id'])->value('cn_addr');
$user['avatar_url'] = $user['avatar'];
$ossservice = new \app\service\OssService();
$user['avatar'] = $user['avatar'] ? $ossservice->generatePrivateUrl($user['avatar']) : '';
return Util::success($user, trans('success'));
}
/**
* 修改
* @param Request $request
* @return \support\Response
* @throws \Random\RandomException
*/
public function save(Request $request)
{
$id = $request->user['id'];
$avatar = Util::getParam($request, 'avatar_url');
$socializePic = Util::getParam($request, 'socialize_pic_url');
$user = User::where('id', $id)->first();
// 只填充前端传递的字段
$user->fill($request->only(['name', 'sex', 'position', 'country_id', 'sign', 'mobile', 'address', 'socialize', 'socialize_pic']));
if(!Util::isEmpty($avatar)){
$user->avatar = $avatar;
}
if(!Util::isEmpty($socializePic)){
$user->socialize_pic = $socializePic;
}
$mobile = $user->isDirty('mobile');
$name = $user->isDirty('name');
$sign = $user->isDirty('sign');
if($mobile || $name || $sign){
$userService = new UserService;
$option = ['uid' => $user->id, 'phone' => $user->mobile, 'name' => $user->name, 'sign' => $user->sign, ];
$res = $userService->update($option);
Log::info('register_rpc',$res);
}
$res = $user->save();
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'));
}
}
/**
* 注册
* @param Request $request
* @return \support\Response
* @throws \Random\RandomException
*/
public function language(Request $request)
{
$id = $request->user['id'];
$language = Util::getParam($request, 'language');
if (Util::isEmpty($language)) {
return Util::fail([], 'language' . trans('not_null'));
}
if (!in_array($language, ['en', 'zh_CN'])) {
return Util::fail([], trans('param_error'));
}
$data = [
'language' => $language,
];
$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'));
}
}
}