diff --git a/app/Http/Controllers/Api/PublicController.php b/app/Http/Controllers/Api/PublicController.php index ea0e6c9ed..f3cacea42 100755 --- a/app/Http/Controllers/Api/PublicController.php +++ b/app/Http/Controllers/Api/PublicController.php @@ -29,7 +29,7 @@ class PublicController extends AbstractController $key = trim(Request::input('key')); // $setting = Base::setting('checkinSetting'); - if ($setting['wifi'] !== 'open') { + if ($setting['open'] !== 'open') { return <<first(); - if ($userCheckin) { + if (Base::isMac($item) && $userCheckin = UserCheckin::whereMac($item)->first()) { UserCheckinRecord::createInstance([ 'userid' => $userCheckin->userid, 'mac' => $userCheckin->mac, diff --git a/app/Http/Controllers/Api/SystemController.php b/app/Http/Controllers/Api/SystemController.php index 0b84b90a3..b7b064be5 100755 --- a/app/Http/Controllers/Api/SystemController.php +++ b/app/Http/Controllers/Api/SystemController.php @@ -223,7 +223,7 @@ class SystemController extends AbstractController * * @apiParam {String} type * - get: 获取(默认) - * - save: 保存设置(参数:['wifi', 'key']) + * - save: 保存设置(参数:['open', 'edit', 'key']) * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {Object} data 返回数据 @@ -240,13 +240,14 @@ class SystemController extends AbstractController $all = Request::input(); foreach ($all as $key => $value) { if (!in_array($key, [ - 'wifi', + 'open', + 'edit', 'key', ])) { unset($all[$key]); } } - if ($all['wifi'] === 'close') { + if ($all['open'] === 'close') { $all['key'] = md5(Base::generatePassword(32)); } $setting = Base::setting('checkinSetting', Base::newTrim($all)); @@ -259,7 +260,8 @@ class SystemController extends AbstractController Base::setting('checkinSetting', $setting); } // - $setting['wifi'] = $setting['wifi'] ?: 'close'; + $setting['open'] = $setting['open'] ?: 'close'; + $setting['edit'] = $setting['edit'] ?: 'close'; $setting['cmd'] = "curl -sSL '" . Base::fillUrl("api/public/checkin/install?key={$setting['key']}") . "' | sh"; // return Base::retSuccess('success', $setting ?: json_decode('{}')); diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index e3b5b8c3c..3a4e80d52 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -506,9 +506,13 @@ class UsersController extends AbstractController * - no: 未认证 * - 其他值: 全部(默认) * - keys.department 部门ID(0表示默认部门,不赋值获取所有部门) + * - keys.checkin_mac 签到mac地址 * - * @apiParam {Number} [page] 当前页,默认:1 - * @apiParam {Number} [pagesize] 每页显示数量,默认:20,最大:50 + * @apiParam {Number} [checkin_mac] 获取签到mac地址 + * - 0: 不获取(默认) + * - 1: 获取 + * @apiParam {Number} [page] 当前页,默认:1 + * @apiParam {Number} [pagesize] 每页显示数量,默认:20,最大:50 * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) @@ -573,11 +577,23 @@ class UsersController extends AbstractController $builder->where("department", "like", "%,{$keys['department']},%"); } } + if (isset($keys['checkin_mac'])) { + $builder->whereIn('userid', function ($query) use ($keys) { + $query->select('userid')->from('user_checkins')->where("mac", "like", "%{$keys['checkin_mac']}%"); + }); + } } else { $builder->whereNull('disable_at'); } $list = $builder->orderByDesc('userid')->paginate(Base::getPaginate(50, 20)); // + if (intval(Request::input('checkin_mac')) === 1) { + $list->transform(function (User $user) { + $user->checkin_macs = UserCheckin::whereUserid($user->userid)->orderBy('id')->pluck('mac'); + return $user; + }); + } + // return Base::retSuccess('success', $list); } @@ -593,6 +609,7 @@ class UsersController extends AbstractController * @apiParam {String} [type] 操作 * - setadmin 设为管理员 * - clearadmin 取消管理员 + * - checkin_macs 修改自动签到mac地址(需要参数 checkin_macs) * - department 修改部门(需要参数 department) * - setdisable 设为离职(需要参数 disable_time、transfer_userid) * - cleardisable 取消离职 @@ -602,6 +619,7 @@ class UsersController extends AbstractController * @apiParam {String} [password] 新的密码 * @apiParam {String} [nickname] 昵称 * @apiParam {String} [profession] 职位 + * @apiParam {String} [checkin_macs] 自动签到mac地址 * @apiParam {String} [department] 部门 * @apiParam {String} [disable_time] 离职时间 * @apiParam {String} [transfer_userid] 离职交接人 @@ -637,6 +655,19 @@ class UsersController extends AbstractController $upArray['identity'] = array_diff($userInfo->identity, ['admin']); break; + case 'checkin_macs': + $list = explode(",", $data['checkin_macs']); + $array = []; + foreach ($list as $item) { + $item = strtoupper($item); + if (Base::isMac($item)) { + $array[$item] = [ + 'mac' => $item, + ]; + } + } + return UserCheckin::saveMac($userInfo->userid, $array); + case 'department': if (!is_array($data['department'])) { $data['department'] = []; @@ -1328,9 +1359,13 @@ class UsersController extends AbstractController { $user = User::auth(); // - if (Base::settingFind('checkinSetting', 'wifi') !== 'open') { + $setting = Base::setting('checkinSetting'); + if ($setting['open'] !== 'open') { return Base::retError('此功能未开启,请联系管理员开启'); } + if ($setting['edit'] !== 'open') { + return Base::retError('未开放修改权限,请联系管理员'); + } // $list = Base::getPostValue('list'); $array = []; @@ -1339,36 +1374,18 @@ class UsersController extends AbstractController } foreach ($list AS $item) { $item = Base::newTrim($item); - if (empty($item['mac']) || !preg_match("/^[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}$/", $item['mac'])) { - continue; + if (Base::isMac($item['mac'])) { + $mac = strtoupper($item['mac']); + $array[$mac] = [ + 'mac' => $mac, + 'remark' => substr($item['remark'], 0, 50), + ]; } - $array[] = [ - 'mac' => strtoupper($item['mac']), - 'remark' => substr($item['remark'], 0, 50), - ]; } if (count($array) > 3) { return Base::retError('最多只能添加3个MAC地址'); } // - return AbstractModel::transaction(function() use ($array, $user) { - $ids = []; - $list = []; - foreach ($array as $item) { - $row = UserCheckin::updateInsert([ - 'userid' => $user->userid, - 'mac' => $item['mac'], - ], [ - 'remark' => $item['remark'], - ]); - if ($row) { - $ids[] = $row->id; - $list[] = $row; - } - } - UserCheckin::whereUserid($user->userid)->whereNotIn('id', $ids)->delete(); - // - return Base::retSuccess('success', $list); - }); + return UserCheckin::saveMac($user->userid, $array); } } diff --git a/app/Models/UserCheckin.php b/app/Models/UserCheckin.php index 7729ecbf0..a9aa05d9f 100644 --- a/app/Models/UserCheckin.php +++ b/app/Models/UserCheckin.php @@ -27,5 +27,36 @@ use App\Module\Base; */ class UserCheckin extends AbstractModel { - + /** + * 保存mac地址 + * @param $userid + * @param $array + * @return mixed + */ + public static function saveMac($userid, $array) + { + return AbstractModel::transaction(function() use ($array, $userid) { + $ids = []; + $list = []; + foreach ($array as $item) { + $update = []; + if ($item['remark']) { + $update = [ + 'remark' => $item['remark'] + ]; + } + $row = UserCheckin::updateInsert([ + 'userid' => $userid, + 'mac' => $item['mac'] + ], $update); + if ($row) { + $ids[] = $row->id; + $list[] = $row; + } + } + UserCheckin::whereUserid($userid)->whereNotIn('id', $ids)->delete(); + // + return Base::retSuccess('修改成功', $list); + }); + } } diff --git a/app/Module/Base.php b/app/Module/Base.php index 36dd0d11e..ab83bccd2 100755 --- a/app/Module/Base.php +++ b/app/Module/Base.php @@ -1032,6 +1032,20 @@ class Base } } + /** + * 正则判断是否MAC地址 + * @param $str + * @return bool + */ + public static function isMac($str) + { + if (preg_match("/^[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}$/", $str)) { + return true; + } else { + return false; + } + } + /** * 判断身份证是否正确 * @param $id diff --git a/resources/assets/js/pages/manage/components/TeamManagement.vue b/resources/assets/js/pages/manage/components/TeamManagement.vue index dd4be414d..d94240b49 100644 --- a/resources/assets/js/pages/manage/components/TeamManagement.vue +++ b/resources/assets/js/pages/manage/components/TeamManagement.vue @@ -91,7 +91,15 @@ -
  • +
  • +
    + {{$L("MAC地址")}} +
    +
    + +
    +
  • +
  • {{$L("邮箱认证")}}
    @@ -192,6 +200,22 @@ + + +
    + {{$L(`正在进行帐号【ID:${checkinMacEditData.userid},${checkinMacEditData.nickname}】MAC地址修改。`)}} + + + +
    +
    + + +
    +
    + 1) { departments = departments.splice(1) tmp.push(h('ETooltip', [ @@ -462,6 +496,14 @@ export default { }, }, [h('div', this.$L('修改密码'))])) + if (this.mode === 'checkin_mac') { + dropdownItems.push(h('EDropdownItem', { + props: { + command: 'checkin_mac', + }, + }, [h('div', this.$L('修改MAC'))])) + } + dropdownItems.push(h('EDropdownItem', { props: { command: 'department', @@ -536,6 +578,10 @@ export default { total: 0, noText: '', + checkinMacEditShow: false, + checkinMacEditLoading: 0, + checkinMacEditData: {}, + departmentEditShow: false, departmentEditLoading: 0, departmentEditData: {}, @@ -610,6 +656,45 @@ export default { dialogList: [], } }, + created() { + if (this.mode === 'checkin_mac') { + this.columns.splice(5, 0, { + title: this.$L('MAC地址'), + key: 'checkin_mac', + minWidth: 80, + render: (h, {row}) => { + let checkin_macs = $A.cloneJSON(row.checkin_macs || []) + if (checkin_macs.length === 0) { + return h('div', '-'); + } else { + const tmp = [] + tmp.push(h('span', { + domProps: { + title: checkin_macs[0] + } + }, checkin_macs[0])) + if (checkin_macs.length > 1) { + checkin_macs = checkin_macs.splice(1) + tmp.push(h('ETooltip', [ + h('div', { + slot: 'content', + domProps: { + innerHTML: checkin_macs.join("
    ") + } + }), + h('div', { + class: 'department-tag-num' + }, ` +${checkin_macs.length}`) + ])) + } + return h('div', { + class: 'team-table-department-warp' + }, tmp); + } + }, + }) + } + }, mounted() { this.getLists(); this.getDepartmentLists(); @@ -649,6 +734,7 @@ export default { url: 'users/lists', data: { keys, + checkin_mac: this.mode === 'checkin_mac' ? 1 : 0, page: Math.max(this.page, 1), pagesize: Math.max($A.runNum(this.pageSize), 10), }, @@ -709,6 +795,16 @@ export default { }); break; + case 'checkin_mac': + this.checkinMacEditData = { + type: 'checkin_macs', + userid: row.userid, + nickname: row.nickname, + checkin_macs: (row.checkin_macs || []).join(','), + }; + this.checkinMacEditShow = true; + break; + case 'department': let departments = [] row.department.some(did => { @@ -778,7 +874,9 @@ export default { operationUser(data, tipErr) { return new Promise((resolve, reject) => { - if (data.type == 'department') { + if (data.type == 'checkin_macs') { + this.checkinMacEditLoading++; + } else if (data.type == 'department') { this.departmentEditLoading++; } else if (data.type == 'setdisable') { this.disableLoading++; @@ -792,7 +890,9 @@ export default { $A.messageSuccess(msg); this.getLists(); resolve() - if (data.type == 'department') { + if (data.type == 'checkin_macs') { + this.checkinMacEditShow = false; + } else if (data.type == 'department') { this.departmentEditShow = false; } else if (data.type == 'setdisable') { this.disableShow = false; @@ -804,7 +904,9 @@ export default { this.getLists(); reject(msg) }).finally(_ => { - if (data.type == 'department') { + if (data.type == 'checkin_macs') { + this.checkinMacEditLoading--; + } else if (data.type == 'department') { this.departmentEditLoading--; } else if (data.type == 'setdisable') { this.disableLoading--; diff --git a/resources/assets/js/pages/manage/setting/components/SystemCheckin.vue b/resources/assets/js/pages/manage/setting/components/SystemCheckin.vue index 9868e80d4..cc947cbfd 100644 --- a/resources/assets/js/pages/manage/setting/components/SystemCheckin.vue +++ b/resources/assets/js/pages/manage/setting/components/SystemCheckin.vue @@ -2,18 +2,28 @@
    -

    {{ $L('WIFI签到') }}

    - - +

    {{ $L('WIFI自动签到') }}

    + + {{ $L('开启') }} {{ $L('关闭') }} -
    {{$L('导出签到数据')}}
    +
    +

    {{$L('管理成员MAC地址')}}

    +

    {{$L('导出签到数据')}}

    +
    -