renatoxm/laravel-ticket

Laravel票务系统,帮助您轻松管理票务

v2.0.1 2024-04-10 20:16 UTC

This package is auto-updated.

Last update: 2024-09-10 21:10:43 UTC


README

处理票务系统的后端API。

Latest Version on Packagist Software License Tests StyleCI Total Downloads

简介

Laravel Ticket 包,是一个处理票务系统的后端API,操作简便。它是从 CoderFlex Laravel-ticket 分支出来的,重构后允许模型更新,更加灵活以适应应用需求。

主要区别

  • 所有模型都可以复制并修改以满足您的需求;您只需更改 config/laravel-ticket.php 中的路径。
  • 票务可以通过多态多对多关系分配给用户模型、组或团队。
  • 消息模型为了语义原因重命名为评论模型。
  • 为票务和评论模型的变更状态提供了事件支持。

安装

您可以通过composer安装此包

composer require Renatoxm/laravel-ticket

配置

您可以使用以下命令发布配置文件

php artisan vendor:publish --tag="ticket-config"

您可以使用以下命令发布并运行迁移

php artisan vendor:publish --tag="ticket-migrations"

在运行迁移之前,您可能需要发布配置文件,并确保当前表不会与您的现有应用程序冲突,一旦您对迁移表满意,您可以运行

php artisan migrate

准备你的模型

HasTickets 特性添加到您的 User 模型中,同时包含 CanUseTickets 接口

...
use Renatoxm\LaravelTicket\Concerns\HasTickets;
use Renatoxm\LaravelTicket\Contracts\CanUseTickets;
...
class User extends Model implements CanUseTickets
{
    ...
    use HasTickets;
    ...
}

模型定制

您可以将包中的模型之一或多个复制到您的 App/Models 文件夹中,以根据您的需求进行定制。您只需更改 config/laravel-ticket.php 中的类路径即可。

    'model' => [
        'category' => Renatoxm\LaravelTicket\Models\Category::class,
        'label' => Renatoxm\LaravelTicket\Models\Label::class,
        'comment' => Renatoxm\LaravelTicket\Models\Comment::class,
        'ticket' => Renatoxm\LaravelTicket\Models\Ticket::class,
    ],

用法

此包的基本用法是创建一个 ticket,然后将 labelscategories 关联到它。

您可以将尽可能多的 categories/labels 关联到单个票务。

以下是一个示例

use Renatoxm\LaravelTicket\Models\Ticket;
use Renatoxm\LaravelTicket\Models\Category;
use Renatoxm\LaravelTicket\Models\Label;

...
public function store(Request $request)
{
    /** @var User */
    $user = Auth::user();

    $ticket = $user->tickets()
                    ->create($request->validated());

    $category = Category::first();
    $label = Label::first();

    $ticket->attachCategories($category);
    $ticket->attachLabels($label);

    // or you can create the categories & the tickets directly by:
    // $ticket->categories()->create(...);
    // $ticket->labels()->create(...);

    return redirect(route('tickets.show', $ticket->uuid))
            ->with('success', __('Your Ticket Was created successfully.'));
}

public function createLabel()
{
    // If you create a label seperated from the ticket and wants to
    // associate it to a ticket, you may do the following.
    $label = Label::create(...);

    $label->tickets()->attach($ticket);

    // or maybe
    $label->tickets()->detach($ticket);
}

public function createCategory()
{
    // If you create a category/categories seperated from the ticket and wants to
    // associate it to a ticket, you may do the following.
    $category = Category::create(...);

    $category->tickets()->attach($ticket);

    // or maybe
    $category->tickets()->detach($ticket);
}
...

票务表结构

评论表结构

标签表结构

分类表结构

API方法

票务API方法

此模型包含方便的方法,可以快速构建,以下是可用的 API 列表

链式 列表示示方法的当前状态,即它是否可以链式调用,例如

    $ticket->archive()
            ->close()
            ->markAsResolved();

票务关系API方法

此模型还有一系列方法用于与相关模型交互

attachCategoriessyncCategories 方法是 attachsync laravel 方法的替代方案,如果您想了解更多,请查看此 链接

commentAsUser 接受一个用户作为第一个参数,如果为null,则默认使用 已认证 用户。

票务作用域

此模型还有一系列作用域,可以开始过滤。

分类和标签作用域

处理文件上传

此包目前不包含文件上传功能。相反,您可以使用 laravel-medialibrarySpatie 处理文件功能。

步骤非常直接,你需要做的就是以下内容。

通过在应用程序中创建一个新的模型文件来扩展 Ticket 模型。

php artisan make:model Ticket

然后扩展基本 Ticket Model,然后使用 spatie 包中的 InteractWithMedia 特性和 HasMedia 接口。

namespace App\Models\Ticket;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;

class Ticket extends \Renatoxm\LaravelTicket\Models\Ticket implements HasMedia
{
    use InteractsWithMedia;
}

其余的实现细节,请查阅 spatie 包的文档了解详情。

事件系统

所有事件都位于 Renatoxm\laravel-ticket\Events 命名空间中。

票据事件

以下事件是在触发了 Eloquent 事件后分发的。

  • TicketCreating
  • TicketCreated
  • TicketSaving
  • TicketSaved
  • TicketUpdating
  • TicketUpdated
  • TicketDeleting
  • TicketDeleted

评论事件

以下事件是在触发了 Eloquent 事件后分发的。

  • CommentCreating
  • CommentCreated
  • CommentSaving
  • CommentSaved
  • CommentUpdating
  • CommentUpdated
  • CommentDeleting
  • CommentDeleted

消费事件

use Renatoxm\LaravelTicket\Events\TicketCreated;

Event::listen(function (TicketCreated $event) {
    dump($event->ticket->title);
});

// or
Event::listen(TicketCreated::class, [SomeListener::class, 'handle']);

测试

composer test

变更日志

请参阅变更日志了解最近的变化。

贡献

请参阅贡献指南了解详情。

安全漏洞

请查阅我们的安全策略了解如何报告安全漏洞。

鸣谢

许可证

MIT. 请参阅许可文件了解更多信息。