Просмотр исходного кода

[智价云] 补充小程序登录退出接口

tangyuanwang 1 неделя назад
Родитель
Сommit
971c619d4b

+ 79 - 0
app/Http/Controllers/Api/Api.php

@@ -0,0 +1,79 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Exceptions\Api\VerifySignException;
+use App\Exceptions\Api\LoginException;
+use App\Exceptions\Api\ApiException;
+use App\Facades\Servers\Encrypts\AccessToken;
+use App\Http\Controllers\Controller;
+use App\Models\Api\Personnel\Employee as EmployeeModel;
+use App\Http\Requests\Manager\Login as Request;
+
+/**
+ * 接口控制器
+ * @author 唐远望
+ * @version 1.0
+ * @date 2025-12-09
+ * 
+ */
+class Api extends Controller
+{
+    protected $token;
+    /**
+     * $prefix表前缀
+     */
+    public function __construct(Request $request)
+    {
+        $this->token  = $request->input('access_token_api', '');
+    }
+
+    /**
+     * 登录验证
+     * @author 唐远望
+     * @version 1.0
+     * @date 2025-12-09
+     * 
+     */
+    public function checkLogin()
+    {
+        // 获取登录结果
+        // 解码
+        $userInfo                       = AccessToken::decode($this->token);
+        // 判断登录时效
+        if (isset($userInfo['error']))  throw new LoginException("login_error");
+        if ($userInfo['expire'] < time()) throw new LoginException("login_exprie");
+        // 获取就得令牌
+        $oldToken                       = (new EmployeeModel())->getLogin($userInfo['uid'], 'api');
+        if ($oldToken != md5($this->token))  throw new LoginException("login_error");
+        // 追加入
+        return $userInfo;
+    }
+
+    /**
+     * 登录验证
+     * @author 唐远望
+     * @version 1.0
+     * @date 2025-12-09
+     * 
+     */
+    public function getUid()
+    {
+        // 尝试执行
+        try {
+            // 解码
+            $decode                                            = AccessToken::decode($this->token);
+            // 错误返回
+            if (isset($decode['error']))                    return 0;
+            // 如果没有过期时间,过期处理
+            if (empty($decode['expire']))                        return 0;
+            // 如果过期,过期处理
+            if ($decode['expire'] <= time())                    return 0;
+            // 返回用户ID
+            return                                            $decode['uid'];
+        } catch (\Throwable $th) {
+            // 返回0
+            return                                            0;
+        }
+    }
+}

+ 114 - 0
app/Http/Controllers/Api/Login.php

@@ -0,0 +1,114 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Models\Api\Personnel\Employee as EmployeeModel;
+use App\Http\Requests\Manager\Login as Request;
+use App\Models\Manager\AuthRule;
+
+/**
+ * API登录控制器
+ * @author 唐远望
+ * @version   1.0
+ * @date      2025-12-09
+ *
+ */
+class Login extends Api
+{
+
+    /**
+     * 登录方法				/manager/login/index
+     * @author 唐远望
+     * @version   1.0
+     * @date      2025-12-09
+     * @param string 	employee_code	登录账号
+     * @param string 	password	登录密码
+     * 
+     * */
+    public function index(Request $Request, EmployeeModel $EmployeeModel)
+    {
+        // 验证规则
+        $Request->scene('login')->validate();
+        // 接收数据
+        $employee_code    = $Request->input('employee_code', '');
+        // 接收数据
+        $password    = $Request->input('password', '');
+        // 查询用户
+        $admin        = $EmployeeModel->Where('employee_code', $employee_code)->first(['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'], 'manager');
+        // 比对密码
+        if (isset($accessToken['error']))     return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]);
+        // 获取权限列表
+        $accessToken['username']            = $admin['name'];
+        // 表单令牌
+        return        json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]);
+    }
+
+
+    /**
+     * 登录方法				/manager/login/out
+     * @author 唐远望
+     * @version   1.0
+     * @date      2025-12-09
+     * @param string 	username	登录账号
+     * @param string 	password	登录密码
+     * 
+     */
+    public function out(EmployeeModel $EmployeeModel)
+    {
+        $user_info = $this->checkLogin();
+        // 验证规则
+        $uid         =$user_info['uid'];
+        // 退出登录
+        $EmployeeModel->LoginOut($uid, 'manager');
+        // 表单令牌
+        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, AuthRule $AuthRule)
+    {
+        // 验证规则
+        $Request->scene('mobile')->validate();
+        // 接收数据
+        $phone    = $Request->input('phone', '');
+        // 接收数据
+        $password    = $Request->input('password', '');
+        // 查询用户
+        $user_info        = $EmployeeModel->where('mobile', $phone)->first(['id', 'name', 'mobile', 'status', 'password', 'insert_time', 'update_time']);
+        // 用户不存在
+        if (!$user_info || $user_info['status'])    return json_send(['code' => 'error', 'msg' => '密码错误或账号不存在1']);
+        // 用户不存在
+        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'], 'api');
+        // 比对密码
+        if (isset($accessToken['error']))     return json_send(['code' => 'error', 'msg' => '登录失败', 'data' => $accessToken['data']]);
+        // 获取权限列表
+        $accessToken['username']            = $user_info['name'];
+        // 表单令牌
+        return        json_send(['code' => 'success', 'msg' => '登录成功', 'data' => $accessToken]);
+    }
+}

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

@@ -24,12 +24,13 @@ class Login extends BaseRequest
             'username'  =>  'required',
             'password'  =>  'required',
             'phone'    =>  'required',
+            'employee_code'    =>  'required',
         ];
     }
 
     // 场景列表
     protected   $scenes         = [
-        'login'                  => ['username', 'password'],
+        'login'                  => ['employee_code', 'password'],
         'mobile'                 => ['phone', 'password'],
     ];
 
@@ -43,6 +44,7 @@ class Login extends BaseRequest
             'username.required'  =>  '请输入登录账号',
             'password.required'  =>  '请输入登录密码',
             'phone.required'    =>  '请输入手机号码',
+            'employee_code.required'    =>  '请输入员工编号',
         ];
     }
 }

+ 71 - 0
app/Models/Api/Personnel/Employee.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace App\Models\Api\Personnel;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use App\Facades\Servers\Encrypts\AccessToken;
+
+/**
+ * 员工模型
+ * @author 唐远望
+ * @version 1.0
+ * @date 2025-12-09
+ */
+class Employee extends Model
+{
+    use HasFactory;
+    // 与模型关联的表名
+    protected $table = 'personnel_employee';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+
+    /**
+     * 登录
+     * 
+     * @param   int      用户ID
+     * 
+     */
+    public function Login($uid, $module = 'api')
+    {
+        // 组合数据
+        $jwtData                            = ['uid' => $uid, 'type' => $module, 'expire' => time() + 86400 * 7];
+        // 登录成功
+        $token                              = AccessToken::encode($jwtData);
+        // 如果异常的话
+        if (isset($token['error']))        return $token;
+        // 登录成功
+        cache([$module . ':apiuser:access_token:' . $uid => md5($token)], 86400 * 7);
+        // 返回结果
+        return                              ['access_token_' . $module => $token, 'expire' => 86400 * 7];
+    }
+
+    /**
+     * 退出登录
+     * 
+     * @param   int      用户ID
+     * 
+     */
+    public function LoginOut($uid, $module = 'api')
+    {
+        // 删除缓存
+        cache([$module . ':apiuser:access_token:' . $uid => null]);
+        // 返回结果
+        return                              true;
+    }
+
+    /**
+     * 获取登录信息
+     */
+    public function getLogin($uid, $module = 'api')
+    {
+        // 删除缓存
+        $result                             = cache($module . ':apiuser:access_token:' . $uid);
+        // 返回结果
+        return                              $result;
+    }
+}

+ 1 - 0
composer.json

@@ -16,6 +16,7 @@
         "laravel/framework": "^8.75",
         "laravel/sanctum": "^2.11",
         "laravel/tinker": "^2.5",
+        "vinkla/hashids": "^9.1",
         "wantp/snowflake": "^1.2"
     },
     "require-dev": {

+ 227 - 1
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "57075bd312f134ce65ff5390f5b859a6",
+    "content-hash": "1e681333ab55bfbee2c509519c49e4b6",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -768,6 +768,82 @@
             "abandoned": true,
             "time": "2022-02-23T14:25:13+00:00"
         },
+        {
+            "name": "graham-campbell/manager",
+            "version": "v4.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/GrahamCampbell/Laravel-Manager.git",
+                "reference": "b4cafa6491b9c92ecf7ce17521580050a27b8308"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Manager/zipball/b4cafa6491b9c92ecf7ce17521580050a27b8308",
+                "reference": "b4cafa6491b9c92ecf7ce17521580050a27b8308",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "illuminate/contracts": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0",
+                "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0",
+                "php": "^7.1.3 || ^8.0"
+            },
+            "require-dev": {
+                "graham-campbell/analyzer": "^2.4 || ^3.0",
+                "graham-campbell/testbench-core": "^3.4",
+                "mockery/mockery": "^1.3.1",
+                "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.7"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "GrahamCampbell\\Manager\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                }
+            ],
+            "description": "Manager Provides Some Manager Functionality For Laravel",
+            "keywords": [
+                "Graham Campbell",
+                "GrahamCampbell",
+                "Laravel Manager",
+                "Laravel-Manager",
+                "connector",
+                "framework",
+                "interface",
+                "laravel",
+                "manager"
+            ],
+            "support": {
+                "issues": "https://github.com/GrahamCampbell/Laravel-Manager/issues",
+                "source": "https://github.com/GrahamCampbell/Laravel-Manager/tree/v4.7.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/graham-campbell/manager",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-01-24T01:59:19+00:00"
+        },
         {
             "name": "graham-campbell/result-type",
             "version": "1.1.x-dev",
@@ -1180,6 +1256,82 @@
             ],
             "time": "2025-08-23T21:21:41+00:00"
         },
+        {
+            "name": "hashids/hashids",
+            "version": "4.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/vinkla/hashids.git",
+                "reference": "8cab111f78e0bd9c76953b082919fc9e251761be"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/vinkla/hashids/zipball/8cab111f78e0bd9c76953b082919fc9e251761be",
+                "reference": "8cab111f78e0bd9c76953b082919fc9e251761be",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.0 || ^9.4",
+                "squizlabs/php_codesniffer": "^3.5"
+            },
+            "suggest": {
+                "ext-bcmath": "Required to use BC Math arbitrary precision mathematics (*).",
+                "ext-gmp": "Required to use GNU multiple precision mathematics (*)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hashids\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ivan Akimov",
+                    "email": "ivan@barreleye.com"
+                },
+                {
+                    "name": "Vincent Klaiber",
+                    "email": "hello@doubledip.se"
+                }
+            ],
+            "description": "Generate short, unique, non-sequential ids (like YouTube and Bitly) from numbers",
+            "homepage": "https://hashids.org/php",
+            "keywords": [
+                "bitly",
+                "decode",
+                "encode",
+                "hash",
+                "hashid",
+                "hashids",
+                "ids",
+                "obfuscate",
+                "youtube"
+            ],
+            "support": {
+                "issues": "https://github.com/vinkla/hashids/issues",
+                "source": "https://github.com/vinkla/hashids/tree/4.1.0"
+            },
+            "time": "2020-11-26T19:24:33+00:00"
+        },
         {
             "name": "intervention/image",
             "version": "2.7.2",
@@ -5811,6 +5963,80 @@
             },
             "time": "2024-12-21T16:25:41+00:00"
         },
+        {
+            "name": "vinkla/hashids",
+            "version": "9.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/vinkla/laravel-hashids.git",
+                "reference": "cb0086db96cdb49816465adc97e3a024c8ee9767"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/vinkla/laravel-hashids/zipball/cb0086db96cdb49816465adc97e3a024c8ee9767",
+                "reference": "cb0086db96cdb49816465adc97e3a024c8ee9767",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "graham-campbell/manager": "^4.4",
+                "hashids/hashids": "^4.1",
+                "illuminate/contracts": "^8.0",
+                "illuminate/support": "^8.0",
+                "php": "^7.3 || ^8.0"
+            },
+            "require-dev": {
+                "graham-campbell/analyzer": "^3.0",
+                "graham-campbell/testbench": "^5.4",
+                "mockery/mockery": "^1.3",
+                "phpunit/phpunit": "^9.3",
+                "squizlabs/php_codesniffer": "^3.5"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "aliases": {
+                        "Hashids": "Vinkla\\Hashids\\Facades\\Hashids"
+                    },
+                    "providers": [
+                        "Vinkla\\Hashids\\HashidsServiceProvider"
+                    ]
+                },
+                "branch-alias": {
+                    "dev-master": "9.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Vinkla\\Hashids\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Vincent Klaiber",
+                    "email": "hello@doubledip.se"
+                }
+            ],
+            "description": "A Hashids bridge for Laravel",
+            "keywords": [
+                "hashids",
+                "laravel"
+            ],
+            "support": {
+                "issues": "https://github.com/vinkla/laravel-hashids/issues",
+                "source": "https://github.com/vinkla/laravel-hashids/tree/9.1.0"
+            },
+            "time": "2020-11-26T19:38:22+00:00"
+        },
         {
             "name": "vlucas/phpdotenv",
             "version": "v5.6.1",

+ 6 - 3
routes/api.php

@@ -14,6 +14,9 @@ use Illuminate\Support\Facades\Route;
 |
 */
 
-Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
-    return $request->user();
-});
+// 登录
+Route::any('login/index', [App\Http\Controllers\Api\Login::class, 'index']);
+//手机密码登录
+Route::any('login/mobile', [App\Http\Controllers\Api\Login::class, 'mobile']);
+// 退出登录
+Route::any('login/out', [App\Http\Controllers\Api\Login::class, 'out']);