mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-12 19:35:50 +00:00
perf: 优化人脸签到功能
This commit is contained in:
parent
2284788366
commit
58b7853d63
@ -671,9 +671,13 @@ class UsersController extends AbstractController
|
|||||||
* - all: 全部
|
* - all: 全部
|
||||||
* - 其他值: 非机器人(默认)
|
* - 其他值: 非机器人(默认)
|
||||||
* - keys.department 部门ID(0表示默认部门,不赋值获取所有部门)
|
* - keys.department 部门ID(0表示默认部门,不赋值获取所有部门)
|
||||||
* - keys.checkin_mac 签到mac地址(get_checkin_mac=1时有效)
|
* - keys.checkin_face 人脸图片(get_checkin_data=1时有效)
|
||||||
|
* - yes: 仅有人脸图片
|
||||||
|
* - no: 无人脸图片
|
||||||
|
* - all: 全部
|
||||||
|
* - keys.checkin_mac 签到mac地址(get_checkin_data=1时有效)
|
||||||
*
|
*
|
||||||
* @apiParam {Number} [get_checkin_mac] 获取签到mac地址
|
* @apiParam {Number} [get_checkin_data] 获取签到mac地址
|
||||||
* - 0: 不获取(默认)
|
* - 0: 不获取(默认)
|
||||||
* - 1: 获取
|
* - 1: 获取
|
||||||
* @apiParam {Number} [page] 当前页,默认:1
|
* @apiParam {Number} [page] 当前页,默认:1
|
||||||
@ -690,7 +694,7 @@ class UsersController extends AbstractController
|
|||||||
$builder = User::select(['*', 'nickname as nickname_original']);
|
$builder = User::select(['*', 'nickname as nickname_original']);
|
||||||
//
|
//
|
||||||
$keys = Request::input('keys');
|
$keys = Request::input('keys');
|
||||||
$getCheckinMac = intval(Request::input('get_checkin_mac')) === 1;
|
$getCheckinData = intval(Request::input('get_checkin_data')) === 1;
|
||||||
if (is_array($keys)) {
|
if (is_array($keys)) {
|
||||||
if ($keys['key']) {
|
if ($keys['key']) {
|
||||||
if (str_contains($keys['key'], "@")) {
|
if (str_contains($keys['key'], "@")) {
|
||||||
@ -758,30 +762,29 @@ class UsersController extends AbstractController
|
|||||||
$builder->orderBy("is_principal","desc");
|
$builder->orderBy("is_principal","desc");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($getCheckinMac && isset($keys['checkin_mac'])) {
|
if ($getCheckinData) {
|
||||||
|
if (isset($keys['checkin_face'])) {
|
||||||
|
$builder->whereIn('userid', function ($query) use ($keys) {
|
||||||
|
$query->select('userid')->from('user_checkin_faces')->whereNotNull("faceimg");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (isset($keys['checkin_mac'])) {
|
||||||
$builder->whereIn('userid', function ($query) use ($keys) {
|
$builder->whereIn('userid', function ($query) use ($keys) {
|
||||||
$query->select('userid')->from('user_checkin_macs')->where("mac", "like", "%{$keys['checkin_mac']}%");
|
$query->select('userid')->from('user_checkin_macs')->where("mac", "like", "%{$keys['checkin_mac']}%");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$builder->whereNull('disable_at');
|
$builder->whereNull('disable_at');
|
||||||
$builder->where('bot', 0);
|
$builder->where('bot', 0);
|
||||||
}
|
}
|
||||||
$list = $builder->orderByDesc('userid')->paginate(Base::getPaginate(50, 20));
|
$list = $builder->orderByDesc('userid')->paginate(Base::getPaginate(50, 20));
|
||||||
//
|
//
|
||||||
if ($getCheckinMac) {
|
if ($getCheckinData) {
|
||||||
$list->transform(function (User $user) use ($getCheckinMac) {
|
$list->transform(function (User $user) {
|
||||||
if ($getCheckinMac) {
|
$checkinFace = UserCheckinFace::select(['faceimg'])->whereUserid($user->userid)->first();
|
||||||
$user->checkin_macs = UserCheckinMac::select(['id', 'mac', 'remark'])->whereUserid($user->userid)->orderBy('id')->get();
|
|
||||||
}
|
|
||||||
return $user;
|
|
||||||
});
|
|
||||||
// user_face
|
|
||||||
$list->transform(function (User $user) use ($getCheckinMac) {
|
|
||||||
if ($getCheckinMac) {
|
|
||||||
$checkinFace = UserCheckinFace::query()->whereUserid($user->userid)->first();
|
|
||||||
$user->checkin_face = $checkinFace ? Base::fillUrl($checkinFace->faceimg) : '';
|
$user->checkin_face = $checkinFace ? Base::fillUrl($checkinFace->faceimg) : '';
|
||||||
}
|
$user->checkin_macs = UserCheckinMac::select(['id', 'mac', 'remark'])->whereUserid($user->userid)->orderBy('id')->get();
|
||||||
return $user;
|
return $user;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -41,7 +41,7 @@ class UserCheckinFace extends AbstractModel
|
|||||||
$record = base64_encode(file_get_contents($faceFile));
|
$record = base64_encode(file_get_contents($faceFile));
|
||||||
}
|
}
|
||||||
|
|
||||||
$url = 'http://' . env('APP_IPPR') . '.55' . ":7788/user";
|
$url = 'http://' . env('APP_IPPR') . '.14' . ":7788/user";
|
||||||
$data = [
|
$data = [
|
||||||
'name' => $nickname,
|
'name' => $nickname,
|
||||||
'enrollid' => $userid,
|
'enrollid' => $userid,
|
||||||
@ -86,7 +86,7 @@ class UserCheckinFace extends AbstractModel
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static function deleteDeviceUser($userid) {
|
public static function deleteDeviceUser($userid) {
|
||||||
$url = 'http://' . env('APP_IPPR') . '.55' . ":7788/user/delete";
|
$url = 'http://' . env('APP_IPPR') . '.14' . ":7788/user/delete";
|
||||||
$data = [
|
$data = [
|
||||||
'enrollid' => $userid,
|
'enrollid' => $userid,
|
||||||
'backupnum' => 50, // 13 删除整个用户 50 删除图片
|
'backupnum' => 50, // 13 删除整个用户 50 删除图片
|
||||||
|
|||||||
@ -212,7 +212,7 @@ services:
|
|||||||
- mariadb
|
- mariadb
|
||||||
networks:
|
networks:
|
||||||
extnetwork:
|
extnetwork:
|
||||||
ipv4_address: "${APP_IPPR}.55"
|
ipv4_address: "${APP_IPPR}.14"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@ -1660,3 +1660,21 @@ Token
|
|||||||
(*)退出群组
|
(*)退出群组
|
||||||
(*)已加入群组
|
(*)已加入群组
|
||||||
请选择类型
|
请选择类型
|
||||||
|
|
||||||
|
|
||||||
|
人脸图片
|
||||||
|
允许成员自己上传人脸图片
|
||||||
|
人脸签到
|
||||||
|
人脸打卡
|
||||||
|
WiFi签到
|
||||||
|
设备情况
|
||||||
|
修改签到人脸图片
|
||||||
|
正在进行帐号【(*)】人脸图片修改。
|
||||||
|
修改人脸图片
|
||||||
|
会员签到设置
|
||||||
|
WiFi签到延迟时长为±1分钟。
|
||||||
|
通过人脸识别机签到
|
||||||
|
已上传
|
||||||
|
未上传
|
||||||
|
修改MAC地址
|
||||||
|
获取设备信息失败
|
||||||
|
|||||||
@ -24334,5 +24334,197 @@
|
|||||||
"fr": "Veuillez sélectionner un type",
|
"fr": "Veuillez sélectionner un type",
|
||||||
"id": "Silakan pilih jenis",
|
"id": "Silakan pilih jenis",
|
||||||
"ru": "Пожалуйста, выберите тип"
|
"ru": "Пожалуйста, выберите тип"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "人脸图片",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "人臉圖片",
|
||||||
|
"en": "Face Image",
|
||||||
|
"ko": "얼굴 이미지",
|
||||||
|
"ja": "顔写真",
|
||||||
|
"de": "Gesichtsbild",
|
||||||
|
"fr": "Image du visage",
|
||||||
|
"id": "Gambar Wajah",
|
||||||
|
"ru": "Изображение лица"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "允许成员自己上传人脸图片",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "允許成員自己上傳人臉圖片",
|
||||||
|
"en": "Allow members to upload their own face images",
|
||||||
|
"ko": "회원이 직접 얼굴 이미지를 업로드할 수 있도록 허용",
|
||||||
|
"ja": "メンバーが自身の顔写真をアップロードすることを許可",
|
||||||
|
"de": "Mitgliedern erlauben, ihre eigenen Gesichtsbilder hochzuladen",
|
||||||
|
"fr": "Autoriser les membres à télécharger leurs propres images faciales",
|
||||||
|
"id": "Izinkan anggota mengunggah gambar wajah mereka sendiri",
|
||||||
|
"ru": "Разрешить участникам загружать собственные изображения лица"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "人脸签到",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "人臉簽到",
|
||||||
|
"en": "Face Check-in",
|
||||||
|
"ko": "얼굴 인식 체크인",
|
||||||
|
"ja": "顔認証チェックイン",
|
||||||
|
"de": "Gesichtserkennung Check-in",
|
||||||
|
"fr": "Enregistrement par reconnaissance faciale",
|
||||||
|
"id": "Absensi Wajah",
|
||||||
|
"ru": "Регистрация по лицу"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "人脸打卡",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "人臉打卡",
|
||||||
|
"en": "Face Clock-in",
|
||||||
|
"ko": "얼굴 인식 출근",
|
||||||
|
"ja": "顔認証打刻",
|
||||||
|
"de": "Gesichtserkennung Stempeluhr",
|
||||||
|
"fr": "Pointage par reconnaissance faciale",
|
||||||
|
"id": "Absen dengan Wajah",
|
||||||
|
"ru": "Отметка времени по лицу"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "WiFi签到",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "WiFi簽到",
|
||||||
|
"en": "WiFi Check-in",
|
||||||
|
"ko": "WiFi 체크인",
|
||||||
|
"ja": "WiFiチェックイン",
|
||||||
|
"de": "WiFi Check-in",
|
||||||
|
"fr": "Enregistrement par WiFi",
|
||||||
|
"id": "Absensi WiFi",
|
||||||
|
"ru": "Регистрация по WiFi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "设备情况",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "設備情況",
|
||||||
|
"en": "Device Status",
|
||||||
|
"ko": "기기 상태",
|
||||||
|
"ja": "デバイス状況",
|
||||||
|
"de": "Gerätestatus",
|
||||||
|
"fr": "État de l'appareil",
|
||||||
|
"id": "Status Perangkat",
|
||||||
|
"ru": "Состояние устройства"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "修改签到人脸图片",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "修改簽到人臉圖片",
|
||||||
|
"en": "Modify Check-in Face Image",
|
||||||
|
"ko": "체크인 얼굴 이미지 수정",
|
||||||
|
"ja": "チェックイン用顔写真の変更",
|
||||||
|
"de": "Check-in Gesichtsbild ändern",
|
||||||
|
"fr": "Modifier l'image faciale d'enregistrement",
|
||||||
|
"id": "Ubah Gambar Wajah Absensi",
|
||||||
|
"ru": "Изменить изображение лица для регистрации"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "正在进行帐号【(*)】人脸图片修改。",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "正在進行帳號【(*)】人臉圖片修改。",
|
||||||
|
"en": "Modifying face image for account [(*)】.",
|
||||||
|
"ko": "계정 [(*)】의 얼굴 이미지를 수정 중입니다.",
|
||||||
|
"ja": "アカウント【(*)】の顔写真を変更中です。",
|
||||||
|
"de": "Gesichtsbild für Konto [(*)】 wird geändert.",
|
||||||
|
"fr": "Modification de l'image faciale pour le compte [(*)】 en cours.",
|
||||||
|
"id": "Sedang mengubah gambar wajah untuk akun [(*)】.",
|
||||||
|
"ru": "Выполняется изменение изображения лица для учетной записи [(*)】."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "修改人脸图片",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "修改人臉圖片",
|
||||||
|
"en": "Modify Face Image",
|
||||||
|
"ko": "얼굴 이미지 수정",
|
||||||
|
"ja": "顔写真の変更",
|
||||||
|
"de": "Gesichtsbild ändern",
|
||||||
|
"fr": "Modifier l'image faciale",
|
||||||
|
"id": "Ubah Gambar Wajah",
|
||||||
|
"ru": "Изменить изображение лица"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "会员签到设置",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "會員簽到設置",
|
||||||
|
"en": "Member Check-in Settings",
|
||||||
|
"ko": "회원 체크인 설정",
|
||||||
|
"ja": "メンバーチェックイン設定",
|
||||||
|
"de": "Mitglieder Check-in Einstellungen",
|
||||||
|
"fr": "Paramètres d'enregistrement des membres",
|
||||||
|
"id": "Pengaturan Absensi Anggota",
|
||||||
|
"ru": "Настройки регистрации участников"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "WiFi签到延迟时长为±1分钟。",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "WiFi簽到延遲時長為±1分鐘。",
|
||||||
|
"en": "WiFi check-in delay is ±1 minute.",
|
||||||
|
"ko": "WiFi 체크인 지연 시간은 ±1분입니다.",
|
||||||
|
"ja": "WiFiチェックインの遅延時間は±1分です。",
|
||||||
|
"de": "WiFi Check-in Verzögerung beträgt ±1 Minute.",
|
||||||
|
"fr": "Le délai d'enregistrement WiFi est de ±1 minute.",
|
||||||
|
"id": "Penundaan absensi WiFi adalah ±1 menit.",
|
||||||
|
"ru": "Задержка регистрации по WiFi составляет ±1 минуту."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "通过人脸识别机签到",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "通過人臉識別機簽到",
|
||||||
|
"en": "Check-in via Facial Recognition Device",
|
||||||
|
"ko": "얼굴 인식기를 통한 체크인",
|
||||||
|
"ja": "顔認証機でチェックイン",
|
||||||
|
"de": "Check-in über Gesichtserkennungsgerät",
|
||||||
|
"fr": "Enregistrement par dispositif de reconnaissance faciale",
|
||||||
|
"id": "Absensi melalui Mesin Pengenalan Wajah",
|
||||||
|
"ru": "Регистрация через устройство распознавания лиц"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "已上传",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "已上傳",
|
||||||
|
"en": "Uploaded",
|
||||||
|
"ko": "업로드 완료",
|
||||||
|
"ja": "アップロード済み",
|
||||||
|
"de": "Hochgeladen",
|
||||||
|
"fr": "Téléchargé",
|
||||||
|
"id": "Telah Diunggah",
|
||||||
|
"ru": "Загружено"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "未上传",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "未上傳",
|
||||||
|
"en": "Not Uploaded",
|
||||||
|
"ko": "미업로드",
|
||||||
|
"ja": "未アップロード",
|
||||||
|
"de": "Nicht hochgeladen",
|
||||||
|
"fr": "Non téléchargé",
|
||||||
|
"id": "Belum Diunggah",
|
||||||
|
"ru": "Не загружено"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "修改MAC地址",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "修改MAC地址",
|
||||||
|
"en": "Modify MAC Address",
|
||||||
|
"ko": "MAC 주소 수정",
|
||||||
|
"ja": "MACアドレスの変更",
|
||||||
|
"de": "MAC-Adresse ändern",
|
||||||
|
"fr": "Modifier l'adresse MAC",
|
||||||
|
"id": "Ubah Alamat MAC",
|
||||||
|
"ru": "Изменить MAC-адрес"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "获取设备信息失败",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "獲取設備信息失敗",
|
||||||
|
"en": "Failed to Retrieve Device Information",
|
||||||
|
"ko": "기기 정보 가져오기 실패",
|
||||||
|
"ja": "デバイス情報の取得に失敗しました",
|
||||||
|
"de": "Abrufen der Geräteinformationen fehlgeschlagen",
|
||||||
|
"fr": "Échec de la récupération des informations de l'appareil",
|
||||||
|
"id": "Gagal Mengambil Informasi Perangkat",
|
||||||
|
"ru": "Не удалось получить информацию об устройстве"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
2
public/language/web/de.js
vendored
2
public/language/web/de.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/en.js
vendored
2
public/language/web/en.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/fr.js
vendored
2
public/language/web/fr.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/id.js
vendored
2
public/language/web/id.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/ja.js
vendored
2
public/language/web/ja.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/key.js
vendored
2
public/language/web/key.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/ko.js
vendored
2
public/language/web/ko.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/ru.js
vendored
2
public/language/web/ru.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/zh-CHT.js
vendored
2
public/language/web/zh-CHT.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/zh.js
vendored
2
public/language/web/zh.js
vendored
File diff suppressed because one or more lines are too long
@ -97,7 +97,20 @@
|
|||||||
</Select>
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="checkinMac">
|
<template v-if="checkinMode">
|
||||||
|
<li>
|
||||||
|
<div class="search-label">
|
||||||
|
{{$L("人脸图片")}}
|
||||||
|
</div>
|
||||||
|
<div class="search-content">
|
||||||
|
<Select v-model="keys.checkin_face" :placeholder="$L('全部')">
|
||||||
|
<Option value="">{{$L('全部')}}</Option>
|
||||||
|
<Option value="yes">{{$L('已上传')}}</Option>
|
||||||
|
<Option value="no">{{$L('未上传')}}</Option>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
<div class="search-label">
|
<div class="search-label">
|
||||||
{{$L("MAC地址")}}
|
{{$L("MAC地址")}}
|
||||||
</div>
|
</div>
|
||||||
@ -105,6 +118,7 @@
|
|||||||
<Input v-model="keys.checkin_mac" :placeholder="$L('MAC地址')" clearable/>
|
<Input v-model="keys.checkin_mac" :placeholder="$L('MAC地址')" clearable/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
</template>
|
||||||
<li v-else>
|
<li v-else>
|
||||||
<div class="search-label">
|
<div class="search-label">
|
||||||
{{$L("邮箱认证")}}
|
{{$L("邮箱认证")}}
|
||||||
@ -251,10 +265,7 @@
|
|||||||
<Row class="team-department-checkin-item">
|
<Row class="team-department-checkin-item">
|
||||||
<Col span="12">
|
<Col span="12">
|
||||||
<ImgUpload v-model="checkinFaceEditData.faceimg" :num="1" :width="512" :height="512" :whcut="1"></ImgUpload>
|
<ImgUpload v-model="checkinFaceEditData.faceimg" :num="1" :width="512" :height="512" :whcut="1"></ImgUpload>
|
||||||
<span class="form-tip">{{$L('建议尺寸:200x200')}}</span>
|
<span class="form-tip">{{$L('建议尺寸:500x500')}}</span>
|
||||||
</Col>
|
|
||||||
<Col span="12">
|
|
||||||
<!-- <Input v-model="item.remark" :maxlength="100" :placeholder="$L('备注')"/> -->
|
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
|
||||||
@ -334,7 +345,7 @@ export default {
|
|||||||
name: "TeamManagement",
|
name: "TeamManagement",
|
||||||
components: {UserAvatarTip, UserSelect, ImgUpload},
|
components: {UserAvatarTip, UserSelect, ImgUpload},
|
||||||
props: {
|
props: {
|
||||||
checkinMac: {
|
checkinMode: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
@ -550,7 +561,7 @@ export default {
|
|||||||
arr.push(h('span', '/'))
|
arr.push(h('span', '/'))
|
||||||
}
|
}
|
||||||
arr.push(h('span', this.$L('最后在线')))
|
arr.push(h('span', this.$L('最后在线')))
|
||||||
return h('div', arr)
|
return h('AutoTip', arr)
|
||||||
},
|
},
|
||||||
render: (h, params) => {
|
render: (h, params) => {
|
||||||
const {line_at, disable_at} = params.row;
|
const {line_at, disable_at} = params.row;
|
||||||
@ -573,21 +584,43 @@ export default {
|
|||||||
render: (h, params) => {
|
render: (h, params) => {
|
||||||
const identity = params.row.identity;
|
const identity = params.row.identity;
|
||||||
const dropdownItems = [];
|
const dropdownItems = [];
|
||||||
|
if (this.checkinMode) {
|
||||||
|
dropdownItems.push(...[
|
||||||
|
h('EDropdownItem', {
|
||||||
|
props: {
|
||||||
|
command: 'checkin_face',
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
color: '#f90',
|
||||||
|
fontWeight: 'bold'
|
||||||
|
}
|
||||||
|
}, [h('div', this.$L('修改人脸图片'))]),
|
||||||
|
h('EDropdownItem', {
|
||||||
|
props: {
|
||||||
|
command: 'checkin_mac',
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
color: '#f90',
|
||||||
|
fontWeight: 'bold'
|
||||||
|
}
|
||||||
|
}, [h('div', this.$L('修改MAC地址'))])
|
||||||
|
])
|
||||||
|
}
|
||||||
if (identity.includes('admin')) {
|
if (identity.includes('admin')) {
|
||||||
dropdownItems.push(h('EDropdownItem', {
|
dropdownItems.push(h('EDropdownItem', {
|
||||||
props: {
|
props: {
|
||||||
command: 'clearadmin',
|
command: 'clearadmin',
|
||||||
|
divided: this.checkinMode
|
||||||
},
|
},
|
||||||
}, [h('div', this.$L('取消管理员'))]));
|
}, [h('div', this.$L('取消管理员'))]));
|
||||||
} else {
|
} else {
|
||||||
dropdownItems.push(h('EDropdownItem', {
|
dropdownItems.push(h('EDropdownItem', {
|
||||||
props: {
|
props: {
|
||||||
command: 'setadmin',
|
command: 'setadmin',
|
||||||
|
divided: this.checkinMode
|
||||||
},
|
},
|
||||||
}, [h('div', this.$L('设为管理员'))]));
|
}, [h('div', this.$L('设为管理员'))]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (identity.includes('temp')) {
|
if (identity.includes('temp')) {
|
||||||
dropdownItems.push(h('EDropdownItem', {
|
dropdownItems.push(h('EDropdownItem', {
|
||||||
props: {
|
props: {
|
||||||
@ -601,46 +634,30 @@ export default {
|
|||||||
},
|
},
|
||||||
}, [h('div', this.$L('设为临时帐号'))]));
|
}, [h('div', this.$L('设为临时帐号'))]));
|
||||||
}
|
}
|
||||||
|
dropdownItems.push(...[
|
||||||
dropdownItems.push(h('EDropdownItem', {
|
h('EDropdownItem', {
|
||||||
props: {
|
props: {
|
||||||
command: 'email',
|
command: 'email',
|
||||||
},
|
},
|
||||||
}, [h('div', this.$L('修改邮箱'))]))
|
}, [h('div', this.$L('修改邮箱'))]),
|
||||||
|
h('EDropdownItem', {
|
||||||
dropdownItems.push(h('EDropdownItem', {
|
|
||||||
props: {
|
props: {
|
||||||
command: 'password',
|
command: 'password',
|
||||||
},
|
},
|
||||||
}, [h('div', this.$L('修改密码'))]))
|
}, [h('div', this.$L('修改密码'))]),
|
||||||
|
h('EDropdownItem', {
|
||||||
if (this.checkinMac) {
|
|
||||||
dropdownItems.push(h('EDropdownItem', {
|
|
||||||
props: {
|
|
||||||
command: 'checkin_mac',
|
|
||||||
},
|
|
||||||
}, [h('div', this.$L('修改MAC'))]))
|
|
||||||
|
|
||||||
dropdownItems.push(h('EDropdownItem', {
|
|
||||||
props: {
|
|
||||||
command: 'checkin_face',
|
|
||||||
},
|
|
||||||
}, [h('div', this.$L('修改人脸图片'))]))
|
|
||||||
}
|
|
||||||
|
|
||||||
dropdownItems.push(h('EDropdownItem', {
|
|
||||||
props: {
|
props: {
|
||||||
command: 'department',
|
command: 'department',
|
||||||
},
|
},
|
||||||
}, [h('div', this.$L('修改部门'))]))
|
}, [h('div', this.$L('修改部门'))])
|
||||||
|
])
|
||||||
if (identity.includes('disable')) {
|
if (identity.includes('disable')) {
|
||||||
dropdownItems.push(h('EDropdownItem', {
|
dropdownItems.push(h('EDropdownItem', {
|
||||||
props: {
|
props: {
|
||||||
command: 'cleardisable',
|
command: 'cleardisable',
|
||||||
},
|
},
|
||||||
style: {
|
style: {
|
||||||
color: '#f90'
|
color: 'red'
|
||||||
}
|
}
|
||||||
}, [h('div', this.$L('恢复帐号(已离职)'))]));
|
}, [h('div', this.$L('恢复帐号(已离职)'))]));
|
||||||
} else {
|
} else {
|
||||||
@ -649,7 +666,7 @@ export default {
|
|||||||
command: 'setdisable',
|
command: 'setdisable',
|
||||||
},
|
},
|
||||||
style: {
|
style: {
|
||||||
color: '#f90'
|
color: 'red'
|
||||||
}
|
}
|
||||||
}, [h('div', this.$L('操作离职'))]));
|
}, [h('div', this.$L('操作离职'))]));
|
||||||
}
|
}
|
||||||
@ -790,23 +807,35 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
if (this.checkinMac) {
|
if (this.checkinMode) {
|
||||||
this.columns.splice(5, 0, {
|
this.columns.splice(5, 0, ...[
|
||||||
title: this.$L('设备情况'),
|
{
|
||||||
|
key: 'checkin_face',
|
||||||
|
minWidth: 80,
|
||||||
|
renderHeader: (h) => {
|
||||||
|
return h('AutoTip', {
|
||||||
|
style: {
|
||||||
|
color: '#f90'
|
||||||
|
}
|
||||||
|
}, this.$L('人脸图片'))
|
||||||
|
},
|
||||||
|
render: (h, {row}) => {
|
||||||
|
const checkin_face = $A.cloneJSON(row.checkin_face || '')
|
||||||
|
return h('div', checkin_face ? this.$L('已上传') : '-');
|
||||||
|
},
|
||||||
|
}, {
|
||||||
key: 'checkin_mac',
|
key: 'checkin_mac',
|
||||||
minWidth: 80,
|
minWidth: 80,
|
||||||
|
renderHeader: (h) => {
|
||||||
|
return h('AutoTip', {
|
||||||
|
style: {
|
||||||
|
color: '#f90'
|
||||||
|
}
|
||||||
|
}, this.$L('MAC地址'))
|
||||||
|
},
|
||||||
render: (h, {row}) => {
|
render: (h, {row}) => {
|
||||||
let checkin_macs = $A.cloneJSON(row.checkin_macs || [])
|
let checkin_macs = $A.cloneJSON(row.checkin_macs || [])
|
||||||
let checkin_face = $A.cloneJSON(row.checkin_face || '')
|
|
||||||
const tmp = []
|
|
||||||
const checkin_face_desc = checkin_face ? "已上传(人脸)" : "未上传(人脸)"
|
|
||||||
if (checkin_macs.length === 0) {
|
if (checkin_macs.length === 0) {
|
||||||
if (checkin_face){
|
|
||||||
tmp.push(h('AutoTip', checkin_face_desc))
|
|
||||||
return h('div', {
|
|
||||||
class: 'team-table-department-warp'
|
|
||||||
}, tmp);
|
|
||||||
}
|
|
||||||
return h('div', '-');
|
return h('div', '-');
|
||||||
} else {
|
} else {
|
||||||
const desc = (item) => {
|
const desc = (item) => {
|
||||||
@ -815,26 +844,22 @@ export default {
|
|||||||
}
|
}
|
||||||
return item.mac
|
return item.mac
|
||||||
}
|
}
|
||||||
const checkin_devices_desc = []
|
const tmp = []
|
||||||
tmp.push(h('AutoTip', desc(checkin_macs[0])))
|
tmp.push(h('AutoTip', desc(checkin_macs[0])))
|
||||||
if (checkin_macs.length > 1) {
|
if (checkin_macs.length > 1) {
|
||||||
checkin_macs = checkin_macs.splice(1)
|
checkin_macs = checkin_macs.splice(1)
|
||||||
checkin_devices_desc.push(...checkin_macs.map(item => {
|
|
||||||
return desc(item)
|
|
||||||
}))
|
|
||||||
if (checkin_face) {
|
|
||||||
checkin_devices_desc.push(checkin_face_desc)
|
|
||||||
}
|
|
||||||
tmp.push(h('ETooltip', [
|
tmp.push(h('ETooltip', [
|
||||||
h('div', {
|
h('div', {
|
||||||
slot: 'content',
|
slot: 'content',
|
||||||
domProps: {
|
domProps: {
|
||||||
innerHTML: checkin_devices_desc.join("<br/>")
|
innerHTML: checkin_macs.map(item => {
|
||||||
|
return desc(item)
|
||||||
|
}).join("<br/>")
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
h('div', {
|
h('div', {
|
||||||
class: 'department-tag-num'
|
class: 'department-tag-num'
|
||||||
}, ` +${checkin_devices_desc.length}`)
|
}, ` +${checkin_macs.length}`)
|
||||||
]))
|
]))
|
||||||
}
|
}
|
||||||
return h('div', {
|
return h('div', {
|
||||||
@ -842,7 +867,8 @@ export default {
|
|||||||
}, tmp);
|
}, tmp);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
})
|
}
|
||||||
|
])
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@ -908,7 +934,7 @@ export default {
|
|||||||
url: 'users/lists',
|
url: 'users/lists',
|
||||||
data: {
|
data: {
|
||||||
keys,
|
keys,
|
||||||
get_checkin_mac: this.checkinMac ? 1 : 0,
|
get_checkin_data: this.checkinMode ? 1 : 0,
|
||||||
page: Math.max(this.page, 1),
|
page: Math.max(this.page, 1),
|
||||||
pagesize: Math.max($A.runNum(this.pageSize), 10),
|
pagesize: Math.max($A.runNum(this.pageSize), 10),
|
||||||
},
|
},
|
||||||
|
|||||||
@ -18,12 +18,27 @@
|
|||||||
<div class="setting-checkin-button" @click="calendarShow=true">{{$L('查看更多签到数据')}}</div>
|
<div class="setting-checkin-button" @click="calendarShow=true">{{$L('查看更多签到数据')}}</div>
|
||||||
|
|
||||||
<Divider orientation="left">{{$L('签到设置')}}</Divider>
|
<Divider orientation="left">{{$L('签到设置')}}</Divider>
|
||||||
<Alert>
|
|
||||||
{{$L('设备连接上指定路由器(WiFi)后自动签到。')}}
|
|
||||||
</Alert>
|
|
||||||
<div class="setting-checkin-row">
|
<div class="setting-checkin-row">
|
||||||
<Tabs v-model="checkinTabs" style="margin: 0;">
|
<Tabs v-model="checkinTabs" style="margin: 0;">
|
||||||
<TabPane :label="$L('设备MAC地址')" name="mac">
|
<TabPane :label="$L('人脸签到')" name="receive">
|
||||||
|
<div class="setting-checkin-row">
|
||||||
|
<Row class="setting-template">
|
||||||
|
<Col span="12">{{$L('人脸图片')}}</Col>
|
||||||
|
<Col span="12"></Col>
|
||||||
|
</Row>
|
||||||
|
|
||||||
|
<Row class="setting-template">
|
||||||
|
<Col span="12">
|
||||||
|
<ImgUpload v-model="faceimgs" :num="1" :width="512" :height="512" :whcut="1"></ImgUpload>
|
||||||
|
<span class="form-tip">{{$L('建议尺寸:500x500')}}</span>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</div>
|
||||||
|
</TabPane>
|
||||||
|
<TabPane :label="$L('WiFi签到')" name="mac">
|
||||||
|
<Alert type="success">
|
||||||
|
{{$L('设备连接上指定路由器(WiFi)后自动签到。')}}
|
||||||
|
</Alert>
|
||||||
<Row class="setting-template">
|
<Row class="setting-template">
|
||||||
<Col span="12">{{$L('设备MAC地址')}}</Col>
|
<Col span="12">{{$L('设备MAC地址')}}</Col>
|
||||||
<Col span="12">{{$L('备注')}}</Col>
|
<Col span="12">{{$L('备注')}}</Col>
|
||||||
@ -43,21 +58,6 @@
|
|||||||
</Row>
|
</Row>
|
||||||
<Button type="default" icon="md-add" @click="addDatum">{{$L('添加设备')}}</Button>
|
<Button type="default" icon="md-add" @click="addDatum">{{$L('添加设备')}}</Button>
|
||||||
</TabPane>
|
</TabPane>
|
||||||
<TabPane :label="$L('人脸图片')" name="receive">
|
|
||||||
<div class="setting-checkin-row">
|
|
||||||
<Row class="setting-template">
|
|
||||||
<Col span="12">{{$L('人脸图片')}}</Col>
|
|
||||||
<Col span="12"></Col>
|
|
||||||
</Row>
|
|
||||||
|
|
||||||
<Row class="setting-template">
|
|
||||||
<Col span="12">
|
|
||||||
<ImgUpload v-model="faceimgs" :num="1" :width="512" :height="512" :whcut="1"></ImgUpload>
|
|
||||||
<span class="form-tip">{{$L('建议尺寸:200x200')}}</span>
|
|
||||||
</Col>
|
|
||||||
</Row>
|
|
||||||
</div>
|
|
||||||
</TabPane>
|
|
||||||
</Tabs>
|
</Tabs>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -98,7 +98,7 @@ export default {
|
|||||||
'mac': '',
|
'mac': '',
|
||||||
'remark': '',
|
'remark': '',
|
||||||
},
|
},
|
||||||
checkinTabs: "mac",
|
checkinTabs: "receive",
|
||||||
|
|
||||||
latelyLoad: 0,
|
latelyLoad: 0,
|
||||||
latelyData: [],
|
latelyData: [],
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
<Radio label="close">{{ $L('关闭') }}</Radio>
|
<Radio label="close">{{ $L('关闭') }}</Radio>
|
||||||
</RadioGroup>
|
</RadioGroup>
|
||||||
<div class="export-data">
|
<div class="export-data">
|
||||||
<p @click="allUserShow=true">{{$L('管理成员MAC地址')}}</p>
|
<p @click="allUserShow=true">{{$L('会员签到设置')}}</p>
|
||||||
<p @click="exportShow=true">{{$L('导出签到数据')}}</p>
|
<p @click="exportShow=true">{{$L('导出签到数据')}}</p>
|
||||||
</div>
|
</div>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
@ -51,27 +51,27 @@
|
|||||||
</Form>
|
</Form>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
<FormItem :label="$L('允许修改')" prop="edit">
|
<FormItem :label="$L('允许修改')" prop="edit">
|
||||||
<RadioGroup v-model="formData.edit">
|
|
||||||
<Radio label="open">{{ $L('允许') }}</Radio>
|
|
||||||
<Radio label="close">{{ $L('禁止') }}</Radio>
|
|
||||||
</RadioGroup>
|
|
||||||
<div class="form-tip">{{$L('允许成员自己修改MAC地址')}}</div>
|
|
||||||
<RadioGroup v-model="formData.faceupload">
|
<RadioGroup v-model="formData.faceupload">
|
||||||
<Radio label="open">{{ $L('允许') }}</Radio>
|
<Radio label="open">{{ $L('允许') }}</Radio>
|
||||||
<Radio label="close">{{ $L('禁止') }}</Radio>
|
<Radio label="close">{{ $L('禁止') }}</Radio>
|
||||||
</RadioGroup>
|
</RadioGroup>
|
||||||
<div class="form-tip">{{$L('允许成员自己上传人脸图片')}}</div>
|
<div class="form-tip">{{$L('允许成员自己上传人脸图片')}}</div>
|
||||||
|
<RadioGroup v-model="formData.edit">
|
||||||
|
<Radio label="open">{{ $L('允许') }}</Radio>
|
||||||
|
<Radio label="close">{{ $L('禁止') }}</Radio>
|
||||||
|
</RadioGroup>
|
||||||
|
<div class="form-tip">{{$L('允许成员自己修改MAC地址')}} ({{$L('WiFi签到')}})</div>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
<FormItem :label="$L('签到方式')" prop="modes">
|
<FormItem :label="$L('签到方式')" prop="modes">
|
||||||
<CheckboxGroup v-model="formData.modes">
|
<CheckboxGroup v-model="formData.modes">
|
||||||
<Checkbox label="auto">{{$L('自动签到')}}</Checkbox>
|
<Checkbox label="auto">{{$L('WiFi签到')}}</Checkbox>
|
||||||
<Checkbox label="manual">{{$L('手动签到')}}</Checkbox>
|
|
||||||
<Checkbox label="face">{{$L('人脸签到')}}</Checkbox>
|
<Checkbox label="face">{{$L('人脸签到')}}</Checkbox>
|
||||||
|
<Checkbox label="manual">{{$L('手动签到')}}</Checkbox>
|
||||||
<Checkbox v-if="false" label="location">{{$L('定位签到')}}</Checkbox>
|
<Checkbox v-if="false" label="location">{{$L('定位签到')}}</Checkbox>
|
||||||
</CheckboxGroup>
|
</CheckboxGroup>
|
||||||
<div v-if="formData.modes.includes('auto')" class="form-tip">{{$L('自动签到')}}: {{$L('详情看下文安装说明')}}</div>
|
<div v-if="formData.modes.includes('auto')" class="form-tip">{{$L('WiFi签到')}}: {{$L('详情看下文安装说明')}}</div>
|
||||||
|
<div v-if="formData.modes.includes('face')" class="form-tip">{{$L('人脸签到')}}: {{$L('通过人脸识别机签到')}}</div>
|
||||||
<div v-if="formData.modes.includes('manual')" class="form-tip">{{$L('手动签到')}}: {{$L('通过在签到打卡机器人发送指令签到')}}</div>
|
<div v-if="formData.modes.includes('manual')" class="form-tip">{{$L('手动签到')}}: {{$L('通过在签到打卡机器人发送指令签到')}}</div>
|
||||||
<div v-if="formData.modes.includes('face')" class="form-tip">{{$L('人脸签到')}}: {{$L('')}}</div>
|
|
||||||
<div v-if="formData.modes.includes('location')" class="form-tip">{{$L('定位签到')}}: {{$L('通过在签到打卡机器人发送位置签到')}}</div>
|
<div v-if="formData.modes.includes('location')" class="form-tip">{{$L('定位签到')}}: {{$L('通过在签到打卡机器人发送位置签到')}}</div>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
</template>
|
</template>
|
||||||
@ -81,10 +81,10 @@
|
|||||||
<template v-if="formData.open === 'open' && formData.modes.includes('auto')">
|
<template v-if="formData.open === 'open' && formData.modes.includes('auto')">
|
||||||
<div class="block-setting-space"></div>
|
<div class="block-setting-space"></div>
|
||||||
<div class="block-setting-box">
|
<div class="block-setting-box">
|
||||||
<h3>{{ $L('自动签到') }}</h3>
|
<h3>{{ $L('WiFi签到') }}</h3>
|
||||||
<div class="form-box">
|
<div class="form-box">
|
||||||
<FormItem :label="$L('安装说明')" prop="explain">
|
<FormItem :label="$L('安装说明')" prop="explain">
|
||||||
<p>1. {{ $L('自动签到延迟时长为±1分钟。') }}</p>
|
<p>1. {{ $L('WiFi签到延迟时长为±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>
|
||||||
@ -108,7 +108,7 @@
|
|||||||
v-model="allUserShow"
|
v-model="allUserShow"
|
||||||
placement="right"
|
placement="right"
|
||||||
:size="1380">
|
:size="1380">
|
||||||
<TeamManagement v-if="allUserShow" checkin-mac/>
|
<TeamManagement v-if="allUserShow" checkin-mode/>
|
||||||
</DrawerOverlay>
|
</DrawerOverlay>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user