first
This commit is contained in:
5
modules/Task/Config/config.php
Normal file
5
modules/Task/Config/config.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'name' => 'Task'
|
||||
];
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class CreateTaskCategoriesTable extends Migration
|
||||
{
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('task_categories', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('title')->comment('分类标题');
|
||||
$table->string('remark')->comment('分类描述');
|
||||
$table->string('cover')->nullable()->comment('展示图片');
|
||||
$table->boolean('status')->default(0)->comment('状态');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('task_categories');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class CreateTaskLogsTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('task_logs', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->unsignedBigInteger('user_id')->index();
|
||||
$table->unsignedBigInteger('task_id')->index();
|
||||
$table->json('source')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('task_logs');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class CreateTaskUsersTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('task_users', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->unsignedBigInteger('user_id')->index();
|
||||
$table->unsignedBigInteger('task_id')->index();
|
||||
$table->timestamp('task_at')->index()->comment('做任务的日期');
|
||||
$table->integer('total')->default(1)->comment('任务量');
|
||||
$table->boolean('status')->default(0)->index()->comment('状态');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('task_users');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class CreateTasksTable extends Migration
|
||||
{
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('tasks', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->unsignedBigInteger('category_id')->default(0)->index();
|
||||
$table->string('title', 100)->nullable()->comment('任务标题');
|
||||
$table->string('sub_title')->nullable()->comment('副标题');
|
||||
$table->string('key', 100)->nullable()->comment('任务标识');
|
||||
$table->string('ico', 200)->nullable()->comment('任务图标');
|
||||
$table->string('cover')->nullable()->comment('图片');
|
||||
$table->integer('position')->default(0)->comment('定位');
|
||||
$table->json('identity')->nullable()->comment('可用身份');
|
||||
$table->string('remark', 100)->nullable()->comment('任务描述');
|
||||
$table->string('tips', 100)->nullable()->comment('任务奖励提示');
|
||||
$table->text('description')->nullable()->comment('任务详细说明');
|
||||
$table->string('url', 200)->nullable()->comment('任务目标连接');
|
||||
$table->integer('rule_id')->nullable()->comment('对应账变规则');
|
||||
$table->decimal('rule_number', 8, 2)->default(0)->comment('任务发放的数值');
|
||||
$table->string('type', 20)->nullable()->comment('任务计量类型');
|
||||
$table->unsignedInteger('task_number')->default(0)->comment('任务数额');
|
||||
$table->boolean('company_certify')->nullable()->comment('是否企业认证');
|
||||
$table->string('cycle', 20)->nullable()->comment('周期');
|
||||
$table->boolean('status')->default(0)->comment('状态');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('tasks');
|
||||
}
|
||||
|
||||
}
|
||||
105
modules/Task/Facades/TaskFacade.php
Normal file
105
modules/Task/Facades/TaskFacade.php
Normal file
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Facades;
|
||||
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Modules\Task\Models\Task;
|
||||
use Modules\Task\Models\User;
|
||||
|
||||
class TaskFacade
|
||||
{
|
||||
/**
|
||||
* Notes: 执行任务
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/20 13:15
|
||||
* @param $key
|
||||
* @param $user_id
|
||||
* @param array $source
|
||||
*/
|
||||
public static function do($key, $user_id, array $source = [], $total = 1)
|
||||
{
|
||||
$task = Task::query()->shown()->where('key', $key)->first();
|
||||
|
||||
if ($task) {
|
||||
$timeRange = self::getTimeInterval($task->cycle);
|
||||
|
||||
$task->taskLogs()->create([
|
||||
'user_id' => $user_id,
|
||||
'source' => $source,
|
||||
]);
|
||||
|
||||
$taskUser = $task->taskUsers()
|
||||
->when($task->cycle != 'one', function ($q) use ($timeRange) {
|
||||
$q->whereBetween('task_at', $timeRange);
|
||||
})
|
||||
->byUserId($user_id)
|
||||
->first();
|
||||
|
||||
if (! $taskUser) {
|
||||
$taskUser = $task->taskUsers()->create([
|
||||
'user_id' => $user_id,
|
||||
'task_at' => now(),
|
||||
'total' => $total,
|
||||
]);
|
||||
} else {
|
||||
$taskUser->incrementTotal($total);//增加数值
|
||||
}
|
||||
|
||||
//存在任务
|
||||
if ($taskUser->total >= $task->task_number && $taskUser->status == User::STATUS_INTI) {
|
||||
$taskUser->status = User::STATUS_FINISH;
|
||||
$taskUser->save();
|
||||
$variable = $task->getRuleNumber();
|
||||
info('key '.$key.' variable'.$variable);
|
||||
|
||||
if ($variable > 0) {
|
||||
//发放水滴
|
||||
$taskUser->user->account->rule($task->rule_id, $variable, false, $source ?? []);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 获取时间区间
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/20 10:37
|
||||
* @param $type
|
||||
* @param string $date
|
||||
* @return array|void
|
||||
*/
|
||||
public static function getTimeInterval($type, string $date = '')
|
||||
{
|
||||
switch ($type) {
|
||||
case 'day':
|
||||
return [
|
||||
'start_at' => Carbon::parse($date)->startOfDay(),
|
||||
'end_at' => Carbon::parse($date)->endOfDay(),
|
||||
];
|
||||
case 'week':
|
||||
return [
|
||||
'start_at' => Carbon::parse($date)->startOfWeek(),
|
||||
'end_at' => Carbon::parse($date)->endOfWeek(),
|
||||
];
|
||||
case 'month':
|
||||
return [
|
||||
'start_at' => Carbon::parse($date)->startOfMonth(),
|
||||
'end_at' => Carbon::parse($date)->endOfMonth(),
|
||||
];
|
||||
case 'year':
|
||||
return [
|
||||
'start_at' => Carbon::parse($date)->startOfYear(),
|
||||
'end_at' => Carbon::parse($date)->endOfYear(),
|
||||
];
|
||||
case 'one':
|
||||
return [
|
||||
'start_at' => '',
|
||||
'end_at' => Carbon::parse($date)->endOfDay(),
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
54
modules/Task/Http/Controllers/Admin/CategoryController.php
Normal file
54
modules/Task/Http/Controllers/Admin/CategoryController.php
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Http\Controllers\Admin;
|
||||
|
||||
use App\Admin\Traits\WithUploads;
|
||||
use Encore\Admin\Controllers\AdminController;
|
||||
use Encore\Admin\Form;
|
||||
use Encore\Admin\Grid;
|
||||
use Modules\Linker\Traits\WithLinker;
|
||||
use Modules\Task\Models\Category;
|
||||
|
||||
class CategoryController extends AdminController
|
||||
{
|
||||
|
||||
use WithUploads, WithLinker;
|
||||
|
||||
protected $title = '分类管理';
|
||||
|
||||
public function grid(): Grid
|
||||
{
|
||||
$grid = new Grid(new Category());
|
||||
$grid->column('id', '#ID#');
|
||||
$grid->column('cover', '分类图片')->image('', 50, 100);
|
||||
$grid->column('title', '分类名称');
|
||||
$grid->column('remark', '描述');
|
||||
$grid->column('status', '状态')->switch([
|
||||
'on' => ['value' => 1, 'text' => '打开', 'color' => 'success'],
|
||||
'off' => ['value' => 0, 'text' => '关闭', 'color' => 'danger'],
|
||||
]);
|
||||
$grid->column('created_at', '创建时间');
|
||||
$grid->column('updated_at', '更新时间');
|
||||
|
||||
return $grid;
|
||||
}
|
||||
|
||||
public function form(): Form
|
||||
{
|
||||
$form = new Form(new Category());
|
||||
$form->text('title', '分类名称')->required();
|
||||
$form->text('remark', '描述')->required();
|
||||
|
||||
$this->cover($form);
|
||||
|
||||
$this->withUrl($form);
|
||||
|
||||
$form->switch('status', '是否开启')->default(1)->states([
|
||||
'on' => ['value' => 1, 'text' => '打开', 'color' => 'success'],
|
||||
'off' => ['value' => 0, 'text' => '关闭', 'color' => 'danger'],
|
||||
]);
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
}
|
||||
139
modules/Task/Http/Controllers/Admin/TaskController.php
Normal file
139
modules/Task/Http/Controllers/Admin/TaskController.php
Normal file
@@ -0,0 +1,139 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Http\Controllers\Admin;
|
||||
|
||||
use App\Admin\Traits\WithUploads;
|
||||
use Encore\Admin\Controllers\AdminController;
|
||||
use Encore\Admin\Form;
|
||||
use Encore\Admin\Grid;
|
||||
use Illuminate\Support\MessageBag;
|
||||
use Modules\Linker\Traits\WithLinker;
|
||||
use Modules\Task\Models\Category;
|
||||
use Modules\Task\Models\Task;
|
||||
use Modules\User\Models\AccountRule;
|
||||
use Modules\User\Models\Identity;
|
||||
use Modules\User\Models\IdentityMiddle;
|
||||
|
||||
class TaskController extends AdminController
|
||||
{
|
||||
|
||||
use WithUploads, WithLinker;
|
||||
|
||||
protected $title = '任务管理';
|
||||
|
||||
public function grid(): Grid
|
||||
{
|
||||
$grid = new Grid(new Task());
|
||||
$grid->filter(function (Grid\Filter $filter) {
|
||||
$filter->column(1 / 3, function (Grid\Filter $filter) {
|
||||
$filter->like('title', '任务名称');
|
||||
});
|
||||
$filter->column(1 / 3, function (Grid\Filter $filter) {
|
||||
$filter->equal('category_id', '分类')->select(Category::shown()->pluck('title', 'id'));
|
||||
});
|
||||
$filter->column(1 / 3, function (Grid\Filter $filter) {
|
||||
$filter->equal('status', '状态')->select((new Task())->status_map);
|
||||
});
|
||||
});
|
||||
|
||||
$grid->column('id', '#ID#');
|
||||
$grid->column('ico', '任务图标')->image('', 40, 40);
|
||||
$grid->column('cover', '图片')->image('', 40, 40);
|
||||
$grid->column('title', '任务名称');
|
||||
$grid->column('key', '任务关键字');
|
||||
$grid->column('category.title', '所属分类');
|
||||
$grid->column('rule.title', '账变名称');
|
||||
$grid->column('remark', '任务描述');
|
||||
$grid->column('tips', '任务奖励提示');
|
||||
$grid->column('type', '任务计量类型')->using(Task::TYPES);
|
||||
$grid->column('cycle', '任务计量周期')->using(Task::CYCLES);
|
||||
// $grid->column('company_certify', '企业认证')
|
||||
// ->using(Task::COMPANY_CERTIFICATIONS)
|
||||
// ->label(Task::COMPANY_CERTIFICATION_LABEL);
|
||||
|
||||
$status = [
|
||||
'on' => ['value' => 1, 'text' => '打开', 'color' => 'success'],
|
||||
'off' => ['value' => 0, 'text' => '关闭', 'color' => 'danger'],
|
||||
];
|
||||
|
||||
// $grid->column('展示位置')
|
||||
// ->display(function () {
|
||||
// $data = [];
|
||||
// foreach ($this->position as $position) {
|
||||
// $data[] = $this->position_map[$position];
|
||||
// }
|
||||
//
|
||||
// return $data;
|
||||
// })
|
||||
// ->label();
|
||||
|
||||
$grid->column('身份')
|
||||
->display(function () {
|
||||
return $this->getIdentities();
|
||||
})->label();
|
||||
$grid->column('status', '状态')->switch($status);
|
||||
|
||||
$grid->column('created_at', '创建时间');
|
||||
$grid->column('updated_at', '更新时间');
|
||||
|
||||
return $grid;
|
||||
}
|
||||
|
||||
public function form(): Form
|
||||
{
|
||||
$form = new Form(new Task());
|
||||
|
||||
|
||||
$form->text('title', '任务标题')->required();
|
||||
// $form->text('sub_title', '副标题');
|
||||
// $form->text('remark', '任务描述');
|
||||
$form->text('tips', '任务奖励提示')->required();
|
||||
$form->text('key', '任务关键字')->required();
|
||||
$form->select('category_id', '所属分类')
|
||||
->options(Category::query()->shown()->pluck('title', 'id'))
|
||||
->required();
|
||||
$this->cover($form, 'ico', 'ICO图标');
|
||||
$this->cover($form, 'cover', '图片');
|
||||
// $form->multipleSelect('position', '展示位置')
|
||||
// ->options($form->model()->position_map);
|
||||
$form->multipleSelect('identity', '可用身份')
|
||||
->options(Identity::pluck('name', 'id'));
|
||||
|
||||
$form->select('rule_id', '对应账变规则')
|
||||
->options(function () {
|
||||
return AccountRule::where('type', 'score')->pluck('title', 'id');
|
||||
})
|
||||
->required();
|
||||
$form->currency('rule_number', '账变数值')
|
||||
->default(0)
|
||||
->help('0为获取账变设置的数值')
|
||||
->required();
|
||||
|
||||
$this->withUrl($form);
|
||||
|
||||
// $form->radio('company_certify', '企业认证')
|
||||
// ->options(Task::COMPANY_CERTIFICATIONS)
|
||||
// ->default(Task::COMPANY_CERTIFICATION_NO)
|
||||
// ->required();
|
||||
$form->radio('type', '任务计量类型')->default(Task::TYPE_COUNT)->options(Task::TYPES)->required();
|
||||
$form->radio('cycle', '任务计量周期')->default(Task::CYCLE_DAY)->options(Task::CYCLES)->required();
|
||||
$form->number('task_number', '任务量')->default(1)->required();
|
||||
// $form->ueditor('description', '任务详情')->required();
|
||||
$form->switch('status', '是否开启')->states([
|
||||
'on' => ['value' => 1, 'text' => '打开', 'color' => 'success'],
|
||||
'off' => ['value' => 0, 'text' => '关闭', 'color' => 'danger'],
|
||||
]);
|
||||
$form->saving(function (Form $form) {
|
||||
$task = Task::query()->where('key', $form->key)->first();
|
||||
if ($task && $form->isCreating()) {
|
||||
$error = new MessageBag([
|
||||
'title' => '错误',
|
||||
'message' => '任务关键字已经存在',
|
||||
]);
|
||||
return back()->withInput()->with(compact('error'));
|
||||
}
|
||||
});
|
||||
return $form;
|
||||
}
|
||||
|
||||
}
|
||||
50
modules/Task/Http/Controllers/Admin/UserController.php
Normal file
50
modules/Task/Http/Controllers/Admin/UserController.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Http\Controllers\Admin;
|
||||
|
||||
use App\Admin\Traits\WithUploads;
|
||||
use Encore\Admin\Controllers\AdminController;
|
||||
use Encore\Admin\Form;
|
||||
use Encore\Admin\Grid;
|
||||
use Illuminate\Support\MessageBag;
|
||||
use Modules\Linker\Traits\WithLinker;
|
||||
use Modules\Task\Models\Category;
|
||||
use Modules\Task\Models\Task;
|
||||
use Modules\Task\Models\User;
|
||||
use Modules\User\Models\AccountRule;
|
||||
use Modules\User\Models\Identity;
|
||||
use Modules\User\Models\IdentityMiddle;
|
||||
|
||||
class UserController extends AdminController
|
||||
{
|
||||
|
||||
use WithUploads, WithLinker;
|
||||
|
||||
protected $title = '任务管理';
|
||||
|
||||
public function grid(): Grid
|
||||
{
|
||||
$grid = new Grid(new User());
|
||||
|
||||
$grid->disableCreateButton();
|
||||
$grid->disableActions();
|
||||
|
||||
$grid->filter(function (Grid\Filter $filter) {
|
||||
$filter->column(1 / 3, function (Grid\Filter $filter) {
|
||||
$filter->equal('user_id', '下单用户')->select()->ajax(route('admin.user.users.ajax'));
|
||||
});
|
||||
$filter->column(1 / 3, function (Grid\Filter $filter) {
|
||||
$filter->equal('task_id', '任务')->select(Task::query()->pluck('title', 'id'));
|
||||
});
|
||||
});
|
||||
|
||||
$grid->column('id', '#ID#');
|
||||
$grid->column('task.title', '任务');
|
||||
$grid->column('user.username', '用户');
|
||||
$grid->column('task.task_number', '任务量');
|
||||
$grid->column('total', '完成次数');
|
||||
$grid->column('task_at', '时间');
|
||||
|
||||
return $grid;
|
||||
}
|
||||
}
|
||||
21
modules/Task/Http/Controllers/Api/CategoryController.php
Normal file
21
modules/Task/Http/Controllers/Api/CategoryController.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Task\Http\Resources\CategoryResource;
|
||||
use Modules\Task\Models\Category;
|
||||
|
||||
class CategoryController extends Controller
|
||||
{
|
||||
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$tasks = Category::Shown()->get();
|
||||
|
||||
return $this->success(CategoryResource::collection($tasks));
|
||||
}
|
||||
|
||||
}
|
||||
39
modules/Task/Http/Controllers/Api/TaskController.php
Normal file
39
modules/Task/Http/Controllers/Api/TaskController.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Jason\Api\Api;
|
||||
use Modules\Task\Http\Resources\TaskBaseResource;
|
||||
use Modules\Task\Http\Resources\TaskResource;
|
||||
use Modules\Task\Models\Task;
|
||||
|
||||
class TaskController extends Controller
|
||||
{
|
||||
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$user = Api::user();
|
||||
$category_id = $request->category_id ?? '';
|
||||
|
||||
$tasks = Task::query()
|
||||
->when($category_id, function ($q) use ($category_id) {
|
||||
$q->where('category_id', $category_id);
|
||||
})
|
||||
->Shown()
|
||||
->when($user, function ($q) use ($user) {
|
||||
$q->ofUser($user);
|
||||
})
|
||||
->get();
|
||||
|
||||
return $this->success(TaskBaseResource::collection($tasks));
|
||||
}
|
||||
|
||||
public function show(Task $task)
|
||||
{
|
||||
return $this->success(new TaskResource($task));
|
||||
}
|
||||
|
||||
}
|
||||
76
modules/Task/Http/Controllers/Api/UserController.php
Normal file
76
modules/Task/Http/Controllers/Api/UserController.php
Normal file
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use EasyWeChat\Factory;
|
||||
use Illuminate\Support\Collection;
|
||||
use Jason\Api\Api;
|
||||
use Modules\Task\Facades\TaskFacade;
|
||||
use Modules\Task\Models\Task;
|
||||
|
||||
class UserController extends Controller
|
||||
{
|
||||
/**
|
||||
* Notes: 微信步数
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/26 9:46
|
||||
*/
|
||||
public function wechatStep(Request $request)
|
||||
{
|
||||
|
||||
try {
|
||||
$key = 'steps';
|
||||
$task = Task::query()->where('key', $key)->first();
|
||||
if ($task && $task->status != Task::STATUS_UP) {
|
||||
throw new \Exception('任务关闭');
|
||||
}
|
||||
|
||||
$toDayStartTimestamp = Carbon::now()->startOfDay()->timestamp;//当天开始的时间戳
|
||||
|
||||
$app = Factory::miniProgram([
|
||||
'app_id' => env('WECHAT_MINI_PROGRAM_APPID'),
|
||||
'secret' => env('WECHAT_MINI_PROGRAM_SECRET'),
|
||||
'response_type' => 'collection',
|
||||
]);
|
||||
|
||||
$session = $app->auth->session($request->code);
|
||||
if ($session->errcode) {
|
||||
return $this->failed($session->errmsg);
|
||||
}
|
||||
|
||||
$decryptedData = $app->encryptor->decryptData(
|
||||
$session->session_key,
|
||||
$request->iv,
|
||||
$request->encryptData
|
||||
);
|
||||
|
||||
$list = collect($decryptedData['stepInfoList']);
|
||||
|
||||
if ($list->isNotEmpty()) {
|
||||
$toDay = $list->where('timestamp', $toDayStartTimestamp)->first();
|
||||
if ($toDay) {
|
||||
TaskFacade::do($key, Api::userId(), [
|
||||
'steps' => $toDay['step']
|
||||
], $toDay['step']);
|
||||
}
|
||||
|
||||
if ($toDay['step'] >= $task->task_number) {
|
||||
return $this->success('任务完成');
|
||||
} else {
|
||||
throw new \Exception('您今天的步数未达标');
|
||||
}
|
||||
} else {
|
||||
throw new \Exception('未获取到微信运动数据');
|
||||
}
|
||||
|
||||
|
||||
} catch (\Exception $exception) {
|
||||
return $this->failed($exception->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
21
modules/Task/Http/Resources/CategoryResource.php
Normal file
21
modules/Task/Http/Resources/CategoryResource.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class CategoryResource extends JsonResource
|
||||
{
|
||||
|
||||
public function toArray($request): array
|
||||
{
|
||||
return [
|
||||
'category_id' => $this->id,
|
||||
'title' => $this->title,
|
||||
'remark' => $this->remark,
|
||||
'cover' => $this->cover_url,
|
||||
'url' => $this->linker,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
27
modules/Task/Http/Resources/TaskBaseResource.php
Normal file
27
modules/Task/Http/Resources/TaskBaseResource.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
use Jason\Api\Api;
|
||||
|
||||
class TaskBaseResource extends JsonResource
|
||||
{
|
||||
|
||||
public function toArray($request): array
|
||||
{
|
||||
$user = Api::user();
|
||||
|
||||
return [
|
||||
'id' => $this->id,
|
||||
'ico' => $this->ico_url,
|
||||
'key' => $this->key,
|
||||
'cover' => $this->cover_url,
|
||||
'title' => $this->title,
|
||||
'tips' => $this->tips,
|
||||
'linker' => $this->linker,
|
||||
'user' => $this->getUserTask($user),
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
36
modules/Task/Http/Resources/TaskResource.php
Normal file
36
modules/Task/Http/Resources/TaskResource.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
use Jason\Api\Api;
|
||||
|
||||
class TaskResource extends JsonResource
|
||||
{
|
||||
|
||||
public function toArray($request): array
|
||||
{
|
||||
$user = Api::user();
|
||||
|
||||
return [
|
||||
'id' => $this->id,
|
||||
'ico' => $this->ico_url,
|
||||
'key' => $this->key,
|
||||
'cover' => $this->cover_url,
|
||||
'title' => $this->title,
|
||||
'sub_title' => $this->sub_title,
|
||||
'remark' => $this->remark,
|
||||
'tips' => $this->tips,
|
||||
'url' => $this->linker,
|
||||
'category' => new CategoryResource($this->category),
|
||||
'rule' => [
|
||||
'id' => $this->rule->id,
|
||||
'name' => $this->rule->name,
|
||||
'title' => $this->rule->title,
|
||||
],
|
||||
'user' => $this->getUserTask($user),
|
||||
'content' => $this->description,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
21
modules/Task/Models/Category.php
Normal file
21
modules/Task/Models/Category.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Models;
|
||||
|
||||
use App\Models\Model;
|
||||
use App\Traits\HasCovers;
|
||||
use App\Traits\HasStatus;
|
||||
use Modules\Linker\Traits\HasLinker;
|
||||
|
||||
class Category extends Model
|
||||
{
|
||||
|
||||
use HasLinker,
|
||||
HasCovers,
|
||||
HasStatus;
|
||||
|
||||
public string $cover_field = 'cover';
|
||||
|
||||
protected $table = 'task_categories';
|
||||
|
||||
}
|
||||
19
modules/Task/Models/Log.php
Normal file
19
modules/Task/Models/Log.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Models;
|
||||
|
||||
use App\Models\Model;
|
||||
use Modules\Task\Models\Traits\BelongsToTask;
|
||||
use Modules\User\Traits\BelongsToUser;
|
||||
|
||||
class Log extends Model
|
||||
{
|
||||
use BelongsToUser, BelongsToTask;
|
||||
|
||||
protected $table = 'task_logs';
|
||||
|
||||
public $casts = [
|
||||
'source' => 'json',
|
||||
];
|
||||
|
||||
}
|
||||
203
modules/Task/Models/Task.php
Normal file
203
modules/Task/Models/Task.php
Normal file
@@ -0,0 +1,203 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Models;
|
||||
|
||||
use App\Models\Model;
|
||||
use App\Traits\HasCovers;
|
||||
use App\Traits\HasStatus;
|
||||
use App\Traits\WithPosition;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Modules\Linker\Traits\HasLinker;
|
||||
use Modules\Task\Models\Traits\TaskAttribute;
|
||||
use Modules\User\Models\AccountRule;
|
||||
use Modules\User\Models\Identity;
|
||||
use Modules\User\Models\User;
|
||||
use Modules\Task\Models\User as TaskUser;
|
||||
|
||||
class Task extends Model
|
||||
{
|
||||
|
||||
use HasLinker,
|
||||
HasCovers,
|
||||
WithPosition,
|
||||
TaskAttribute,
|
||||
HasStatus;
|
||||
|
||||
const CYCLE_DAY = 'day';
|
||||
const CYCLE_WEEK = 'week';
|
||||
const CYCLE_MONTH = 'month';
|
||||
const CYCLE_YEAR = 'year';
|
||||
const CYCLE_ONE = 'one';
|
||||
|
||||
const CYCLES = [
|
||||
self::CYCLE_DAY => '日',
|
||||
self::CYCLE_WEEK => '周',
|
||||
self::CYCLE_MONTH => '月',
|
||||
self::CYCLE_YEAR => '年',
|
||||
self::CYCLE_ONE => '一次',
|
||||
];
|
||||
|
||||
const TYPE_SUM = 'sum';
|
||||
const TYPE_COUNT = 'count';
|
||||
|
||||
const TYPES = [
|
||||
self::TYPE_SUM => '和值',
|
||||
self::TYPE_COUNT => '计数',
|
||||
];
|
||||
|
||||
const COMPANY_CERTIFICATION_YES = 1;
|
||||
const COMPANY_CERTIFICATION_NO = 0;
|
||||
|
||||
const COMPANY_CERTIFICATIONS = [
|
||||
self::COMPANY_CERTIFICATION_YES => '是',
|
||||
self::COMPANY_CERTIFICATION_NO => '否',
|
||||
];
|
||||
|
||||
const COMPANY_CERTIFICATION_LABEL = [
|
||||
self::COMPANY_CERTIFICATION_YES => 'info',
|
||||
self::COMPANY_CERTIFICATION_NO => 'success',
|
||||
];
|
||||
|
||||
const POSITION_RECOMMENDED = 1;
|
||||
|
||||
public array $position_map = [
|
||||
self::POSITION_RECOMMENDED => '推荐',
|
||||
];
|
||||
|
||||
public string $cover_field = 'cover';
|
||||
|
||||
public $casts = [
|
||||
'identity' => 'json',
|
||||
];
|
||||
|
||||
|
||||
const STATUS_DOWN = 0;
|
||||
const STATUS_UP = 1;
|
||||
|
||||
public array $status_map = [
|
||||
self::STATUS_UP => '开启',
|
||||
self::STATUS_DOWN => '关闭',
|
||||
];
|
||||
|
||||
public function getIcoUrlAttribute(): string
|
||||
{
|
||||
return $this->parseImageUrl($this->ico);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 关联分类
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/19 16:45
|
||||
* @return BelongsTo
|
||||
*/
|
||||
public function category(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Category::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 关联规则
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/9/30 14:30
|
||||
* @return BelongsTo
|
||||
*/
|
||||
public function rule(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(AccountRule::class, 'rule_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 获取账变值
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/20 11:05
|
||||
*/
|
||||
public function getRuleNumber()
|
||||
{
|
||||
$variable = $this->rule_number;
|
||||
if (! $variable) {
|
||||
$variable = $this->rule ? $this->rule->variable : 0;
|
||||
}
|
||||
|
||||
return $variable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: description
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/9/29 11:53
|
||||
* @param Builder $query
|
||||
* @param User $user
|
||||
* @return Builder
|
||||
*/
|
||||
public function scopeOfUser(Builder $query, User $user): Builder
|
||||
{
|
||||
$identity = $user->identities->first();
|
||||
return $query->where('identity', 'like', "%$identity->id%");
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: description
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/9/29 11:53
|
||||
* @param Builder $query
|
||||
* @param Identity $identity
|
||||
* @return Builder
|
||||
*/
|
||||
public function scopeOfIdentity(Builder $query, Identity $identity): Builder
|
||||
{
|
||||
return $query->where('identity', 'like', "%$identity->id%");
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 是否完成
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/9/30 13:25
|
||||
*/
|
||||
public function getFinish($user): bool
|
||||
{
|
||||
$rule = $this->rule;
|
||||
if ($rule) {
|
||||
if (method_exists($this, $rule->name)) {
|
||||
return $this->{$rule->name}($user);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 任务数据
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/20 10:43
|
||||
*/
|
||||
public function taskUsers(): HasMany
|
||||
{
|
||||
return $this->hasMany(TaskUser::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 任务记录
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/20 10:45
|
||||
*/
|
||||
public function taskLogs(): HasMany
|
||||
{
|
||||
return $this->hasMany(Log::class);
|
||||
}
|
||||
|
||||
public function getIdentities()
|
||||
{
|
||||
return Identity::query()->whereIn('id',$this->identity)->pluck('name');
|
||||
}
|
||||
|
||||
}
|
||||
20
modules/Task/Models/Traits/BelongsToTask.php
Normal file
20
modules/Task/Models/Traits/BelongsToTask.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Models\Traits;
|
||||
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Modules\Task\Models\Task;
|
||||
|
||||
trait BelongsToTask
|
||||
{
|
||||
/**
|
||||
* Notes: 关联任务
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/20 10:23
|
||||
*/
|
||||
public function task(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Task::class);
|
||||
}
|
||||
}
|
||||
52
modules/Task/Models/Traits/TaskAttribute.php
Normal file
52
modules/Task/Models/Traits/TaskAttribute.php
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Models\Traits;
|
||||
|
||||
|
||||
use Modules\Task\Facades\TaskFacade;
|
||||
|
||||
trait TaskAttribute
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes: 获取任务状态
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/21 9:52
|
||||
*/
|
||||
public function getUserTask($user): array
|
||||
{
|
||||
$data = [
|
||||
'all' => $this->task_number,
|
||||
];
|
||||
if ($user) {
|
||||
$timeRange = TaskFacade::getTimeInterval($this->cycle);
|
||||
|
||||
$taskUser = $this->taskUsers()
|
||||
->when($this->cycle != 'one', function ($q) use ($timeRange) {
|
||||
$q->whereBetween('task_at', $timeRange);
|
||||
})
|
||||
->byUser($user)
|
||||
->first();
|
||||
|
||||
if ($taskUser) {
|
||||
return array_merge($data, [
|
||||
'task_id' => $taskUser->id,
|
||||
'finish' => $taskUser->status,
|
||||
'total' => min($taskUser->total, $data['all']),
|
||||
]);
|
||||
} else {
|
||||
return array_merge($data, [
|
||||
'finish' => 0,
|
||||
'total' => 0,
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
return array_merge($data, [
|
||||
'finish' => 0,
|
||||
'total' => 0,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
41
modules/Task/Models/User.php
Normal file
41
modules/Task/Models/User.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Models;
|
||||
|
||||
use App\Models\Model;
|
||||
use App\Traits\HasStatus;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Modules\Task\Models\Traits\BelongsToTask;
|
||||
use Modules\User\Traits\BelongsToUser;
|
||||
|
||||
class User extends Model
|
||||
{
|
||||
use BelongsToUser, BelongsToTask, HasStatus;
|
||||
|
||||
protected $table = 'task_users';
|
||||
|
||||
const STATUS_INTI = 0;
|
||||
const STATUS_FINISH = 1;
|
||||
|
||||
public array $status_map = [
|
||||
self::STATUS_INTI => '进行中',
|
||||
self::STATUS_FINISH => '完成',
|
||||
];
|
||||
|
||||
/**
|
||||
* Notes: 增加任务数
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/20 11:10
|
||||
* @param int $step
|
||||
*/
|
||||
public function incrementTotal(int $step = 1)
|
||||
{
|
||||
if ($this->task->key == 'steps') {
|
||||
$this->total = $step;
|
||||
$this->save();
|
||||
} else {
|
||||
$this->increment('total', $step);
|
||||
}
|
||||
}
|
||||
}
|
||||
78
modules/Task/Providers/RouteServiceProvider.php
Normal file
78
modules/Task/Providers/RouteServiceProvider.php
Normal file
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Providers;
|
||||
|
||||
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
class RouteServiceProvider extends ServiceProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string $moduleName
|
||||
*/
|
||||
protected string $moduleName = 'Task';
|
||||
|
||||
/**
|
||||
* The module namespace to assume when generating URLs to actions.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected string $moduleNamespace = 'Modules\Task\Http\Controllers';
|
||||
|
||||
/**
|
||||
* Called before routes are registered.
|
||||
* Register any model bindings or pattern based filters.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function boot()
|
||||
{
|
||||
parent::boot();
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the routes for the application.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function map()
|
||||
{
|
||||
$this->mapApiRoutes();
|
||||
|
||||
$this->mapAdminRoutes();
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the "web" routes for the application.
|
||||
* These routes all receive session state, CSRF protection, etc.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function mapAdminRoutes()
|
||||
{
|
||||
Route::as(config('admin.route.as'))
|
||||
->domain(config('admin.route.domain'))
|
||||
->middleware(config('admin.route.middleware'))
|
||||
->namespace($this->moduleNamespace.'\\Admin')
|
||||
->prefix(config('admin.route.prefix'))
|
||||
->group(module_path($this->moduleName, 'Routes/admin.php'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the "api" routes for the application.
|
||||
* These routes are typically stateless.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function mapApiRoutes()
|
||||
{
|
||||
Route::as(config('api.route.as'))
|
||||
->domain(config('api.route.domain'))
|
||||
->middleware(config('api.route.middleware'))
|
||||
->namespace($this->moduleNamespace.'\\Api')
|
||||
->prefix(config('api.route.prefix').'/tasks')
|
||||
->group(module_path($this->moduleName, 'Routes/api.php'));
|
||||
}
|
||||
|
||||
}
|
||||
67
modules/Task/Providers/TaskServiceProvider.php
Normal file
67
modules/Task/Providers/TaskServiceProvider.php
Normal file
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Providers;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factory;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
class TaskServiceProvider extends ServiceProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string $moduleName
|
||||
*/
|
||||
protected string $moduleName = 'Task';
|
||||
|
||||
/**
|
||||
* @var string $moduleNameLower
|
||||
*/
|
||||
protected string $moduleNameLower = 'task';
|
||||
|
||||
/**
|
||||
* Boot the application events.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function boot()
|
||||
{
|
||||
$this->registerConfig();
|
||||
$this->loadMigrationsFrom(module_path($this->moduleName, 'Database/Migrations'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the service provider.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
$this->app->register(RouteServiceProvider::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register config.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function registerConfig()
|
||||
{
|
||||
$this->publishes([
|
||||
module_path($this->moduleName, 'Config/config.php') => config_path($this->moduleNameLower.'.php'),
|
||||
], 'config');
|
||||
$this->mergeConfigFrom(
|
||||
module_path($this->moduleName, 'Config/config.php'), $this->moduleNameLower
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the services provided by the provider.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function provides(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
}
|
||||
11
modules/Task/Routes/admin.php
Normal file
11
modules/Task/Routes/admin.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Routing\Router;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::group([
|
||||
], function (Router $router) {
|
||||
$router->resource('tasks/categories', 'CategoryController');
|
||||
$router->resource('tasks/users', 'UserController');
|
||||
$router->resource('tasks', 'TaskController');
|
||||
});
|
||||
21
modules/Task/Routes/api.php
Normal file
21
modules/Task/Routes/api.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Routing\Router;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::group([
|
||||
'middleware' => config('api.route.middleware_guess'),
|
||||
], function (Router $router) {
|
||||
$router->get('', 'TaskController@index');
|
||||
$router->get('{task}', 'TaskController@show')->where('task', '[0-9]+');;
|
||||
$router->get('categories', 'CategoryController@index');
|
||||
$router->get('wechat_step', 'TaskController@wechatStep');
|
||||
});
|
||||
|
||||
Route::group([
|
||||
'middleware' => config('api.route.middleware_auth'),
|
||||
], function (Router $router) {
|
||||
$router->get('wechat_step', 'UserController@wechatStep');
|
||||
});
|
||||
|
||||
|
||||
81
modules/Task/Task.php
Normal file
81
modules/Task/Task.php
Normal file
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task;
|
||||
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
|
||||
class Task
|
||||
{
|
||||
|
||||
protected static string $mainTitle = '任务管理';
|
||||
|
||||
/**
|
||||
* Notes: 模块初始化要做的一些操作
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/9/26 11:23
|
||||
*/
|
||||
public static function install()
|
||||
{
|
||||
Artisan::call('migrate', [
|
||||
'--path' => 'modules/Task/Database/Migrations',
|
||||
]);
|
||||
|
||||
self::createAdminMenu();
|
||||
}
|
||||
|
||||
protected static function createAdminMenu()
|
||||
{
|
||||
$menu = config('admin.database.menu_model');
|
||||
|
||||
$exists = $menu::where('title', self::$mainTitle)->exists();
|
||||
if (! $exists) {
|
||||
$main = $menu::create([
|
||||
'parent_id' => 0,
|
||||
'order' => 3,
|
||||
'title' => '任务管理',
|
||||
'icon' => 'fa-archive',
|
||||
]);
|
||||
$main->children()
|
||||
->create([
|
||||
'order' => 0,
|
||||
'title' => '任务列表',
|
||||
'icon' => 'fa-align-left',
|
||||
'uri' => 'tasks',
|
||||
]);
|
||||
|
||||
$main->children()
|
||||
->create([
|
||||
'order' => 1,
|
||||
'title' => '分类管理',
|
||||
'icon' => 'fa-align-left',
|
||||
'uri' => 'tasks/categories',
|
||||
]);
|
||||
$main->children()
|
||||
->create([
|
||||
'order' => 3,
|
||||
'title' => '任务记录',
|
||||
'icon' => 'fa-align-left',
|
||||
'uri' => 'tasks/users',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 卸载模块的一些操作
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/9/26 11:24
|
||||
*/
|
||||
public static function uninstall()
|
||||
{
|
||||
$menu = config('admin.database.menu_model');
|
||||
|
||||
$mains = $menu::where('title', self::$mainTitle)->get();
|
||||
|
||||
foreach ($mains as $main) {
|
||||
$main->delete();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
52
modules/Task/Traits/HasTasks.php
Normal file
52
modules/Task/Traits/HasTasks.php
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Task\Traits;
|
||||
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Modules\Task\Models\Task;
|
||||
use Modules\Task\Models\User;
|
||||
|
||||
trait HasTasks
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes: 做任务列表
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/21 9:53
|
||||
* @return HasMany
|
||||
*/
|
||||
public function tasks(): HasMany
|
||||
{
|
||||
return $this->hasMany(User::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 获取任务数据
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/21 9:54
|
||||
*/
|
||||
public function getTaskCount($task_id): array
|
||||
{
|
||||
$task = Task::find($task_id);
|
||||
|
||||
return $task->getUserTask($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 所有任务数据
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/10/21 9:59
|
||||
* @param $task_id
|
||||
* @return array
|
||||
*/
|
||||
public function getTasksCount(): array
|
||||
{
|
||||
return $this->tasks()->map(function ($taskUser) {
|
||||
return $taskUser->task->getUserTask($this);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
18
modules/Task/composer.json
Normal file
18
modules/Task/composer.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "xuanchen/task_module",
|
||||
"description": "",
|
||||
"type": "laravel-module",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Chen.Xuan",
|
||||
"email": "122383162@qq.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Modules\\Task\\": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
15
modules/Task/module.json
Normal file
15
modules/Task/module.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "Task",
|
||||
"alias": "task",
|
||||
"description": "任务模块",
|
||||
"keywords": [],
|
||||
"priority": 0,
|
||||
"providers": [
|
||||
"Modules\\Task\\Providers\\TaskServiceProvider"
|
||||
],
|
||||
"aliases": {},
|
||||
"files": [],
|
||||
"version": "1.0.0",
|
||||
"author": "玄尘",
|
||||
"requires": []
|
||||
}
|
||||
17
modules/Task/package.json
Normal file
17
modules/Task/package.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run development",
|
||||
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"watch-poll": "npm run watch -- --watch-poll",
|
||||
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"prod": "npm run production",
|
||||
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"cross-env": "^7.0",
|
||||
"laravel-mix": "^5.0.1",
|
||||
"laravel-mix-merge-manifest": "^0.1.2"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user