cqpCow před 2 roky
rodič
revize
ad91d87946

+ 8 - 1
.idea/php.xml

@@ -89,11 +89,18 @@
       <path value="$PROJECT_DIR$/vendor/symfony/polyfill-php72" />
       <path value="$PROJECT_DIR$/vendor/asm89/stack-cors" />
       <path value="$PROJECT_DIR$/vendor/fruitcake/laravel-cors" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/cli-parser" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/code-unit" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/complexity" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/lines-of-code" />
+      <path value="$PROJECT_DIR$/vendor/phpunit/php-invoker" />
+      <path value="$PROJECT_DIR$/vendor/firebase/php-jwt" />
     </include_path>
   </component>
+  <component name="PhpProjectSharedConfiguration" php_language_level="7.2" />
   <component name="PhpUnit">
     <phpunit_settings>
-      <PhpUnitSettings load_method="CUSTOM_LOADER" custom_loader_path="$PROJECT_DIR$/vendor/autoload.php" />
+      <PhpUnitSettings custom_loader_path="$PROJECT_DIR$/vendor/autoload.php" />
     </phpunit_settings>
   </component>
 </project>

+ 34 - 167
.idea/workspace.xml

@@ -2,10 +2,20 @@
 <project version="4">
   <component name="ChangeListManager">
     <list default="true" id="ff358f50-3bf4-4e8f-b62d-63302d20ccc3" name="Default Changelist" comment="九方2.0版本">
+      <change afterPath="$PROJECT_DIR$/app/Http/Controllers/Api/LoginController.php" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/app/Http/Middleware/CheckLogin.php" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/app/Model/EmployeeManagerDepart.php" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/app/Model/EmployeeRole.php" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/app/Service/TokenService.php" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/php.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/php.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/app/Http/Controllers/Api/EmployeeController.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Http/Controllers/Api/EmployeeController.php" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/app/Http/Kernel.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Http/Kernel.php" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/app/Service/EmployeeService.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Service/EmployeeService.php" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/composer.json" beforeDir="false" afterPath="$PROJECT_DIR$/composer.json" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/composer.lock" beforeDir="false" afterPath="$PROJECT_DIR$/composer.lock" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/config/logging.php" beforeDir="false" afterPath="$PROJECT_DIR$/config/logging.php" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/routes/api.php" beforeDir="false" afterPath="$PROJECT_DIR$/routes/api.php" afterDir="false" />
     </list>
-    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -13,6 +23,7 @@
   </component>
   <component name="ComposerSettings" doNotAsk="true" synchronizationState="SYNCHRONIZE">
     <pharConfigPath>$PROJECT_DIR$/composer.json</pharConfigPath>
+    <execution />
   </component>
   <component name="DatabaseView">
     <option name="SHOW_INTERMEDIATE" value="true" />
@@ -28,154 +39,6 @@
     <expand />
     <select />
   </component>
-  <component name="FUSProjectUsageTrigger">
-    <session id="846866044">
-      <usages-collector id="statistics.lifecycle.project">
-        <counts>
-          <entry key="project.closed" value="3" />
-          <entry key="project.open.time.1" value="3" />
-          <entry key="project.open.time.11" value="1" />
-          <entry key="project.open.time.14" value="2" />
-          <entry key="project.open.time.27" value="1" />
-          <entry key="project.open.time.29" value="1" />
-          <entry key="project.open.time.33" value="1" />
-          <entry key="project.open.time.9" value="1" />
-          <entry key="project.opened" value="10" />
-        </counts>
-      </usages-collector>
-      <usages-collector id="statistics.file.extensions.open">
-        <counts>
-          <entry key="env" value="8" />
-          <entry key="gitignore" value="3" />
-          <entry key="json" value="3" />
-          <entry key="md" value="1" />
-          <entry key="php" value="132" />
-        </counts>
-      </usages-collector>
-      <usages-collector id="statistics.file.types.open">
-        <counts>
-          <entry key="JSON" value="3" />
-          <entry key="Markdown" value="1" />
-          <entry key="PHP" value="132" />
-          <entry key="PLAIN_TEXT" value="11" />
-        </counts>
-      </usages-collector>
-      <usages-collector id="statistics.file.extensions.edit">
-        <counts>
-          <entry key="dummy" value="34" />
-          <entry key="env" value="24" />
-          <entry key="php" value="11103" />
-          <entry key="txt" value="9" />
-        </counts>
-      </usages-collector>
-      <usages-collector id="statistics.file.types.edit">
-        <counts>
-          <entry key="PHP" value="11103" />
-          <entry key="PLAIN_TEXT" value="67" />
-        </counts>
-      </usages-collector>
-      <usages-collector id="statistics.vcs.git.usages">
-        <counts>
-          <entry key="git.branch.checkout.local" value="1" />
-          <entry key="git.branch.create.new" value="1" />
-        </counts>
-      </usages-collector>
-      <usages-collector id="statistics.js.language.service.starts">
-        <counts>
-          <entry key="TypeScriptServerServiceImpl" value="1" />
-        </counts>
-      </usages-collector>
-    </session>
-  </component>
-  <component name="FileEditorManager">
-    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/routes/api.php">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="324">
-              <caret line="18" column="16" selection-start-line="18" selection-start-column="12" selection-end-line="18" selection-end-column="16" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/Http/Controllers/Api/EmployeeController.php">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="6228">
-              <caret line="348" column="34" selection-start-line="348" selection-start-column="34" selection-end-line="348" selection-end-column="34" />
-              <folding>
-                <element signature="e#45#77#0#PHP" expanded="true" />
-              </folding>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/app/Service/EmployeeService.php">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="18">
-              <caret line="270" column="9" lean-forward="true" selection-start-line="270" selection-start-column="9" selection-end-line="270" selection-end-column="9" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/Service/SysMenuService.php">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="1386">
-              <caret line="77" column="9" selection-start-line="77" selection-start-column="9" selection-end-line="77" selection-end-column="9" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/Service/Order/OrderTransportService.php">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="234">
-              <caret line="18" selection-start-line="18" selection-end-line="18" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/.env">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="1008">
-              <caret line="56" selection-start-line="56" selection-end-line="56" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/routes/channels.php">
-          <provider selected="true" editor-type-id="text-editor" />
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/Providers/RouteServiceProvider.php">
-          <provider selected="true" editor-type-id="text-editor" />
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/helpers.php">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="4626">
-              <caret line="257" selection-start-line="257" selection-end-line="261" selection-end-column="1" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/Model/OrdersProductBom.php">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="234">
-              <caret line="13" column="42" selection-start-line="13" selection-start-column="42" selection-end-line="13" selection-end-column="42" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-    </leaf>
-  </component>
   <component name="FindInProjectRecents">
     <findStrings>
       <find>$return</find>
@@ -369,6 +232,12 @@
       <path value="$PROJECT_DIR$/vendor/symfony/polyfill-php72" />
       <path value="$PROJECT_DIR$/vendor/asm89/stack-cors" />
       <path value="$PROJECT_DIR$/vendor/fruitcake/laravel-cors" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/cli-parser" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/code-unit" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/complexity" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/lines-of-code" />
+      <path value="$PROJECT_DIR$/vendor/phpunit/php-invoker" />
+      <path value="$PROJECT_DIR$/vendor/firebase/php-jwt" />
     </include_path>
   </component>
   <component name="ProjectFrameBounds" extendedState="6">
@@ -376,6 +245,7 @@
     <option name="width" value="1680" />
     <option name="height" value="921" />
   </component>
+  <component name="ProjectId" id="2QUoRMwkvzBgqjd4yl5kjBQlWqI" />
   <component name="ProjectLevelVcsManager" settingsEditedManually="true" />
   <component name="ProjectView">
     <navigator proportions="" version="1">
@@ -433,6 +303,10 @@
       </pane>
     </panes>
   </component>
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
   <component name="PropertiesComponent">
     <property name="WebServerToolWindowFactoryState" value="true" />
     <property name="WebServerToolWindowPanel.toolwindow.highlight.mappings" value="true" />
@@ -440,32 +314,23 @@
     <property name="WebServerToolWindowPanel.toolwindow.show.date" value="false" />
     <property name="WebServerToolWindowPanel.toolwindow.show.permissions" value="false" />
     <property name="WebServerToolWindowPanel.toolwindow.show.size" value="false" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/app/Model" />
     <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
     <property name="nodejs_npm_path_reset_for_default_project" value="true" />
     <property name="nodejs_package_manager_path" value="npm" />
     <property name="settings.editor.selected.configurable" value="reference.webide.settings.project.settings.php" />
+    <property name="vue.rearranger.settings.migration" value="true" />
   </component>
   <component name="RecentsManager">
     <key name="CopyFile.RECENT_KEYS">
+      <recent name="D:\phpstudy_pro\WWW\jf_admin2.0\app\Model" />
+      <recent name="D:\phpstudy_pro\WWW\jf_admin2.0\app\Http\Middleware" />
+      <recent name="D:\phpstudy_pro\WWW\jf_admin2.0\app\Service" />
+      <recent name="D:\phpstudy_pro\WWW\jf_admin2.0\app\Http\Controllers\Api" />
       <recent name="$PROJECT_DIR$/app/Http/Controllers/Api" />
-      <recent name="$PROJECT_DIR$/app/Model" />
-      <recent name="$PROJECT_DIR$/app/Service" />
-      <recent name="$PROJECT_DIR$/app/Service/Order" />
-      <recent name="$PROJECT_DIR$/app" />
     </key>
   </component>
-  <component name="RunDashboard">
-    <option name="ruleStates">
-      <list>
-        <RuleState>
-          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
-        </RuleState>
-        <RuleState>
-          <option name="name" value="StatusDashboardGroupingRule" />
-        </RuleState>
-      </list>
-    </option>
-  </component>
+  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
   <component name="SvnConfiguration">
     <configuration />
   </component>
@@ -486,6 +351,8 @@
       <workItem from="1678970669012" duration="1211000" />
       <workItem from="1679507244910" duration="14000" />
       <workItem from="1684983506430" duration="4421000" />
+      <workItem from="1685417514339" duration="679000" />
+      <workItem from="1685418210972" duration="744000" />
     </task>
     <task id="LOCAL-00001" summary="九方2.0版本">
       <created>1675657293693</created>
@@ -595,7 +462,7 @@
     </layout-to-restore>
   </component>
   <component name="TypeScriptGeneratedFilesManager">
-    <option name="version" value="1" />
+    <option name="version" value="3" />
   </component>
   <component name="VcsContentAnnotationSettings">
     <option name="myLimit" value="2678400000" />

+ 28 - 0
app/Http/Controllers/Api/LoginController.php

@@ -0,0 +1,28 @@
+<?php
+namespace App\Http\Controllers\Api;
+
+use App\Service\EmployeeService;
+use App\Service\TokenService;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Log;
+
+//登录
+class LoginController extends BaseController
+{
+    public function login(Request $request){
+        $data = $request->only("account","password");
+
+        //登录
+        $result = (new EmployeeService())->loginRule($data);
+        list($bool, $return) = $result;
+        if(! $bool) return $this->json_return(201,'',$return);
+
+        //日志
+        $res = Log::channel('login')->info("登录成功", $return);
+
+        //生成token
+        $jwtToken = TokenService::getToken($return['id']);
+
+        return $this->json_return(200,'', ['token' => $jwtToken, 'emp_name'=>$return['name']]);
+    }
+}

+ 1 - 0
app/Http/Kernel.php

@@ -62,6 +62,7 @@ class Kernel extends HttpKernel
         'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
         'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
         'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
+        'checkLogin' => \App\Http\Middleware\CheckLogin::class,
     ];
 
     /**

+ 44 - 0
app/Http/Middleware/CheckLogin.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Service\EmployeeService;
+use Closure;
+use App\Service\TokenService;
+
+class CheckLogin
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        $token=$request->header('Authorization');
+        if (!isset($token)){
+            return  response()->json(['code'=>1,'msg'=>'缺少token','data'=>null]);
+        }
+        //校验token
+        $result = TokenService::verifyToken($token);
+        if ($result < 0){
+            return response()->json(['code'=>1,'msg'=>TokenService::error[$result],'data'=>null]);
+        }
+
+        //校验用户
+        $checkResult = EmployeeService::checkUser($result);
+        list($state, $data) = $checkResult;
+        if(! $state) return response()->json(['code'=>1,'msg'=>$data,'data'=>null]);
+
+        //人员角色
+        $data['role'] = EmployeeService::getPersonRole($result);
+        //部门权限
+        $data['rule_depart'] = EmployeeService::getPersonDepart($result);
+        //写入user信息
+        $request->userData = $data;
+
+        return $next($request);
+    }
+}

+ 14 - 0
app/Model/EmployeeManagerDepart.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class EmployeeManagerDepart extends Model
+{
+    protected $table = "employee_manager_depart"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+}

+ 14 - 0
app/Model/EmployeeRole.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class EmployeeRole extends Model
+{
+    protected $table = "employee_role"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+}

+ 96 - 1
app/Service/EmployeeService.php

@@ -2,11 +2,12 @@
 
 namespace App\Service;
 
-
 use App\Model\Depart;
 use App\Model\Employee;
 use App\Model\EmployeeDepartPermission;
+use App\Model\EmployeeManagerDepart;
 use App\Model\EmployeeMenuPermission;
+use App\Model\EmployeeRole;
 use App\Model\EmployeeTeamPermission;
 use App\Model\Role;
 use App\Model\SysMenu;
@@ -343,4 +344,98 @@ class EmployeeService extends Service
     }
 
 
+
+    public function loginRule($data){
+        if($this->isEmpty($data,'account')) return [false,'账号不能为空!'];
+        if($this->isEmpty($data,'password')) return [false,'密码不存在!'];
+
+        $res = Employee::where('del_time',0)
+            ->where('account', $data['account'])
+            ->get()->toArray();
+
+        if(empty($res)) return [false,'账号不存在或已被删除!'];
+
+        $res = reset($res);
+        if(! Hash::check($data['password'], $res['password'])) return [false,'密码错误!'];
+        if($res['is_admin'] != Employee::IS_ADMIN) return [false,'非管理员账号!'];
+        if($res['state'] == Employee::NOT_USE) return [false,'账号停用!'];
+
+        return [true, ['id'=>$res['id'], 'name'=>$res['emp_name'], 'account' => $res['account']]];
+    }
+
+    public static function checkUser($userId){
+        $res = Employee::where('id', $userId)
+            ->where('del_time',0)
+            ->where('is_admin',Employee::IS_ADMIN)
+            ->where('state',Employee::USE)->get()->first();
+        if(empty($res)) return [false, '该账号无法登录,请联系管理员!'];
+
+        return [true, $res];
+    }
+
+    //获取登录账号的角色
+    public static function getPersonRole($employee_id){
+        if(empty($employee_id)) return [];
+        $role = EmployeeRole::where('del_time',0)
+            ->where('employee_id',$employee_id)
+            ->select('role_id')
+            ->get()->toArray();
+
+        //组织
+        $role_id = array_column($role,'role_id');
+        asort($role_id);
+        $role_id = array_values($role_id);
+
+        return $role_id;
+    }
+
+    //获取登录账号的权限部门
+    public static function getPersonDepart($employee_id){
+        if(empty($employee_id)) return [];
+
+        //admin账号
+        if($employee_id == Employee::SPECIAL_ADMIN) return [Depart::RULE_DEPART];
+
+        //操作人员直接绑定部门
+        $employee_manager_depart = EmployeeManagerDepart::where('del_time',0)
+            ->where('employee_id',$employee_id)
+            ->select('depart_id')
+            ->get()->toArray();
+
+        //操作人员绑定角色
+        $employee_role = EmployeeRole::from('employee_role as a')
+            ->leftJoin('role_depart as b','b.role_id','a.role_id')
+            ->select('b.depart_id','b.role_id')
+            ->where('a.del_time',0)
+            ->where('b.del_time',0)
+            ->where('a.employee_id',$employee_id)
+            ->get()->toArray();
+
+        return array_filter(array_merge_recursive(array_column($employee_manager_depart,'depart_id'),array_column($employee_role,'depart_id')));
+    }
+
+    //人员直接绑定部门
+    public function employeeManagerDepart($data,$user){
+        if($user['id'] != Employee::SPECIAL_ADMIN) return [false,'非ADMIN账号不能操作'];
+
+        if($this->isEmpty($data,'employee_id')) return [false,'请选择操作人员'];
+        if($this->isEmpty($data,'depart_id')) return [false,'请选择部门'];
+
+        EmployeeManagerDepart::where('employee_id',$data['employee_id'])->update([
+            'del_time' => time()
+        ]);
+
+        $insert = [];
+        foreach ($data['depart_id'] as $value){
+            $insert[] = [
+                'employee_id' => $data['employee_id'],
+                'depart_id' => $value,
+                'crt_time' => time(),
+                'upd_time' => time(),
+            ];
+        }
+        EmployeeManagerDepart::insert($insert);
+
+        return [true,''];
+    }
 }

+ 62 - 0
app/Service/TokenService.php

@@ -0,0 +1,62 @@
+<?php
+
+namespace App\Service;
+
+use Firebase\JWT\JWT;
+use Firebase\JWT\Key;
+
+class TokenService
+{
+    const key = "jf2.0"; //签发人  可空
+    const validity = 8640000; //有效期
+    const error = [
+        -1 => "签名不正确",
+        -2 => "签名在某个时间点之后才能用",
+        -3 => "签名过期,重新登录",
+        -4 => "未知错误"
+    ];
+
+    /**
+     * Created by PhpStorm.
+     * User: Administrator
+     * Date: 2023/3/13
+     * Time: 16:43
+     * 获取token(登录以后)
+     */
+    public static function getToken($userId) :string{
+        $token = array(
+            "iat"=> time(), //签发时间
+            "nbf"=> time() - 1, //生效时间  (立即生效)
+            "exp"=> time() + TokenService::validity,
+            "data"=> [
+                'user_id' => $userId
+            ]
+        );
+        return JWT::encode($token,TokenService::key,"HS256");
+    }
+
+    /**
+     * Created by PhpStorm.
+     * User: Administrator
+     * Date: 2023/3/13
+     * Time: 16:52
+     * 解密token
+     */
+    public static function verifyToken($token){
+        try {
+            JWT::$leeway = 60;//当前时间减去60,把时间留点余地,同步其他服务器时间,解决nbf字段验证不通过问题
+            $decoded = JWT::decode($token,new Key(TokenService::key, "HS256")); //HS256方式,这里要和签发的时候对应
+
+            $arr = (array)$decoded;
+            return $arr['data']->user_id;
+        } catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
+            return -1;
+        } catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
+            return -2;
+        } catch (\Firebase\JWT\ExpiredException $e) { // token过期
+            return -3;
+        } catch (\Exception $e) { //其他错误
+            return -4;
+        }
+    }
+}

+ 1 - 0
composer.json

@@ -10,6 +10,7 @@
     "require": {
         "php": "^7.2.5|^8.0",
         "fideloper/proxy": "^4.4",
+        "firebase/php-jwt": "^6.4",
         "fruitcake/laravel-cors": "^2.2",
         "laravel/framework": "^6.20.26",
         "laravel/tinker": "^2.5"

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 269 - 169
composer.lock


+ 7 - 0
config/logging.php

@@ -99,6 +99,13 @@ return [
         'emergency' => [
             'path' => storage_path('logs/laravel.log'),
         ],
+        
+        //登录日志记录
+        'login' => [
+            'driver' => 'single',
+            'path' => storage_path('logs/login.log'),
+            'permission' => 0666
+        ],
     ],
 
 ];

+ 4 - 0
routes/api.php

@@ -16,6 +16,10 @@ use Illuminate\Http\Request;
 Route::middleware('auth:api')->get('/user', function (Request $request) {
     return $request->user();
 });
+Route::any('login', 'Api\LoginController@login');
+Route::group(['middleware'=> ['checkLogin']],function ($route){
+
+});
 Route::any('menuAdd', 'Api\SysMenuController@add');
 Route::any('menuEdit', 'Api\SysMenuController@edit');
 Route::any('menuDel', 'Api\SysMenuController@del');

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů