Browse Source

feature: staff permission

Tokumeikoi 4 years ago
parent
commit
f0f636c722

+ 3 - 1
app/Http/Controllers/Guest/TelegramController.php

@@ -184,7 +184,7 @@ class TelegramController extends Controller
             abort(500, '用户不存在');
         }
         $ticketService = new TicketService();
-        if ($user->is_admin) {
+        if ($user->is_admin || $user->is_staff) {
             $ticketService->replyByAdmin(
                 $ticketId,
                 $msg->text,
@@ -194,4 +194,6 @@ class TelegramController extends Controller
         $telegramService = new TelegramService();
         $telegramService->sendMessage($msg->chat_id, "#`{$ticketId}` 的工单已回复成功", 'markdown');
     }
+
+
 }

+ 92 - 0
app/Http/Controllers/Staff/TicketController.php

@@ -0,0 +1,92 @@
+<?php
+
+namespace App\Http\Controllers\Staff;
+
+use App\Services\TicketService;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use App\Models\Ticket;
+use App\Models\TicketMessage;
+
+class TicketController extends Controller
+{
+    public function fetch(Request $request)
+    {
+        if ($request->input('id')) {
+            $ticket = Ticket::where('id', $request->input('id'))
+                ->first();
+            if (!$ticket) {
+                abort(500, '工单不存在');
+            }
+            $ticket['message'] = TicketMessage::where('ticket_id', $ticket->id)->get();
+            for ($i = 0; $i < count($ticket['message']); $i++) {
+                if ($ticket['message'][$i]['user_id'] !== $ticket->user_id) {
+                    $ticket['message'][$i]['is_me'] = true;
+                } else {
+                    $ticket['message'][$i]['is_me'] = false;
+                }
+            }
+            return response([
+                'data' => $ticket
+            ]);
+        }
+        $current = $request->input('current') ? $request->input('current') : 1;
+        $pageSize = $request->input('pageSize') >= 10 ? $request->input('pageSize') : 10;
+        $model = Ticket::orderBy('created_at', 'DESC');
+        if ($request->input('status') !== NULL) {
+            $model->where('status', $request->input('status'));
+        }
+        $total = $model->count();
+        $res = $model->forPage($current, $pageSize)
+            ->get();
+        for ($i = 0; $i < count($res); $i++) {
+            if ($res[$i]['last_reply_user_id'] == $request->session()->get('id')) {
+                $res[$i]['reply_status'] = 0;
+            } else {
+                $res[$i]['reply_status'] = 1;
+            }
+        }
+        return response([
+            'data' => $res,
+            'total' => $total
+        ]);
+    }
+
+    public function reply(Request $request)
+    {
+        if (empty($request->input('id'))) {
+            abort(500, '参数错误');
+        }
+        if (empty($request->input('message'))) {
+            abort(500, '消息不能为空');
+        }
+        $ticketService = new TicketService();
+        $ticketService->replyByAdmin(
+            $request->input('id'),
+            $request->input('message'),
+            $request->session()->get('id')
+        );
+        return response([
+            'data' => true
+        ]);
+    }
+
+    public function close(Request $request)
+    {
+        if (empty($request->input('id'))) {
+            abort(500, '参数错误');
+        }
+        $ticket = Ticket::where('id', $request->input('id'))
+            ->first();
+        if (!$ticket) {
+            abort(500, '工单不存在');
+        }
+        $ticket->status = 1;
+        if (!$ticket->save()) {
+            abort(500, '关闭失败');
+        }
+        return response([
+            'data' => true
+        ]);
+    }
+}

+ 1 - 1
app/Http/Kernel.php

@@ -68,7 +68,7 @@ class Kernel extends HttpKernel
         'user' => \App\Http\Middleware\User::class,
         'admin' => \App\Http\Middleware\Admin::class,
         'client' => \App\Http\Middleware\Client::class,
-        'server' => \App\Http\Middleware\Server::class,
+        'staff' => \App\Http\Middleware\Staff::class,
     ];
 
     /**

+ 23 - 0
app/Http/Middleware/Staff.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+
+class Staff
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param \Illuminate\Http\Request $request
+     * @param \Closure $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        if (!$request->session()->get('is_staff')) {
+            abort(403, '权限不足');
+        }
+        return $next($request);
+    }
+}

+ 3 - 0
app/Http/Requests/Admin/UserUpdate.php

@@ -23,6 +23,7 @@ class UserUpdate extends FormRequest
             'commission_rate' => 'nullable|integer|min:0|max:100',
             'discount' => 'nullable|integer|min:0|max:100',
             'is_admin' => 'required|in:0,1',
+            'is_staff' => 'required|in:0,1',
             'u' => 'integer',
             'd' => 'integer',
             'balance' => 'integer',
@@ -41,6 +42,8 @@ class UserUpdate extends FormRequest
             'banned.in' => '是否封禁格式不正确',
             'is_admin.required' => '是否管理员不能为空',
             'is_admin.in' => '是否管理员格式不正确',
+            'is_staff.required' => '是否员工不能为空',
+            'is_staff.in' => '是否员工格式不正确',
             'plan_id.integer' => '订阅计划格式不正确',
             'commission_rate.integer' => '推荐返利比例格式不正确',
             'commission_rate.nullable' => '推荐返利比例格式不正确',

+ 20 - 0
app/Http/Routes/StaffRoute.php

@@ -0,0 +1,20 @@
+<?php
+namespace App\Http\Routes;
+
+use Illuminate\Contracts\Routing\Registrar;
+
+class StaffRoute
+{
+    public function map(Registrar $router)
+    {
+        $router->group([
+            'prefix' => 'staff',
+            'middleware' => 'staff'
+        ], function ($router) {
+            // Ticket
+            $router->get ('/ticket/fetch', 'Staff\\TicketController@fetch');
+            $router->post('/ticket/reply', 'Staff\\TicketController@reply');
+            $router->post('/ticket/close', 'Staff\\TicketController@close');
+        });
+    }
+}

+ 4 - 1
app/Services/TelegramService.php

@@ -49,7 +49,10 @@ class TelegramService {
     public function sendMessageWithAdmin($message)
     {
         if (!config('v2board.telegram_bot_enable', 0)) return;
-        $users = User::where('is_admin', 1)
+        $users = User::where(function ($query) {
+            $query->where('is_admin', 1)
+                ->orWhere('is_staff', 1);
+        })
             ->where('telegram_id', '!=', NULL)
             ->get();
         foreach ($users as $user) {

+ 2 - 1
database/install.sql

@@ -270,6 +270,7 @@ CREATE TABLE `v2_user` (
   `enable` tinyint(1) NOT NULL DEFAULT '1',
   `banned` tinyint(1) NOT NULL DEFAULT '0',
   `is_admin` tinyint(1) NOT NULL DEFAULT '0',
+  `is_staff` tinyint(1) NOT NULL DEFAULT '0',
   `last_login_at` int(11) DEFAULT NULL,
   `last_login_ip` int(11) DEFAULT NULL,
   `uuid` varchar(36) NOT NULL,
@@ -288,4 +289,4 @@ CREATE TABLE `v2_user` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
--- 2020-09-04 07:38:57
+-- 2020-09-19 14:39:28

+ 3 - 0
database/update.sql

@@ -304,3 +304,6 @@ WHERE `ruleSettings` = '{}';
 ALTER TABLE `v2_plan`
 ADD `two_year_price` int(11) NULL AFTER `year_price`,
 ADD `three_year_price` int(11) NULL AFTER `two_year_price`;
+
+ALTER TABLE `v2_user`
+ADD `is_staff` tinyint(1) NOT NULL DEFAULT '0' AFTER `is_admin`;

File diff suppressed because it is too large
+ 0 - 0
public/assets/admin/umi.js


Some files were not shown because too many files changed in this diff