From 9d9e22451d7f9cc65e158569931a79d7210ef792 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 22 Apr 2025 09:28:46 +0800 Subject: [PATCH] no message --- app/Http/Controllers/Api/UsersController.php | 38 +++++++++++ app/Models/UserDevice.php | 68 ++++++++++--------- .../assets/js/pages/manage/setting/device.vue | 17 +++-- 3 files changed, 86 insertions(+), 37 deletions(-) diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 444c08ad6..3aefb4253 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -2532,4 +2532,42 @@ class UsersController extends AbstractController // return Base::retSuccess('操作成功'); } + + /** + * @api {get} api/users/device/edit 41. 编辑设备 + * + * @apiDescription 需要token身份 + * @apiVersion 1.0.0 + * @apiGroup users + * @apiName device__edit + * + * @apiParam {Object} detail 设备信息 + * @apiParam {String} detail.app_brand 设备品牌 + * @apiParam {String} detail.app_model 设备型号 + * @apiParam {String} detail.app_os 设备操作系统 + * + * @apiSuccess {Number} ret 返回状态码(1正确、0错误) + * @apiSuccess {String} msg 返回信息(错误描述) + * @apiSuccess {Object} data 返回数据 + */ + public function device__edit() + { + User::auth(); + // + $detail = Base::json2array(Request::input('detail')); + $detail = array_intersect_key($detail, array_flip(['app_brand', 'app_model', 'app_os'])); + if (empty($detail)) { + return Base::retError('参数错误'); + } + // + $row = UserDevice::record(); + if (empty($row)) { + return Base::retError('设备不存在或已被删除'); + } + $deviceInfo = array_merge(Base::json2array($row->detail), $detail); + $row->detail = Base::array2json($deviceInfo); + $row->save(); + // + return Base::retSuccess('保存成功'); + } } diff --git a/app/Models/UserDevice.php b/app/Models/UserDevice.php index f61c8d1aa..0eb6ecd4e 100644 --- a/app/Models/UserDevice.php +++ b/app/Models/UserDevice.php @@ -234,45 +234,47 @@ class UserDevice extends AbstractModel */ public static function record(string $token = null): ?self { - if (empty($token)) { - $token = Doo::userToken(); - $userid = Doo::userId(); - $expiredAt = Doo::userExpiredAt(); - } else { - $info = Doo::tokenDecode($token); - $userid = $info['userid'] ?? 0; - $expiredAt = $info['expired_at']; - } - $deviceData = [ - 'detail' => Base::array2json(self::getDeviceInfo($_SERVER['HTTP_USER_AGENT'] ?? '')), - 'expired_at' => $expiredAt, - ]; - - $hash = md5($token); - $row = self::updateInsert([ - 'userid' => $userid, - 'hash' => $hash, - ], function() use ($deviceData) { - if (!Request::hasHeader('version')) { - unset($deviceData['detail']); + return AbstractModel::transaction(function () use ($token) { + if (empty($token)) { + $token = Doo::userToken(); + $userid = Doo::userId(); + $expiredAt = Doo::userExpiredAt(); + } else { + $info = Doo::tokenDecode($token); + $userid = $info['userid'] ?? 0; + $expiredAt = $info['expired_at']; } - return $deviceData; - }, $deviceData, $isInsert); - if ($isInsert) { - $currentDeviceCount = self::whereUserid($userid)->count(); - if ($currentDeviceCount > self::$deviceLimit) { + + $hash = md5($token); + $row = self::whereHash($hash)->lockForUpdate()->first(); + if (empty($row)) { + // 生成一个新的设备记录 + $row = self::createInstance([ + 'userid' => $userid, + 'hash' => $hash, + ]); + if (!$row->save()) { + return null; + } // 删除多余的设备记录 - $rows = self::whereUserid($userid)->orderBy('id')->take($currentDeviceCount - self::$deviceLimit)->get(); - foreach ($rows as $row) { - UserDevice::forget($row); + $currentDeviceCount = self::whereUserid($userid)->count(); + if ($currentDeviceCount > self::$deviceLimit) { + $rows = self::whereUserid($userid)->orderBy('id')->take($currentDeviceCount - self::$deviceLimit)->get(); + foreach ($rows as $row) { + UserDevice::forget($row); + } } } - } - if ($row) { + $row->expired_at = $expiredAt; + if (Request::hasHeader('version')) { + $deviceInfo = array_merge(Base::json2array($row->detail), self::getDeviceInfo($_SERVER['HTTP_USER_AGENT'] ?? '')); + $row->detail = Base::array2json($deviceInfo); + } + $row->save(); + Cache::put(self::ck($hash), $row->userid, now()->addHour()); return $row; - } - return null; + }); } /** diff --git a/resources/assets/js/pages/manage/setting/device.vue b/resources/assets/js/pages/manage/setting/device.vue index 56c9c8d01..1ec2dfebc 100644 --- a/resources/assets/js/pages/manage/setting/device.vue +++ b/resources/assets/js/pages/manage/setting/device.vue @@ -12,7 +12,7 @@
{{ getName(device.detail) }} - {{ device.detail.os }} + {{ getOs(device.detail) }}
@@ -92,11 +92,20 @@ export default { return 'web'; }, - getName({app_type, app_name, browser}) { + getName({app_brand, app_model, app_type, app_name, browser}) { + const array = []; if (/web/i.test(app_type)) { - return browser + " " + this.$L("浏览器") + array.push(...[browser, this.$L("浏览器")]); + } else if (app_brand) { + array.push(...[app_brand, app_model]) + } else { + array.push(...[app_name || app_type, this.$L("客户端")]) } - return (app_name || app_type) + " " + this.$L("客户端") + return array.join(' '); + }, + + getOs({app_os, os}) { + return app_os || os; }, onLogout(device) {