perf: 签到成功通知

This commit is contained in:
kuaifan 2023-01-28 22:44:52 +08:00
parent 3b346046ae
commit 10936bcdb5
5 changed files with 67 additions and 11 deletions

View File

@ -2,8 +2,11 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Models\User;
use App\Models\UserCheckinMac; use App\Models\UserCheckinMac;
use App\Models\UserCheckinRecord; use App\Models\UserCheckinRecord;
use App\Models\WebSocketDialog;
use App\Models\WebSocketDialogMsg;
use App\Module\Base; use App\Module\Base;
use Request; use Request;
@ -87,10 +90,19 @@ class PublicController extends AbstractController
if ($key != $setting['key']) { if ($key != $setting['key']) {
return 'key error'; return 'key error';
} }
$setting['time'] = $setting['time'] ? Base::json2array($setting['time']) : ['00:00', '23:59'];
// //
$nowDate = date("Y-m-d"); $nowDate = date("Y-m-d");
$nowTime = date("H:i:s"); $nowTime = date("H:i:s");
//
$timeStart = strtotime(date("{$nowDate} {$setting['time'][0]}"));
$timeEnd = strtotime(date("{$nowDate} {$setting['time'][1]}"));
if (Base::time() < $timeStart || Base::time() > $timeEnd) {
return "not in valid time, valid time is {$setting['time'][0]}-{$setting['time'][1]}";
}
//
$macs = explode(",", $mac); $macs = explode(",", $mac);
$creates = [];
foreach ($macs as $mac) { foreach ($macs as $mac) {
$mac = strtoupper($mac); $mac = strtoupper($mac);
if (Base::isMac($mac) && $UserCheckinMac = UserCheckinMac::whereMac($mac)->first()) { if (Base::isMac($mac) && $UserCheckinMac = UserCheckinMac::whereMac($mac)->first()) {
@ -102,11 +114,25 @@ class PublicController extends AbstractController
$record = UserCheckinRecord::where($array)->first(); $record = UserCheckinRecord::where($array)->first();
if (empty($record)) { if (empty($record)) {
$record = UserCheckinRecord::createInstance($array); $record = UserCheckinRecord::createInstance($array);
$record->save(); $creates[] = $UserCheckinMac->userid;
} }
$record->times = Base::array2json(array_merge($record->times, [$nowTime])); $record->times = Base::array2json(array_merge($record->times, [$nowTime]));
$record->report_time = $time; $record->report_time = $time;
$record->save(); $record->save();
}
}
//
if ($creates) {
$botUser = User::botGetOrCreate('check-in');
if ($botUser) {
foreach ($creates as $create) {
$dialog = WebSocketDialog::checkUserDialog($botUser->userid, $create);
if ($dialog) {
$text = "签到成功,签到时间:" . date("H:i");
WebSocketDialogMsg::sendMsg(null, $dialog->id, 'text', ['text' => $text], $botUser->userid); // todo 未能在任务end事件来发送任务
}
}
} }
} }
return 'success'; return 'success';

View File

@ -224,7 +224,7 @@ class SystemController extends AbstractController
* *
* @apiParam {String} type * @apiParam {String} type
* - get: 获取(默认) * - get: 获取(默认)
* - save: 保存设置(参数:['open', 'edit', 'key'] * - save: 保存设置(参数:['open', 'time', 'notice', 'edit', 'key']
* @apiSuccess {Number} ret 返回状态码1正确、0错误 * @apiSuccess {Number} ret 返回状态码1正确、0错误
* @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {String} msg 返回信息(错误描述)
* @apiSuccess {Object} data 返回数据 * @apiSuccess {Object} data 返回数据
@ -242,6 +242,8 @@ class SystemController extends AbstractController
foreach ($all as $key => $value) { foreach ($all as $key => $value) {
if (!in_array($key, [ if (!in_array($key, [
'open', 'open',
'time',
'notice',
'edit', 'edit',
'key', 'key',
])) { ])) {
@ -262,6 +264,8 @@ class SystemController extends AbstractController
} }
// //
$setting['open'] = $setting['open'] ?: 'close'; $setting['open'] = $setting['open'] ?: 'close';
$setting['time'] = $setting['time'] ? Base::json2array($setting['time']) : ['00:00', '23:59'];
$setting['notice'] = $setting['notice'] ?: 'close';
$setting['edit'] = $setting['edit'] ?: 'close'; $setting['edit'] = $setting['edit'] ?: 'close';
$setting['cmd'] = "curl -sSL '" . Base::fillUrl("api/public/checkin/install?key={$setting['key']}") . "' | sh"; $setting['cmd'] = "curl -sSL '" . Base::fillUrl("api/public/checkin/install?key={$setting['key']}") . "' | sh";
// //

View File

@ -553,6 +553,8 @@ class User extends AbstractModel
return url("images/avatar/default_system.png"); return url("images/avatar/default_system.png");
} elseif ($email == 'task-alert@bot.system') { } elseif ($email == 'task-alert@bot.system') {
return url("images/avatar/default_task.png"); return url("images/avatar/default_task.png");
} elseif ($email == 'check-in@bot.system') {
return url("images/avatar/default_checkin.png");
} elseif ($email == 'bot-manager@bot.system') { } elseif ($email == 'bot-manager@bot.system') {
return url("images/avatar/default_bot.png"); return url("images/avatar/default_bot.png");
} }
@ -628,6 +630,8 @@ class User extends AbstractModel
$update['nickname'] = '系统消息'; $update['nickname'] = '系统消息';
} elseif ($key === 'task-alert') { } elseif ($key === 'task-alert') {
$update['nickname'] = '任务提醒'; $update['nickname'] = '任务提醒';
} elseif ($key === 'check-in') {
$update['nickname'] = '签到打卡';
} elseif ($key === 'bot-manager') { } elseif ($key === 'bot-manager') {
$update['nickname'] = '机器人管理'; $update['nickname'] = '机器人管理';
} }

View File

@ -2,7 +2,7 @@
<div class="setting-component-item"> <div class="setting-component-item">
<Form ref="formData" :model="formData" :rules="ruleData" label-width="auto" @submit.native.prevent> <Form ref="formData" :model="formData" :rules="ruleData" label-width="auto" @submit.native.prevent>
<div class="block-setting-box"> <div class="block-setting-box">
<h3>{{ $L('自动签到') }}</h3> <h3>{{ $L('签到设置') }}</h3>
<FormItem :label="$L('功能开启')" prop="open"> <FormItem :label="$L('功能开启')" prop="open">
<RadioGroup v-model="formData.open"> <RadioGroup v-model="formData.open">
<Radio label="open">{{ $L('开启') }}</Radio> <Radio label="open">{{ $L('开启') }}</Radio>
@ -14,6 +14,21 @@
</div> </div>
</FormItem> </FormItem>
<template v-if="formData.open === 'open'"> <template v-if="formData.open === 'open'">
<FormItem :label="$L('签到时间')" prop="time">
<TimePicker
v-model="formData.time"
type="timerange"
format="HH:mm"
:placeholder="$L('请选择签到时间')"/>
<div class="form-tip">{{$L('每日首次签到成功消息通知')}}</div>
</FormItem>
<FormItem :label="$L('签到通知')" prop="notice">
<RadioGroup v-model="formData.notice">
<Radio label="open">{{ $L('开启') }}</Radio>
<Radio label="close">{{ $L('关闭') }}</Radio>
</RadioGroup>
<div class="form-tip">{{$L('每日首次签到成功消息通知')}}</div>
</FormItem>
<FormItem :label="$L('允许修改')" prop="edit"> <FormItem :label="$L('允许修改')" prop="edit">
<RadioGroup v-model="formData.edit"> <RadioGroup v-model="formData.edit">
<Radio label="open">{{ $L('允许') }}</Radio> <Radio label="open">{{ $L('允许') }}</Radio>
@ -21,16 +36,23 @@
</RadioGroup> </RadioGroup>
<div class="form-tip">{{$L('允许成员自己修改MAC地址')}}</div> <div class="form-tip">{{$L('允许成员自己修改MAC地址')}}</div>
</FormItem> </FormItem>
</template>
</div>
<template v-if="formData.open === 'open'">
<div class="block-setting-placeholder"></div>
<div class="block-setting-box">
<h3>{{ $L('自动签到') }}</h3>
<FormItem :label="$L('安装说明')" prop="explain"> <FormItem :label="$L('安装说明')" prop="explain">
<p>1. {{$L('签到延迟时长为±1分钟。')}}</p> <p>1. {{ $L('自动签到延迟时长为±1分钟。') }}</p>
<p>2. {{ $L('设备连接上指定路由器WiFi后自动签到。') }}</p> <p>2. {{ $L('设备连接上指定路由器WiFi后自动签到。') }}</p>
<p>3. {{ $L('仅支持Openwrt系统的路由器。') }}</p> <p>3. {{ $L('仅支持Openwrt系统的路由器。') }}</p>
<p>4. {{ $L('关闭签到功能再开启需要重新安装。') }}</p> <p>4. {{ $L('关闭签到功能再开启需要重新安装。') }}</p>
<p>5. {{ $L('进入路由器终端执行以下命令即可完成安装:') }}</p> <p>5. {{ $L('进入路由器终端执行以下命令即可完成安装:') }}</p>
<Input ref="cmd" @on-focus="clickCmd" style="margin-top:6px" type="textarea" readonly :value="formData.cmd"/> <Input ref="cmd" @on-focus="clickCmd" style="margin-top:6px" type="textarea" readonly :value="formData.cmd"/>
</FormItem> </FormItem>
</template>
</div> </div>
</template>
</Form> </Form>
<div class="setting-footer"> <div class="setting-footer">
<Button :loading="loadIng > 0" type="primary" @click="submitForm">{{ $L('提交') }}</Button> <Button :loading="loadIng > 0" type="primary" @click="submitForm">{{ $L('提交') }}</Button>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB