scene('login')->validate(); // 接收数据 $employee_code = $Request->input('employee_code', ''); // 接收数据 $password = $Request->input('password', ''); // 查询用户 $admin = $EmployeeModel->Where('employee_code', $employee_code)->first(['company_id', 'id', 'name', 'mobile', 'status', 'password', 'insert_time', 'update_time']); // 用户不存在 if (!$admin || $admin['status']) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']); // 用户不存在 if ($admin['status']) return json_send(['code' => 'error', 'msg' => '该账号已停用']); // 转数组 $admin = $admin->toArray(); // 比对密码 if (md5($password) != $admin['password']) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']); // 登录 $accessToken = $EmployeeModel->Login($admin['id'], $admin['company_id'], 'api'); if (isset($accessToken['error'])) return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]); $accessToken['username'] = $admin['name']; $accessToken['is_system_admin'] = 0; // 表单令牌 return json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]); } /** * 退出方法 /manager/login/out * @author 唐远望 * @version 1.0 * @date 2025-12-09 * @param string authcode 用户令牌 * */ public function out(EmployeeModel $EmployeeModel) { $user_info = $this->checkLogin(); // 验证规则 $uid = $user_info['uid']; // 退出登录 $EmployeeModel->LoginOut($uid, 'api'); // 表单令牌 return json_send(['code' => 'success', 'msg' => '退出成功', 'data' => '']); } /** * 手机号码登录 /manager/login/mobile * @author 唐远望 * @version 1.0 * @date 2025-12-04 * @param string mobile 手机号码 * @param string password 登录密码 * */ public function mobile(Request $Request, EmployeeModel $EmployeeModel) { // 验证规则 $Request->scene('mobile')->validate(); // 接收数据 $phone = $Request->input('phone', ''); // 接收数据 $password = $Request->input('password', ''); // 查询用户 $user_info = $EmployeeModel->where('mobile', $phone)->first(['company_id', 'id', 'name', 'mobile', 'status', 'password', 'insert_time', 'update_time']); // 用户不存在 if (!$user_info || $user_info['status']) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']); // 用户不存在 if ($user_info['status']) return json_send(['code' => 'error', 'msg' => '该账号已停用']); // 转数组 $user_info = $user_info->toArray(); // 比对密码 if (md5($password) != $user_info['password']) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']); // 登录 $accessToken = $EmployeeModel->Login($user_info['id'], $user_info['company_id'], 'api'); if (isset($accessToken['error'])) return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]); $accessToken['username'] = $user_info['name']; $accessToken['is_system_admin'] = 0; // 表单令牌 return json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]); } /** * 发送验证码 * @author 唐远望 * @version 1.0 * @date 2026-01-16 * @param string phone 手机号码 * */ public function send_code(Request $Request, EmployeeModel $EmployeeModel) { // 验证规则 $Request->scene('send_code')->validate(); // 接收数据 $mobile = request('phone', ''); if (!$mobile) return json_send(['code' => 'error', 'msg' => '请先填写手机号']); // 获取数据 $session = Cache::get('loginSmsCode_' . $mobile); // 如果有数据,并且验证码创建的时间在一分钟之内 if ($session && time() - $session['create_time'] < 60) return json_send(['code' => 'error', 'msg' => '请稍后再试']); // 查询用户 $admin = $EmployeeModel->query()->where('mobile', $mobile)->first(['status']); if ($admin && $admin['status']) return json_send(['code' => 'error', 'msg' => '用户已被停用']); $code = strval(rand(100000, 999999)); $result = Sms::sendCode($mobile, $code); if (isset($result['error'])) return json_send(['code' => 'error', 'msg' => $result['error']]); $session = ['code' => $code, 'mobile' => $mobile, 'create_time' => time()]; Cache::put('loginSmsCode_' . $mobile, $session, 120); return json_send(['code' => 'success', 'msg' => '发送成功', 'data' => '']); } /** * 邮箱登录 /manager/login/email * @author 唐远望 * @version 1.0 * @date 2026-01-16 * @param string email 邮箱号码 * @param string password 登录密码 * */ public function email(Request $Request, EmployeeModel $EmployeeModel) { // 验证规则 $Request->scene('email')->validate(); // 接收数据 $email = $Request->input('email', ''); // 接收数据 $password = $Request->input('password', ''); // 查询用户 $admin = $EmployeeModel->where('email', $email)->first(['company_id', 'id', 'name', 'mobile', 'status', 'password', 'insert_time', 'update_time']); // 用户不存在 if (!$admin) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']); // 用户不存在 if ($admin['status']) return json_send(['code' => 'error', 'msg' => '该账号已停用']); // 转数组 $admin = $admin->toArray(); // 比对密码 if (md5($password) != $admin['password']) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']); // 登录 $accessToken = $EmployeeModel->Login($admin['id'], $admin['company_id'], 'api'); if (isset($accessToken['error'])) return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]); $accessToken['username'] = $admin['name']; $accessToken['is_system_admin'] = 0; // 表单令牌 return json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]); } /** * 手机验证码登录 /manager/login/mobile_code * @author 唐远望 * @version 1.0 * @date 2026-01-16 * @param string mobile 手机号码 * @param string code 验证码 * */ public function mobile_code(Request $Request, EmployeeModel $EmployeeModel) { // 验证规则 $Request->scene('mobile_code')->validate(); // 接收数据 $phone = $Request->input('phone', ''); // 接收数据 $code = $Request->input('code', ''); // 获取数据 $session = Cache::get('loginSmsCode_' . $phone); if (!$session) return json_send(['code' => 'error', 'msg' => '请先获取手机号验证码']); if ($session['code'] != $code || $session['mobile'] != $phone) return json_send(['code' => 'error', 'msg' => '验证码错误']); // 查询用户 $admin = $EmployeeModel->where('mobile', $phone)->first(['company_id', 'id', 'name', 'mobile', 'status', 'password', 'insert_time', 'update_time']); // 用户不存在 if (!$admin) return json_send(['code' => 'error', 'msg' => '账号不存在']); // 用户不存在 if ($admin['status']) return json_send(['code' => 'error', 'msg' => '该账号已停用']); // 转数组 $admin = $admin->toArray(); // 登录 $accessToken = $EmployeeModel->Login($admin['id'], $admin['company_id'], 'api'); if (isset($accessToken['error'])) return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]); $accessToken['username'] = $admin['name']; $accessToken['is_system_admin'] = 0; // 表单令牌 return json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]); } /** * 小程序手机号授权 * @author 唐远望 * @version 1.0 * @date 2026-03-10 * @param string auth_code 授权code * @param string open_code 开放平台code * */ public function wechat_phone(Request $Request, EmployeeModel $EmployeeModel, EmployeeOpenidModel $EmployeeOpenidModel) { // 验证规则 $Request->scene('wechat_phone')->validate(); // 接收数据 $auth_code = request('auth_code', ''); $open_code = $Request->input('open_code', ''); $appId = config('wechat.mini.app_id', ''); //小程序APPID // 授权结果 $result = Mini::getUserPhone($auth_code, $appId); // 如果所需字段不存在 if (isset($result['error'])) return json_send(['code' => 'error', 'msg' => '授权失败', 'data' => ['error' => $result['error']]]); // 如果所需字段不存在 if (empty($result['purePhoneNumber'])) return json_send(['code' => 'error', 'msg' => '未获取到手机号', 'data' => ['error' => '未获取到手机号']]); $phone = $result['purePhoneNumber']; // 查询用户 $phone_user_data = $EmployeeModel->where(['mobile' => $phone])->first(['company_id', 'id as uid', 'name as username', 'mobile as phone', 'status', 'password', 'insert_time', 'update_time']); if (!$phone_user_data) return json_send(['code' => 'error', 'msg' => '手机号码未授权']); if ($phone_user_data['status']) return json_send(['code' => 'error', 'msg' => '该账号已停用']); $company_id = $phone_user_data->company_id; $uid = $phone_user_data->uid; //获取用户的openid $tokenData = Mini::jscode2session($open_code, $appId); if (!isset($tokenData['openid']) || !$tokenData['openid']) return json_send(['code' => 'error', 'msg' => '获取openid失败', 'data' => $tokenData]); if (!isset($tokenData['unionid']) || !$tokenData['unionid']) return json_send(['code' => 'error', 'msg' => '获取unionid失败', 'data' => $tokenData]); $user_open_data = $EmployeeOpenidModel->where(['mini_openid' => $tokenData['openid']])->first(); if (!$user_open_data) { //自动绑定手机号码用户 try { $phone_user_data->band_wechat = 1; //绑定微信0=未绑定1=已绑定 $phone_user_data->save(); $unionid = $tokenData['unionid'] ?? ''; $official_user_info = $EmployeeOpenidModel->where(['unionid' => $unionid])->first(); if ($official_user_info) { $official_user_info->company_id = $company_id; $official_user_info->employee_id = $uid; $official_user_info->mini_openid = $tokenData['openid']; $official_user_info->update_time = time(); $official_user_info->save(); } else { $EmployeeOpenidModel->insertGetId([ 'company_id' => $company_id, 'employee_id' => $uid, 'unionid' => $tokenData['unionid'] ?? '', 'mini_openid' => $tokenData['openid'], 'insert_time' => time() ]); } DB::commit(); } catch (\Exception $e) { DB::rollBack(); return json_send(['code' => 'error', 'msg' => '绑定失败', 'data' => $e->getMessage()]); } } else { $user_open_data->unionid = $tokenData['unionid'] ?? ''; $user_open_data->mini_openid = $tokenData['openid']; $user_open_data->update_time = time(); $user_open_data->save(); } // 转数组 $admin = $phone_user_data->toArray(); // 登录 $accessToken = $EmployeeModel->Login($admin['uid'], $admin['company_id'], 'api'); if (isset($accessToken['error'])) return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]); $accessToken['username'] = $admin['username']; $accessToken['is_system_admin'] = 0; // 表单令牌 return json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]); } }