nncodes/laravel-meeting

使用 Laravel 处理在线会议

v1.1.0 2021-01-04 01:17 UTC

This package is auto-updated.

Last update: 2024-09-14 08:43:13 UTC


README

Latest Version on Packagist License Total Downloads

官方文档

简介

此包可以处理使用 Eloquent 模型的在线会议。它提供了一个简单、流畅的 API 来操作,默认使用 Zoom 作为提供商。

use Nncodes\Meeting\Models\Meeting;
use Nncodes\Meeting\Models\MeetingRoom;
use App\Models\Event;
use App\Models\Teacher;

$meeting = Meeting::schedule()
  	->withTopic('English class: verb to be')
  	->startingAt(now()->addMinutes(30))
  	->during(40) //in Minutes
  	->scheduledBy(Event::find(1))
  	->presentedBy(Teacher::find(1))
  	->hostedBy(MeetingRoom::find(1))
  	->save();

需求

此包需要 PHP 7.3+ 和 Laravel 6+。

此包使用 nncodes/meta-attributes 将元属性附加到模型上。

安装与配置

您可以通过 composer 安装此包

composer require nncodes/laravel-meeting

包将自动注册自己。

您可以使用 meeting:install 命令发布迁移,如果还要发布配置文件,请使用 --config

php artisan meeting:install --config

或者您可以使用传统方式发布

php artisan vendor:publish --provider="Nncodes\Meeting\MeetingServiceProvider" --tag="migrations"
php artisan vendor:publish --provider="Nncodes\MetaAttributes\MetaAttributesServiceProvider" --tag="migrations"

迁移发布后,您可以通过运行迁移来创建表

php artisan migrate

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

php artisan vendor:publish --provider="Nncodes\Meeting\MeetingServiceProvider" --tag="config"

这是已发布配置文件的内容

/**
 * Default Meeting Provider
 * 
 * Here you can specify which meeting provider the package should use by 
 * default. Of course you may use many providers at once using the package.
 */
'default' => env('MEETING_PROVIDER', 'zoom'),

/**
 * Meeting Providers
 * 
 * Here are each of the meetings provider setup for the package.
 */

'providers' => [

    'zoom' => [

         /**
         * Provider class
         **/
        'type' => \Nncodes\Meeting\Providers\Zoom\ZoomProvider::class,

        /**
         * JWT Zoom Token 
         * @see https://marketplace.zoom.us/docs/guides/auth/jwt
         **/
        'jwt_token' => env('ZOOM_TOKEN'),

        /**
         * Zoom Group ID
         * 
         * @see https://marketplace.zoom.us/docs/api-reference/zoom-api/groups/group
         **/
        'group_id' => env('ZOOM_GROUP'),

         /**
         * Share Rooms
         * 
         * Delegate to the package the responsability of handling the allocations of rooms.
         **/
        'share_rooms' => true,

         /**
         * Meeting resource seetings
         * 
         * @see https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meeting
         **/
        'meeting_settings' => [
            "host_video" => false,
            "participant_video" => false,
            "join_before_host" => false,
            "jbh_time" => 0,
            "mute_upon_entry" => true,
            "approval_type" => 0,
            "registration_type" => 1,
            "close_registration" => true,
            "waiting_room" => true,
            "registrants_confirmation_email" => false,
            "registrants_email_notification" => false,
            "meeting_authentication" => false
        ]
    ]
],

/**
 * Allow concurrent Meetings
 */
'allow_concurrent_meetings' => [
    'host' => false,
    'participant' => false,
    'presenter' => false,
    'scheduler' => true,
]

准备你的模型

调度器

负责安排会议,模型必须实现以下接口和特质

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Nncodes\Meeting\Concerns\SchedulesMeetings;
use Nncodes\Meeting\Contracts\Scheduler;

class Event extends Model implements Scheduler
{
    use SchedulesMeetings;
}

演示者

负责演示会议,模型必须实现以下接口和特质

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Nncodes\Meeting\Concerns\PresentsMeetings;
use Nncodes\Meeting\Contracts\Presenter;

class Teacher extends User implements Presenter
{
    use PresentsMeetings;
}

主持人

负责主持会议,模型必须实现以下接口和特质

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Nncodes\Meeting\Concerns\HostsMeetings;
use Nncodes\Meeting\Contracts\Host;

class Room extends Model implements Host
{
    use HostsMeetings;
}

参与者

允许加入会议,模型必须实现以下接口、特质以及 getEmailAddressgetFirstNamegetLastName 方法

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Nncodes\Meeting\Concerns\JoinsMeetings;
use Nncodes\Meeting\Contracts\Participant;

class Student extends User implements Participant
{
    use JoinsMeetings;

    /**
     * Email Address of the participant
     *
     * @return string
     */
    public function getParticipantEmailAddress(): string
    {
        return $this->email;
    }

    /**
     * First name of the participant
     *
     * @return string
     */
    public function getParticipantFirstName(): string
    {
        return $this->first_name;
    }

    /**
     * Last name of the participant
     *
     * @return string
     */
    public function getParticipantLastName(): string
    {
        return $this->last_name;
    }
}

安排会议

要安排会议,您需要使用以下方法正确填写会议数据

use Nncodes\Meeting\Models\Meeting;
use App\Models\Event;
use App\Models\Teacher;
use App\Models\Room;

$event = Event::find(1);
$teacher = Teacher::find(1);
$room = Room::find(1);

$meeting = Meeting::schedule()
  	->withTopic('English class: verb to be')
  	->startingAt(now()->addMinutes(30))
  	->during(40) //minutes
  	->scheduledBy($event)
  	->presentedBy($teacher)
  	->hostedBy($room)
  	->save();

或者您也可以通过 scheduler 模型安排

use Nncodes\Meeting\Models\Meeting;
use App\Models\Event;
use App\Models\Teacher;
use App\Models\Room;

$event->scheduleMeeting()
  	->withTopic('English class: verb to be')
  	->startingAt(now()->addMinutes(30))
  	->during(40) //minutes
  	->presentedBy($teacher)
  	->hostedBy($room)
  	->save()

当然,如果需要,您可以更新会议

use Nncodes\Meeting\Models\Meeting;
use App\Models\Event;
use App\Models\Teacher;
use App\Models\Room;

$meeting = Meeting::find(1);

$meeting->updateTopic('English class: Introducing Yourself')
    ->updateDuration(60)
    ->updateStartTime(now())
    ->updateScheduler(Event::find(1))
    ->updatePresenter(Teacher::find(5))
    ->updateHost(Room::find(1))
    ->save();

然后您可以添加参与者

use Nncodes\Meeting\Models\Meeting;
use App\Models\Student;

$meeting = Meeting::find(1);
$student = Student::find(1);

//By the meeting model
$meeting->addParticipant($student);

//Or by the participant model 
$student->bookMeeting($meeting);

要提供对演示者的访问,请使用

use Nncodes\Meeting\Models\Meeting;

Meeting::find(1)->getPresenterAccess();

对于参与者,请使用

use Nncodes\Meeting\Models\Meeting;
use App\Models\Student;

$student = Student::find(1);

Meeting::find(1)>getParticipantAccess($student);

更多: 处理已安排的会议

检索会议

您可以直接从会议模型调用

通过 Nncodes\Meeting\Models\Meeting 范围化会议。

$query = Meeting::query();

或者从任何行为者调用 meetings()

从调度器模型范围化会议,例如,使用 App\Models\Event 并带有 id:1

$query = Event::find(1)->meetings();

从演示者模型范围化会议,例如,使用 App\Models\Teacher 并带有 id:1

$query = Teacher::find(1)->meetings();

从主持人模型范围化会议,例如,使用 App\Models\Room 并带有 id:1

$query = Room::find(1)->meetings();

从参与者模型范围化会议,例如,使用 App\Models\Student 并带有 id:1

$query = Student::find(1)->meetings();

Eloquent 范围

一般范围

通过 uuid 范围化,例如 b33cac3a-c8da-4b33-a296-30a6acff5af6

$query->byUuid('b33cac3a-c8da-4b33-a296-30a6acff5af6');

通过 id 范围化,例如 1

$query->byId(1);

通过提供商范围化,例如 zoom

$query->provider('zoom');

start_timestarted_atended_at 的范围

从指定时间开始范围化,例如 15 天前

$query->startsFrom(Carbon::now()->sub('15 days'));

直到指定时间范围化,例如 15 天后

$query->startsUntil(Carbon::now()->add('15 days'));

或者在一个时间段内范围化,例如从 15 天前15 天后

$query->startsBetween(
    Carbon::now()->sub('15 days'),
    Carbon::now()->add('15 days')
);

通过状态 live 范围化,即已开始但尚未结束的会议。

$query->live();

通过状态 past 范围化,即已开始并结束的会议。

$query->past();

通过状态 scheduled 范围化,即尚未开始的会议。

$query->scheduled();

通过预定状态进行范围限定,且start_time已过去。查询即将开始的会议。

$query->late();

通过实时状态进行范围限定,且started_at + duration已过去。查询已超过预定时长的会议。

$query->exceeded();

通过预定状态进行范围限定,按start_time升序排序。查询下一场会议。

$query->next();

通过最后状态进行范围限定,按ended_at降序排序,查询最后一场会议。

$query->last();

针对演员的范围限定

通过调度器进行范围限定,例如App\Models\Eventid:1

$query->scheduler(Event::find(1));

通过主持人进行范围限定,例如App\Models\Roomid:1

$query->host(Room::find(1));

通过参与者进行范围限定,例如App\Models\Studentid:1

$query->participant(Student::find(1));

通过演讲者进行范围限定,例如App\Models\Teacherid:1

$query->presenter(Teacher::find(1));

最后,您可以通过调用任何Eloquent检索方法来检索数据,例如countfirstgetpaginate等。

处理已安排的会议

会议

当使用Zoom提供者时,您可以设置share_roomstrue,然后在安排会议时无需通知主持人。该包处理房间的分配。

在这种情况下,您可以安排使用

use Nncodes\Meeting\Models\Meeting;
use App\Models\Event;
use App\Models\Teacher;

$meeting = Meeting::schedule()
  	->withTopic('English class: verb to be')
  	->startingAt(now()->addMinutes(30))
  	->during(40) //minutes
  	->scheduledBy(Event::find(1))
  	->presentedBy(Teacher::find(1))
  	->save();

如果没有可用房间,将抛出异常\Nncodes\Meeting\Exceptions\NoZoomRoomAvailable

use Nncodes\Meeting\Models\Meeting;

开始会议。

Meeting::find(1)->start();

结束会议。

Meeting::find(1)->end();

取消会议。

Meeting::find(1)->cancel();

参与者

添加参与者

通过Nncodes\Meeting\Models\Meeting添加参与者

$student = Student::find(1);
Meeting::find(1)->addParticipant($student);

通过参与者模型App\Models\Student添加参与者

$meeting = Meeting::find(1);
Student::find(1)->bookMeeting($meeting);

取消参与

通过Nncodes\Meeting\Models\Meeting取消参与

$student = Student::find(1);
Meeting::find(1)->cancelParticipation($student);

通过参与者模型App\Models\Student添加参与者

$meeting = Meeting::find(1);
Student::find(1)->cancelMeetingParticipation($meeting);

加入会议

通过Nncodes\Meeting\Models\Meeting加入

$student = Student::find(1);
Meeting::find(1)->joinParticipant($student);

通过参与者模型App\Models\Student加入

$meeting = Meeting::find(1);
Student::find(1)->joinMeeting($meeting);
离开会议

通过Nncodes\Meeting\Models\Meeting离开

$student = Student::find(1);
Meeting::find(1)->leaveParticipant($student);

通过参与者模型App\Models\Student离开

$meeting = Meeting::find(1);
Student::find(1)->leaveMeeting($meeting);
获取参与者

获取一个参与者

$student = Student::find(1);
$participant = Meeting::find(1)->participant($student);

检查会议是否有参与者

$student = Student::find(1);
$bool = Meeting::find(1)->hasParticipant($student);

使用morphMany关系获取参与者列表

//Must inform the participant model type
$participants = Meeting::find(1)->participants(App\Models\Student::class)->get();

或使用participantsPivot关系。

//Doesn't need to inform participant model type, it gets all types. 
$participants = Meeting::find(1)->participantsPivot;

created_at降序获取第一个参与者,它允许将会议用作队列模式服务。

$participant = Meeting::find(1)->getNextParticipant();

主持人

范围和验证方法

给定以下代码

use Nncodes\Meeting\Models\MeetingRoom;

$startTime = Carbon::now()->addMinutes(30);
$duration = 40;
$endTime = (clone $startTime)->addMinutes($duration);

范围限定可用的主持人

MeetingRoom::availableBetween($startTime, $endTime);

范围限定忙碌的主持人

MeetingRoom::busyBetween($startTime, $endTime);

范围限定忙碌和可用的主持人,除了会议之外

use Nncodes\Meeting\Models\Meeting;

$except = Meeting::find(1);

MeetingRoom::availableBetween($startTime, $endTime, $except);
MeetingRoom::busyBetween($startTime, $endTime, $except);

然后您可以调用任何Eloquent检索方法,例如countfirstgetpaginate等。

您还可以检查房间实例是忙碌还是可用

use Nncodes\Meeting\Models\MeetingRoom;

MeetingRoom::find(1)->isAvailableBetween($startTime, $endTime);
MeetingRoom::find(1)->isBusyBetween($startTime, $endTime);

与范围方法一样,您也可以指定查询中要排除的会议

use Nncodes\Meeting\Models\MeetingRoom;
use Nncodes\Meeting\Models\Meeting;

$except = Meeting::find(1);

MeetingRoom::find(1)->isAvailableBetween($startTime, $endTime, $except);
MeetingRoom::find(1)->isBusyBetween($startTime, $endTime, $except);

变更日志

有关最近更改的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献指南

安全漏洞

有关如何报告安全漏洞的详细信息,请参阅我们的安全策略

致谢

许可

MIT许可(MIT)。有关更多信息,请参阅许可文件