Explorar o código

[智价云] 邮箱密码登录&手机验证码登录&发送验证码

tangyuanwang hai 1 mes
pai
achega
671166496e

+ 119 - 8
app/Http/Controllers/Manager/Login.php

@@ -7,6 +7,7 @@ use App\Http\Requests\Manager\Login as Request;
 use App\Models\Manager\AuthRule;
 use App\Facades\Servers\Encrypts\AccessToken;
 use App\Models\Manager\Personnel\Employee as EmployeeModel;
+use App\Facades\Servers\Sms\VerifyCode as Sms;
 
 /**
  * 管理后台登录控制器
@@ -47,13 +48,13 @@ class Login extends Manager
 			// 比对密码
 			if (md5($password) != $admin['password']) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']);
 			// 登录
-			$accessToken 						= $AdminUser->Login($admin['uid'],'manager');
+			$accessToken 						= $AdminUser->Login($admin['uid'], 'manager');
 			// 比对密码
 			if (isset($accessToken['error'])) 	return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]);
 			// 获取权限列表
 			$accessToken['username']			= $admin['username'];
 			// 获取权限列表
-			$accessToken['auth_rules']			= $AuthRule->getAuthList($admin['uid'],'1', 'manager');
+			$accessToken['auth_rules']			= $AuthRule->getAuthList($admin['uid'], '1', 'manager');
 		} else {
 			$admin    	= $EmployeeModel->where('employee_code', $username)->first(['id as uid', 'name as username', 'mobile as phone', 'status', 'password', 'insert_time', 'update_time']);
 			// 用户不存在
@@ -65,14 +66,14 @@ class Login extends Manager
 			// 比对密码
 			if (md5($password) != $admin['password']) return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在']);
 			// 登录
-			$accessToken 						= $EmployeeModel->Login($admin['uid'],'manager');
+			$accessToken 						= $EmployeeModel->Login($admin['uid'], 'manager');
 			// 比对密码
 			if (isset($accessToken['error'])) 	return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]);
 			// 获取权限列表
 			$accessToken['username']			= $admin['username'];
-			$accessToken['auth_rules']			= $AuthRule->getAuthList($admin['uid'],'0','manager');
+			$accessToken['auth_rules']			= $AuthRule->getAuthList($admin['uid'], '0', 'manager');
 		}
-		
+
 		// 表单令牌
 		return    	json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]);
 	}
@@ -99,10 +100,10 @@ class Login extends Manager
 		if ($is_admin == '1') {
 			// 退出登录
 			$AdminUser->LoginOut($uid, 'manager');
-		}else{
+		} else {
 			$EmployeeModel->LoginOut($uid, 'manager');
 		}
-		
+
 		// 表单令牌
 		return    	json_send(['code' => 'success', 'msg' => '退出成功', 'data' => '']);
 	}
@@ -117,7 +118,7 @@ class Login extends Manager
 	 * @param string 	password	登录密码
 	 * 
 	 */
-	public function mobile(Request $Request,AuthRule $AuthRule, EmployeeModel $EmployeeModel)
+	public function mobile(Request $Request, AuthRule $AuthRule, EmployeeModel $EmployeeModel)
 	{
 		// 验证规则
 		$Request->scene('mobile')->validate();
@@ -146,4 +147,114 @@ class Login extends Manager
 		// 表单令牌
 		return    	json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]);
 	}
+
+	/**
+	 * 发送验证码
+	 * @author 唐远望
+	 * @version   1.0
+	 * @date      2026-01-15
+	 * @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	= session('loginSmsCode');
+		// 如果有数据,并且验证码创建的时间在一分钟之内
+		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()];
+		session(['loginSmsCode' => $session]);
+		return							json_send(['code' => 'success', 'msg' => '发送成功', 'data' => $code]);
+	}
+
+	/**
+	 * 邮箱登录			/manager/login/email
+	 * @author 唐远望
+	 * @version   1.0
+	 * @date      2025-12-04
+	 * @param string 	email		邮箱号码
+	 * @param string 	password	登录密码
+	 * 
+	 */
+	public function email(Request $Request, AuthRule $AuthRule, EmployeeModel $EmployeeModel)
+	{
+		// 验证规则
+		$Request->scene('email')->validate();
+		// 接收数据
+		$email    = $Request->input('email', '');
+		// 接收数据
+		$password    = $Request->input('password', '');
+		// 查询用户
+		$admin    	= $EmployeeModel->where('email', $email)->first(['id as uid', 'name as username', 'mobile as phone', '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['uid'], 'manager');
+		// 比对密码
+		if (isset($accessToken['error'])) 	return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]);
+		// 获取权限列表
+		$accessToken['username']			= $admin['username'];
+		// 获取权限列表
+		$accessToken['auth_rules']			= $AuthRule->getAuthList($admin['uid'], 'manager');;
+		// 表单令牌
+		return    	json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]);
+	}
+
+	/**
+	 * 手机验证码登录			/manager/login/mobile_code
+	 * @author 唐远望
+	 * @version   1.0
+	 * @date      2026-01-15
+	 * @param string 	mobile		手机号码
+	 * @param string 	code	验证码
+	 * 
+	 */
+	public function mobile_code(Request $Request, AuthRule $AuthRule, EmployeeModel $EmployeeModel)
+	{
+		// 验证规则
+		$Request->scene('mobile_code')->validate();
+		// 接收数据
+		$phone    = $Request->input('phone', '');
+		// 接收数据
+		$code    = $Request->input('code', '');
+		// 获取数据
+		$session						    = session('loginSmsCode');
+		if (!$session)                     return json_send(['code' => 'error', 'msg' => '请先获取手机号验证码']);
+		if ($session['code'] != $code || $session['phone'] != $phone) return json_send(['code' => 'error', 'msg' => '验证码错误']);
+		// 查询用户
+		$admin    	= $EmployeeModel->where('mobile', $phone)->first(['id as uid', 'name as username', 'mobile as phone', '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['uid'], 'manager');
+		// 比对密码
+		if (isset($accessToken['error'])) 	return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]);
+		// 获取权限列表
+		$accessToken['username']			= $admin['username'];
+		// 获取权限列表
+		$accessToken['auth_rules']			= $AuthRule->getAuthList($admin['uid'], 'manager');;
+		// 表单令牌
+		return    	json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]);
+	}
 }

+ 3 - 0
app/Http/Middleware/Manager/AccessAuth.php

@@ -14,6 +14,9 @@ class AccessAuth
     protected   $except     = [
         'manager/login/index',
         'manager/login/mobile',
+        'manager/login/email',
+        'manager/login/send_code',
+        'manager/login/mobile_code',
         'manager/citys/list'
     ];
     //默认配置

+ 3 - 0
app/Http/Middleware/Manager/Login.php

@@ -12,6 +12,9 @@ class Login
     protected   $except     = [
         'manager/login/index',
         'manager/login/mobile',
+        'manager/login/email',
+        'manager/login/send_code',
+        'manager/login/mobile_code',
         'manager/citys/list'
     ];
     //默认配置

+ 3 - 0
app/Http/Requests/Manager/Login.php

@@ -32,6 +32,9 @@ class Login extends BaseRequest
     protected   $scenes         = [
         'login'                  => ['username', 'password'],
         'mobile'                 => ['phone', 'password'],
+        'send_code'              => ['phone'],
+        'email'                  => ['email', 'password'],
+        'mobile_code'            => ['phone', 'code']
     ];
 
     /**

+ 59 - 0
app/Servers/Sms/GuoDu.php

@@ -0,0 +1,59 @@
+<?php namespace App\Servers\Sms;
+
+use Ixudra\Curl\Facades\Curl;
+
+/**
+ * 验证码模型
+ *
+ * @author    刘相欣
+ */
+class GuoDu {
+
+    // 已开通的帐号名称
+    private $operId     = 'dfwyyz';
+    //与帐号名称对应的密码
+    private $operPass   = 'vTfTsYzX';
+
+    /**
+     * 发送短信
+     * @param  string $desMobile    接收手机号码
+     * @param  string $content      短信内容
+     * @param  string $sign         签名
+     * 
+     * @return array
+     * 
+     */
+    public function sendSms($desMobile,$content,$sign){
+        $result         = Curl::to('http://qxtsms.guodulink.net/QxtSms/QxtFirewall')->withData([
+                            'OperID'=>$this->operId,
+                            'OperPass'=>$this->operPass,
+                            'DesMobile'=>$desMobile,
+                            'Content'=>'【'.$sign.'】'.$content,
+                            'Content_Code'=>1
+                        ])->post();
+        //如果没有返回值
+        if( !$result )  return['error'=>'短信通道未正确返回格式'];
+        // XML格式转PHP数组
+        $result         = simplexml_load_string($result);
+        $result         = json_decode(json_encode($result),true);
+        // 返回结果
+        return          $result;
+    }
+
+    /**
+     * 查询余额
+     * 
+     * @return array|int
+     * 
+     */
+    public function surplus(){
+		// 查询
+        $result         = Curl::to('http://124.251.7.68:8100/QxtSms_surplus/surplus')->withData(['OperID'=>$this->operId,'OperPass'=>$this->operPass])->get();
+        //如果没有返回值
+        if( !$result )  return['error'=>'短信通道未正确返回格式'];
+        // 返回结果
+        return          $result;
+    }
+
+}
+

+ 88 - 0
app/Servers/Sms/VerifyCode.php

@@ -0,0 +1,88 @@
+<?php
+
+namespace App\Servers\Sms;
+
+use App\Facades\Servers\Sms\GuoDu;
+use App\Facades\Servers\Aliyun\Sms as Aliyun;
+use App\Facades\Servers\Tencent\Sms as Tencent;
+
+/**
+ * 验证码模型
+ * @author 唐远望
+ * @version   1.0
+ * @date      2026-01-15
+ * 
+ */
+class VerifyCode
+{
+
+
+    public function sendCode($phone, $verifyCode)
+    {
+        // 判断运营商,以方便发送短信
+        $type                               = config('verifycode.operator_type');
+        // 如果是国都
+        if ($type == 'guodu') {
+            // 发送短信
+            $result                         = GuoDu::sendSms($phone, '您的验证码是:' . $verifyCode . ',5分钟内有效,请勿外泄。', config('verifycode.guodu.sms_sign'));
+            // 如果code不是03
+            if ($result['code'] != '03' &&  $result['code'] != '01')    return ['error' => '发送失败', 'data' => $result];
+            // 返回结果
+            return                          $result;
+        }
+        // 如果是阿里云
+        if ($type == 'aliyun') {
+            // 发送短信
+            $result                         = Aliyun::sendSms($phone, config('verifycode.aliyun.sms_sign'), config('verifycode.aliyun.sms_tpl'), ['code' => $verifyCode]);;
+            // 如果code不是03
+            if (isset($result['error']))    return ['error' => $result['error'], 'data' => $result];
+            // 返回结果
+            return                          $result;
+        }
+        // 如果是阿里云
+        if ($type == 'tencent') {
+            // 发送短信
+            $result                         = Tencent::sendSms($phone, config('verifycode.tencent.sms_sign'), config('verifycode.tencent.sms_tpl'), [$verifyCode]);
+            // 如果code不是03
+            if (isset($result['error']))    return ['error' => $result['error'], 'data' => $result];
+            // 返回结果
+            return                          $result;
+        }
+        // 返回结果
+        return                              ['error' => '未知运营商,请配置运营商类型'];
+    }
+    public function sendRemind($phone, $content)
+    {
+        // 判断运营商,以方便发送短信
+        $type                               = config('verifycode.operator_type');
+        // 如果是国都
+        if ($type == 'guodu') {
+            // 发送短信
+            $result                         = GuoDu::sendSms($phone, $content, config('verifycode.guodu.sms_sign'));
+            // 如果code不是03
+            if ($result['code'] != '03' &&  $result['code'] != '01')    return ['error' => '发送失败', 'data' => $result];
+            // 返回结果
+            return                          $result;
+        }
+        // 如果是阿里云
+        if ($type == 'aliyun') {
+            // 发送短信
+            $result                         = Aliyun::sendSms($phone, config('verifycode.aliyun.sms_sign'), config('verifycode.aliyun.sms_tpl'), ['code' => $content]);;
+            // 如果code不是03
+            if (isset($result['error']))    return ['error' => $result['error'], 'data' => $result];
+            // 返回结果
+            return                          $result;
+        }
+        // 如果是阿里云
+        if ($type == 'tencent') {
+            // 发送短信
+            $result                         = Tencent::sendSms($phone, config('verifycode.tencent.sms_sign'), config('verifycode.tencent.sms_tpl'), [$content]);
+            // 如果code不是03
+            if (isset($result['error']))    return ['error' => $result['error'], 'data' => $result];
+            // 返回结果
+            return                          $result;
+        }
+        // 返回结果
+        return                              ['error' => '未知运营商,请配置运营商类型'];
+    }
+}

+ 18 - 0
config/verifycode.php

@@ -0,0 +1,18 @@
+<?php
+
+return [
+
+    'operator_type'     => env('VERIFYCODE_OPERATOR_TYPE', 'aliyun'), // 运营商,aliyun or tencent or guodu
+    'aliyun'=>[
+        'sms_sign'      => env('VERIFYCODE_ALIYUN_SMS_SIGN', '开邻'),
+        'sms_tpl'       => env('VERIFYCODE_ALIYUN_SMS_TPL', 'SMS_483305249'),
+    ],
+    'guodu'=>[
+        'sms_sign'      => env('VERIFYCODE_GUODU_SMS_SIGN', '开邻'),
+    ],
+    'tencent'=>[
+        'sms_sign'      => env('VERIFYCODE_TENCENT_SMS_SIGN', '开邻'),
+        'sms_tpl'       => env('VERIFYCODE_TENCENT_SMS_TPL', '2475442'),
+    ],
+    
+];