使用框架:TP6
根据时间段下发任务到用户,就是后台管理设定本月份要上报资料,然后用户在这个月的时间段里面就要上报指定资料。
我完全没有思路,不知道有没有什么大神提供一下思路给我!!!
我试过了订阅推送,但实际操作不太懂,也没有什么概念!
使用框架:TP6
根据时间段下发任务到用户,就是后台管理设定本月份要上报资料,然后用户在这个月的时间段里面就要上报指定资料。
我完全没有思路,不知道有没有什么大神提供一下思路给我!!!
我试过了订阅推送,但实际操作不太懂,也没有什么概念!
下面是一个完整的项目目录结构,适用于基于 ThinkPHP6 框架的任务管理与提醒功能。
project/
├── app/ # 应用模块
│ ├── admin/ # 后台模块
│ │ ├── controller/ # 后台控制器
│ │ │ └── Task.php # 任务管理控制器
│ │ ├── model/ # 后台数据模型
│ │ │ └── Task.php # 任务模型
│ ├── user/ # 用户模块
│ │ ├── controller/ # 用户控制器
│ │ │ └── Task.php # 用户任务控制器
│ │ ├── model/ # 用户数据模型
│ │ │ └── UserTask.php # 用户任务模型
│ ├── command/ # 命令任务
│ │ └── TaskReminder.php # 定时任务提醒
├── config/ # 配置文件
│ ├── database.php # 数据库配置
├── database/
│ ├── migrations/ # 数据库迁移文件
│ │ ├── CreateTasksTable.php # 任务表迁移
│ │ ├── CreateUserTasksTable.php # 用户任务表迁移
├── public/ # 前端资源
│ ├── index.html # 用户端任务页面
│ ├── admin.html # 后台管理页面
├── route/ # 路由定义
│ ├── admin.php # 后台路由
│ ├── user.php # 用户路由
├── runtime/ # 临时文件(自动生成)
├── think # ThinkPHP核心文件
用于存储后台创建的任务信息。
CREATE TABLE `tasks` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255) NOT NULL COMMENT '任务名称',
`description` TEXT COMMENT '任务描述',
`start_time` DATETIME NOT NULL COMMENT '任务开始时间',
`end_time` DATETIME NOT NULL COMMENT '任务截止时间',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
);
用于存储分配给每个用户的任务信息。
CREATE TABLE `user_tasks` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`user_id` INT NOT NULL COMMENT '关联用户ID',
`task_id` INT NOT NULL COMMENT '关联任务ID',
`status` ENUM('pending', 'completed') DEFAULT 'pending' COMMENT '任务状态',
`completed_at` DATETIME COMMENT '任务完成时间',
`last_notified_at` DATETIME COMMENT '最后提醒时间',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (`task_id`) REFERENCES `tasks`(`id`)
);
控制器代码(app/admin/controller/Task.php):
namespace app\admin\controller;
use app\admin\model\Task;
use think\Request;
class Task
{
public function create(Request $request)
{
$data = $request->post();
$task = new Task();
$task->save($data);
return json(['status' => 'success', 'message' => '任务创建成功']);
}
public function index()
{
$tasks = Task::all();
return json(['tasks' => $tasks]);
}
public function update(Request $request, $id)
{
$task = Task::find($id);
$task->save($request->post());
return json(['status' => 'success', 'message' => '任务修改成功']);
}
public function delete($id)
{
Task::destroy($id);
return json(['status' => 'success', 'message' => '任务删除成功']);
}
}
模型代码(app/admin/model/Task.php):
namespace app\admin\model;
use think\Model;
class Task extends Model
{
protected $table = 'tasks';
protected $autoWriteTimestamp = true;
}
控制器代码(app/user/controller/Task.php):
namespace app\user\controller;
use app\user\model\UserTask;
use think\Request;
class Task
{
public function index(Request $request)
{
$userId = $request->user()->id;
$tasks = UserTask::where('user_id', $userId)->with('task')->select();
return json(['tasks' => $tasks]);
}
public function submit(Request $request, $taskId)
{
$userId = $request->user()->id;
$userTask = UserTask::where('task_id', $taskId)->where('user_id', $userId)->find();
if ($userTask && $userTask->status !== 'completed') {
$userTask->status = 'completed';
$userTask->completed_at = date('Y-m-d H:i:s');
$userTask->save();
return json(['status' => 'success', 'message' => '任务完成']);
}
return json(['status' => 'error', 'message' => '任务已完成或不存在']);
}
}
模型代码(app/user/model/UserTask.php):
namespace app\user\model;
use think\Model;
class UserTask extends Model
{
protected $table = 'user_tasks';
protected $autoWriteTimestamp = true;
public function task()
{
return $this->belongsTo('app\admin\model\Task', 'task_id');
}
public function user()
{
return $this->belongsTo('app\user\model\User', 'user_id');
}
}
命令代码(app/command/TaskReminder.php):
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use app\user\model\UserTask;
class TaskReminder extends Command
{
protected function configure()
{
$this->setName('task:reminder')->setDescription('定时检查任务并提醒用户');
}
protected function execute(Input $input, Output $output)
{
$currentDateTime = date('Y-m-d H:i:s');
$reminderWindow = date('Y-m-d H:i:s', strtotime('+1 day'));
$tasks = UserTask::where('status', 'pending')
->whereNull('completed_at')
->where('last_notified_at', '<', $currentDateTime)
->with(['task'])
->whereHas('task', function ($query) use ($currentDateTime, $reminderWindow) {
$query->where('end_time', '>', $currentDateTime)
->where('end_time', '<=', $reminderWindow);
})
->select();
foreach ($tasks as $userTask) {
$this->sendReminder($userTask);
$userTask->last_notified_at = $currentDateTime;
$userTask->save();
}
$output->writeln("提醒完成,共提醒了 " . count($tasks) . " 项任务。");
}
private function sendReminder($userTask)
{
$email = $userTask->user->email ?? '无邮箱';
$subject = "任务提醒:{$userTask->task->name}";
$message = "您的任务‘{$userTask->task->name}’即将到期,请在 {$userTask->task->end_time} 前完成!";
$this->sendEmail($email, $subject, $message);
}
private function sendEmail($to, $subject, $message)
{
$headers = "From: admin@yourapp.com\r\n";
mail($to, $subject, $message, $headers);
}
}
注册命令(app/command.php):
return [
'app\command\TaskReminder',
];
2 回答1.2k 阅读✓ 已解决
1 回答937 阅读✓ 已解决
2 回答801 阅读
1 回答799 阅读
1 回答745 阅读
1 回答743 阅读
数据库设计
sql
CREATE TABLE
task
(id
int(11) NOT NULL AUTO_INCREMENT,title
varchar(255) NOT NULL COMMENT '任务标题',description
text COMMENT '任务描述',start_time
datetime NOT NULL COMMENT '任务开始时间',end_time
datetime NOT NULL COMMENT '任务结束时间',status
tinyint(1) DEFAULT '1' COMMENT '状态:1-启用,0-禁用',created_at
datetime DEFAULT NULL COMMENT '创建时间',updated_at
datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (
id
)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务表';
sql
CREATE TABLE
user_task
(id
int(11) NOT NULL AUTO_INCREMENT,user_id
int(11) NOT NULL COMMENT '用户ID',task_id
int(11) NOT NULL COMMENT '任务ID',status
tinyint(1) DEFAULT '0' COMMENT '状态:0-未完成,1-已完成',report_content
text COMMENT '上报内容',report_time
datetime DEFAULT NULL COMMENT '上报时间',created_at
datetime DEFAULT NULL COMMENT '创建时间',updated_at
datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (
id
),KEY
user_id
(user_id
),KEY
task_id
(task_id
)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户任务关联表';
<?php
namespace app\admin\controller;
use think\facade\View;
use think\Request;
use app\common\model\Task as TaskModel;
class TaskController
{
}
<?php
namespace app\admin\validate;
use think\Validate;
class Task extends Validate
{
}
<?php
namespace app\controller;
use think\facade\View;
use think\Request;
use app\common\model\Task as TaskModel;
use app\common\model\UserTask as UserTaskModel;
class UserTaskController
{
}
Task.php (任务模型)
<?php
namespace app\common\model;
use think\Model;
class Task extends Model
{
}
UserTask.php (用户任务模型)
<?php
namespace app\common\model;
use think\Model;
class UserTask extends Model
{
}
前端页面示例
任务列表页面 (admin/task/index.html)
<!-- 省略HTML结构 -->
{$tasks|raw}
<script>
function deleteTask(id) {
}
</script>
用户任务上报页面 (user/task/index.html)
<!-- 省略HTML结构 -->
<div class="task-list">
{volist name="tasks" id="task"}
<div class="task-item">
</div>
{/volist}
</div>
<script>
$(function() {
});
</script>
定时任务检查
可以添加一个定时任务,每天检查是否有新任务需要下发:
// 在 app/command/TaskCheck.php 中创建命令
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use app\common\model\Task;
use app\common\model\User;
class TaskCheck extends Command
{
}
然后在 crontab 中添加:
0 0 * php think task:check