diff --git a/beike/Admin/Http/Controllers/AccountController.php b/beike/Admin/Http/Controllers/AccountController.php new file mode 100644 index 00000000..7f1e39a2 --- /dev/null +++ b/beike/Admin/Http/Controllers/AccountController.php @@ -0,0 +1,40 @@ + + * @created 2022-07-27 21:17:04 + * @modified 2022-07-27 21:17:04 + */ + +namespace Beike\Admin\Http\Controllers; + +use Beike\Admin\Repositories\AdminUserRepo; +use Beike\Repositories\AdminUserTokenRepo; +use Illuminate\Http\Request; + +class AccountController extends Controller +{ + public function index() + { + $user = current_user(); + $data = [ + 'current_user' => $user, + 'tokens' => AdminUserTokenRepo::getTokenByAdminUser($user)->pluck('token')->toArray() + ]; + + return view('admin::pages.account.index', $data); + } + + + public function update(Request $request) + { + $user = current_user(); + + $adminUserData = $request->all(); + AdminUserRepo::updateAdminUser($user->id, $adminUserData); + return response()->redirectTo('admin/account')->with('success', trans('common.updated_success')); + } +} diff --git a/beike/Admin/Repositories/AdminUserRepo.php b/beike/Admin/Repositories/AdminUserRepo.php index 22fcf442..d1bd7e64 100644 --- a/beike/Admin/Repositories/AdminUserRepo.php +++ b/beike/Admin/Repositories/AdminUserRepo.php @@ -13,6 +13,7 @@ namespace Beike\Admin\Repositories; use Beike\Admin\Http\Resources\AdminUserDetail; use Beike\Models\AdminUser; +use Beike\Repositories\AdminUserTokenRepo; use Symfony\Component\HttpKernel\Exception\NotAcceptableHttpException; class AdminUserRepo @@ -73,7 +74,14 @@ class AdminUserRepo $userData['password'] = bcrypt($password); } $adminUser->update($userData); - $adminUser->syncRoles($data['roles']); + + $roles = $data['roles'] ?? []; + if ($roles) { + $adminUser->syncRoles($roles); + } + + $tokens = $data['tokens'] ?? []; + AdminUserTokenRepo::updateTokensByUser($adminUser, $tokens); return $adminUser; } diff --git a/beike/Admin/Routes/admin.php b/beike/Admin/Routes/admin.php index 2a5b4eae..69fb0825 100644 --- a/beike/Admin/Routes/admin.php +++ b/beike/Admin/Routes/admin.php @@ -20,6 +20,10 @@ Route::prefix($adminName) ->group(function () { Route::get('/', [Controllers\HomeController::class, 'index'])->name('home.index'); + //个人中心 + Route::middleware('can:account_index')->get('account', [Controllers\AccountController::class, 'index'])->name('account.index'); + Route::middleware('can:account_update')->put('account', [Controllers\AccountController::class, 'update'])->name('account.update'); + // 属性 Route::middleware('can:attributes_update')->post('attributes/{id}/values', [Controllers\AttributeController::class, 'storeValue'])->name('attributes.values.store'); Route::middleware('can:attributes_show')->get('attributes/{id}/values/autocomplete', [Controllers\AttributeController::class, 'autocompleteValue'])->name('attributes.values.autocomplete'); diff --git a/beike/Admin/View/Components/Sidebar.php b/beike/Admin/View/Components/Sidebar.php index 92fc373e..7980820b 100644 --- a/beike/Admin/View/Components/Sidebar.php +++ b/beike/Admin/View/Components/Sidebar.php @@ -162,7 +162,7 @@ class Sidebar extends Component */ private function getSettingSubPrefix() { - $prefix = ['settings.', 'admin_users.', 'admin_roles.', 'plugins.', 'theme.', 'marketing.', 'tax_classes', 'tax_rates', 'regions', 'currencies', 'languages', 'design_menu', 'countries', 'zones']; + $prefix = ['settings.', 'account.', 'admin_users.', 'admin_roles.', 'plugins.', 'theme.', 'marketing.', 'tax_classes', 'tax_rates', 'regions', 'currencies', 'languages', 'design_menu', 'countries', 'zones']; return hook_filter('admin.sidebar.setting.prefix', $prefix); } @@ -252,6 +252,7 @@ class Sidebar extends Component { $routes = [ ['route' => 'settings.index', 'icon' => 'fa fa-tachometer-alt'], + ['route' => 'account.index', 'icon' => 'fa fa-tachometer-alt'], ['route' => 'admin_users.index', 'icon' => 'fa fa-tachometer-alt'], ['route' => 'plugins.index', 'icon' => 'fa fa-tachometer-alt', 'hide_mobile' => 1], ['route' => 'theme.index', 'icon' => 'fa fa-tachometer-alt', 'hide_mobile' => 1], diff --git a/beike/Models/AdminUser.php b/beike/Models/AdminUser.php index 596d23e7..9d3c7d80 100644 --- a/beike/Models/AdminUser.php +++ b/beike/Models/AdminUser.php @@ -4,6 +4,7 @@ namespace Beike\Models; use Beike\Notifications\AdminForgottenNotification; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as AuthUser; use Illuminate\Notifications\Notifiable; use Spatie\Permission\Traits\HasRoles; @@ -17,6 +18,11 @@ class AdminUser extends AuthUser protected $fillable = ['name', 'email', 'locale', 'password', 'active']; + public function tokens(): HasMany + { + return $this->hasMany(AdminUserToken::class); + } + public function notifyVerifyCodeForForgotten($code) { $useQueue = system_setting('base.use_queue', true); diff --git a/beike/Models/AdminUserToken.php b/beike/Models/AdminUserToken.php new file mode 100644 index 00000000..52403005 --- /dev/null +++ b/beike/Models/AdminUserToken.php @@ -0,0 +1,27 @@ + + * @created 2023-04-20 10:18:56 + * @modified 2023-04-20 10:18:56 + */ + +namespace Beike\Models; + +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; + +class AdminUserToken extends Model +{ + protected $fillable = ['admin_user_id', 'token']; + + + public function adminUser(): BelongsTo + { + return $this->belongsTo(AdminUser::class); + } + +} diff --git a/beike/Repositories/AdminUserTokenRepo.php b/beike/Repositories/AdminUserTokenRepo.php new file mode 100644 index 00000000..afc75c5d --- /dev/null +++ b/beike/Repositories/AdminUserTokenRepo.php @@ -0,0 +1,60 @@ + + * @created 2023-04-20 10:21:25 + * @modified 2023-04-20 10:21:25 + */ + +namespace Beike\Repositories; + +use Beike\Models\AdminUser; +use Beike\Models\AdminUserToken; + +class AdminUserTokenRepo +{ + public static function getTokenByAdminUser($adminUser) + { + $adminUserId = self::getAdminUserId($adminUser); + if (empty($adminUserId)) { + return null; + } + return AdminUserToken::query()->where('admin_user_id', $adminUserId)->get(); + } + + + public static function updateTokensByUser($adminUser, $tokens) + { + $adminUserId = self::getAdminUserId($adminUser); + if (empty($adminUserId)) { + return null; + } + + AdminUserToken::query()->where('admin_user_id', $adminUserId)->delete(); + if (empty($tokens)) { + return null; + } + + foreach ($tokens as $token) { + AdminUserToken::query()->create([ + 'admin_user_id' => $adminUserId, + 'token' => $token + ]); + } + } + + + private static function getAdminUserId($adminUser) + { + $adminUserId = 0; + if ($adminUser instanceof AdminUser) { + $adminUserId = $adminUser->id; + } elseif (is_int($adminUser)) { + $adminUserId = $adminUser; + } + return $adminUserId; + } +} diff --git a/database/migrations/2023_04_20_013537_create_admin_user_tokens.php b/database/migrations/2023_04_20_013537_create_admin_user_tokens.php new file mode 100644 index 00000000..5d422b89 --- /dev/null +++ b/database/migrations/2023_04_20_013537_create_admin_user_tokens.php @@ -0,0 +1,33 @@ +id(); + $table->integer('admin_user_id'); + $table->string('token', 64); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('admin_user_tokens'); + } +}; diff --git a/resources/beike/admin/js/common.js b/resources/beike/admin/js/common.js index da69b6be..88bf759f 100644 --- a/resources/beike/admin/js/common.js +++ b/resources/beike/admin/js/common.js @@ -3,7 +3,7 @@ * @link https://beikeshop.com * @Author pu shuo * @Date 2022-08-22 18:32:26 - * @LastEditTime 2023-04-10 15:47:07 + * @LastEditTime 2023-04-19 15:26:41 */ export default { @@ -44,10 +44,13 @@ export default { }, // 生成随机字符串 - randomString(length) { + randomString(length = 32) { let str = ''; - for (; str.length < length; str += Math.random().toString(36).substr(2)); - return str.substr(0, length); + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + for (let i = 0; i < length; i++) { + str += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return str; }, // 获取url参数 diff --git a/resources/beike/admin/views/components/header.blade.php b/resources/beike/admin/views/components/header.blade.php index 9c1bc4b3..c8b50b22 100644 --- a/resources/beike/admin/views/components/header.blade.php +++ b/resources/beike/admin/views/components/header.blade.php @@ -67,6 +67,7 @@
  • @lang('admin/common.access_frontend')
  • +
  • {{ __('admin/common.account_index') }}
  • {{ __('common.sign_out') }}
  • diff --git a/resources/beike/admin/views/pages/account/index.blade.php b/resources/beike/admin/views/pages/account/index.blade.php new file mode 100644 index 00000000..7b7d85cd --- /dev/null +++ b/resources/beike/admin/views/pages/account/index.blade.php @@ -0,0 +1,86 @@ +@extends('admin::layouts.master') + +@section('title', __('admin/common.account_index')) + +@section('page-title-right') + +@endsection + +@section('content') +
    +
    +
    + @csrf + @method('PUT') + @if (session('success')) + + @endif + + + +
    +
    + + + +
    {{ __('admin/account.password_text') }}
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + +
    Token{{ __('common.action') }}
    + + + +
    + +
    +
    +
    +
    +
    + +
    +
    +@endsection + +@push('footer') + +@endpush diff --git a/resources/lang/en/admin/account.php b/resources/lang/en/admin/account.php new file mode 100644 index 00000000..d2f2dab4 --- /dev/null +++ b/resources/lang/en/admin/account.php @@ -0,0 +1,15 @@ + + * @created 2022-08-02 19:03:19 + * @modified 2022-08-02 19:03:19 + */ + +return [ + 'create_token' => 'Create Token', + 'password_text' => 'If the password is left blank, it will not be modified', +]; diff --git a/resources/lang/en/admin/common.php b/resources/lang/en/admin/common.php index cda94b20..53d61f81 100644 --- a/resources/lang/en/admin/common.php +++ b/resources/lang/en/admin/common.php @@ -52,6 +52,7 @@ return [ 'copyright_buy' => 'Copyright Buy', // sidebar + 'account_index' => 'Personal Center', 'multi_filter_index' => 'Advanced Filter', 'theme_index' => 'Theme Setting', 'attribute_groups_index' => 'Attribute Group', diff --git a/resources/lang/zh_cn/admin/account.php b/resources/lang/zh_cn/admin/account.php new file mode 100644 index 00000000..51cac8ce --- /dev/null +++ b/resources/lang/zh_cn/admin/account.php @@ -0,0 +1,15 @@ + + * @created 2022-08-02 19:03:19 + * @modified 2022-08-02 19:03:19 + */ + +return [ + 'create_token' => '生成 Token', + 'password_text' => '密码留空则不修改', +]; diff --git a/resources/lang/zh_cn/admin/common.php b/resources/lang/zh_cn/admin/common.php index b3f75fa2..5a867db4 100644 --- a/resources/lang/zh_cn/admin/common.php +++ b/resources/lang/zh_cn/admin/common.php @@ -52,6 +52,7 @@ return [ 'copyright_buy' => '版权购买', // sidebar + 'account_index' => '个人中心', 'multi_filter_index' => '高级筛选', 'theme_index' => '模板设置', 'attribute_groups_index' => '属性组',