fix change user class + medal display

This commit is contained in:
xiaomlove
2023-01-10 17:25:53 +08:00
parent 3612edbb5b
commit d7d63c8fd2
20 changed files with 249 additions and 16 deletions
+2 -2
View File
@@ -95,8 +95,8 @@ class Test extends Command
*/ */
public function handle() public function handle()
{ {
$r = getLogFile(); $work = new WorkRepository();
dd($r); $work->settleRole(6, 1, true);
} }
} }
@@ -44,15 +44,18 @@ class MedalResource extends Resource
Forms\Components\Radio::make('get_type') Forms\Components\Radio::make('get_type')
->options(Medal::listGetTypes(true)) ->options(Medal::listGetTypes(true))
->inline() ->inline()
->columnSpan(['sm' => 2])
->label(__('label.medal.get_type')) ->label(__('label.medal.get_type'))
->required(), ->required(),
Forms\Components\Toggle::make('display_on_medal_page')
->label(__('label.medal.display_on_medal_page'))
->required(),
Forms\Components\TextInput::make('duration') Forms\Components\TextInput::make('duration')
->integer() ->integer()
->columnSpan(['sm' => 2])
->label(__('label.medal.duration')) ->label(__('label.medal.duration'))
->helperText(__('label.medal.duration_help')), ->helperText(__('label.medal.duration_help')),
Forms\Components\Textarea::make('description')->columnSpan(['sm' => 2])->label(__('label.description')), Forms\Components\Textarea::make('description')
->label(__('label.description'))
,
]); ]);
} }
@@ -67,6 +70,7 @@ class MedalResource extends Resource
Tables\Columns\TextColumn::make('getTypeText')->label('Get type')->label(__('label.medal.get_type')), Tables\Columns\TextColumn::make('getTypeText')->label('Get type')->label(__('label.medal.get_type')),
Tables\Columns\TextColumn::make('price')->label(__('label.price')), Tables\Columns\TextColumn::make('price')->label(__('label.price')),
Tables\Columns\TextColumn::make('duration')->label(__('label.medal.duration')), Tables\Columns\TextColumn::make('duration')->label(__('label.medal.duration')),
Tables\Columns\IconColumn::make('display_on_medal_page')->label(__('label.medal.display_on_medal_page'))->boolean(),
]) ])
->defaultSort('id', 'desc') ->defaultSort('id', 'desc')
->filters([ ->filters([
@@ -16,4 +16,9 @@ class EditMedal extends EditRecord
Actions\DeleteAction::make(), Actions\DeleteAction::make(),
]; ];
} }
protected function getRedirectUrl(): ?string
{
return $this->getResource()::getUrl('index');
}
} }
@@ -22,7 +22,7 @@ class UsernameChangeLogResource extends Resource
protected static ?string $navigationGroup = 'User'; protected static ?string $navigationGroup = 'User';
protected static ?int $navigationSort = 8; protected static ?int $navigationSort = 100;
protected static function getNavigationLabel(): string protected static function getNavigationLabel(): string
{ {
+21 -4
View File
@@ -2,6 +2,7 @@
namespace App\Filament\Resources\User; namespace App\Filament\Resources\User;
use App\Filament\OptionsTrait;
use App\Filament\Resources\User\InviteResource\Pages; use App\Filament\Resources\User\InviteResource\Pages;
use App\Filament\Resources\User\InviteResource\RelationManagers; use App\Filament\Resources\User\InviteResource\RelationManagers;
use App\Models\Invite; use App\Models\Invite;
@@ -15,6 +16,8 @@ use Illuminate\Database\Eloquent\SoftDeletingScope;
class InviteResource extends Resource class InviteResource extends Resource
{ {
use OptionsTrait;
protected static ?string $model = Invite::class; protected static ?string $model = Invite::class;
protected static ?string $navigationIcon = 'heroicon-o-user-add'; protected static ?string $navigationIcon = 'heroicon-o-user-add';
@@ -52,6 +55,7 @@ class InviteResource extends Resource
, ,
Tables\Columns\TextColumn::make('invitee') Tables\Columns\TextColumn::make('invitee')
->label(__('invite.fields.invitee')) ->label(__('invite.fields.invitee'))
->searchable()
, ,
Tables\Columns\TextColumn::make('hash') Tables\Columns\TextColumn::make('hash')
, ,
@@ -64,15 +68,15 @@ class InviteResource extends Resource
, ,
Tables\Columns\TextColumn::make('invitee_register_uid') Tables\Columns\TextColumn::make('invitee_register_uid')
->label(__('invite.fields.invitee_register_uid')) ->label(__('invite.fields.invitee_register_uid'))
->searchable()
, ,
Tables\Columns\TextColumn::make('invitee_register_email') Tables\Columns\TextColumn::make('invitee_register_email')
->label(__('invite.fields.invitee_register_email')) ->label(__('invite.fields.invitee_register_email'))
, ->searchable()
Tables\Columns\TextColumn::make('invitee_register_email')
->label(__('invite.fields.invitee_register_email'))
, ,
Tables\Columns\TextColumn::make('invitee_register_username') Tables\Columns\TextColumn::make('invitee_register_username')
->label(__('invite.fields.invitee_register_username')) ->label(__('invite.fields.invitee_register_username'))
->searchable()
, ,
Tables\Columns\TextColumn::make('expired_at') Tables\Columns\TextColumn::make('expired_at')
->label(__('invite.fields.expired_at')) ->label(__('invite.fields.expired_at'))
@@ -84,7 +88,20 @@ class InviteResource extends Resource
, ,
]) ])
->filters([ ->filters([
// Tables\Filters\Filter::make('inviter')
->form([
Forms\Components\TextInput::make('inviter')
->label(__('invite.fields.inviter'))
->placeholder('UID')
,
])->query(function (Builder $query, array $data) {
return $query->when($data['inviter'], fn (Builder $query, $value) => $query->where("inviter", $value));
})
,
Tables\Filters\SelectFilter::make('valid')
->options(self::getYesNoOptions())
->label(__('invite.fields.valid'))
,
]) ])
->actions([ ->actions([
// Tables\Actions\EditAction::make(), // Tables\Actions\EditAction::make(),
@@ -0,0 +1,105 @@
<?php
namespace App\Filament\Resources\User;
use App\Filament\Resources\User\UserMetaResource\Pages;
use App\Filament\Resources\User\UserMetaResource\RelationManagers;
use App\Models\UserMeta;
use Filament\Forms;
use Filament\Resources\Form;
use Filament\Resources\Resource;
use Filament\Resources\Table;
use Filament\Tables;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Support\HtmlString;
class UserMetaResource extends Resource
{
protected static ?string $model = UserMeta::class;
protected static ?string $navigationIcon = 'heroicon-o-collection';
protected static ?string $navigationGroup = 'User';
protected static ?int $navigationSort = 8;
protected static function getNavigationLabel(): string
{
return __('admin.sidebar.user_props');
}
public static function getBreadcrumb(): string
{
return self::getNavigationLabel();
}
public static function form(Form $form): Form
{
return $form
->schema([
//
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('id'),
Tables\Columns\TextColumn::make('uid')
->searchable()
->label(__('label.username'))
->formatStateUsing(fn ($state) => username_for_admin($state))
,
Tables\Columns\TextColumn::make('meta_key_text')
->label(__('label.name'))
,
Tables\Columns\TextColumn::make('deadline')
->label(__('label.deadline'))
,
Tables\Columns\TextColumn::make('created_at')
->label(__('label.created_at'))
->formatStateUsing(fn ($state) => format_datetime($state))
,
])
->filters([
Tables\Filters\Filter::make('uid')
->form([
Forms\Components\TextInput::make('uid')
->label(__('label.username'))
->placeholder('UID')
,
])->query(function (Builder $query, array $data) {
return $query->when($data['uid'], fn (Builder $query, $value) => $query->where("uid", $value));
})
,
Tables\Filters\SelectFilter::make('meta_key')
->options(UserMeta::listProps())
->label(__('label.name'))
,
])
->actions([
// Tables\Actions\EditAction::make(),
])
->bulkActions([
// Tables\Actions\DeleteBulkAction::make(),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListUserMetas::route('/'),
'create' => Pages\CreateUserMeta::route('/create'),
'edit' => Pages\EditUserMeta::route('/{record}/edit'),
];
}
}
@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\User\UserMetaResource\Pages;
use App\Filament\Resources\User\UserMetaResource;
use Filament\Pages\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateUserMeta extends CreateRecord
{
protected static string $resource = UserMetaResource::class;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\User\UserMetaResource\Pages;
use App\Filament\Resources\User\UserMetaResource;
use Filament\Pages\Actions;
use Filament\Resources\Pages\EditRecord;
class EditUserMeta extends EditRecord
{
protected static string $resource = UserMetaResource::class;
protected function getActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}
@@ -0,0 +1,29 @@
<?php
namespace App\Filament\Resources\User\UserMetaResource\Pages;
use App\Filament\PageList;
use App\Filament\Resources\User\UserMetaResource;
use App\Models\UserMeta;
use Filament\Pages\Actions;
use Filament\Resources\Pages\ListRecords;
use Illuminate\Database\Eloquent\Builder;
class ListUserMetas extends PageList
{
protected static string $resource = UserMetaResource::class;
protected function getActions(): array
{
return [
// Actions\CreateAction::make(),
];
}
protected function getTableQuery(): Builder
{
return UserMeta::query()->whereIn('meta_key', array_keys(UserMeta::$metaKeys));
}
}
@@ -160,7 +160,7 @@ class UserProfile extends ViewRecord
->hidden(fn (\Closure $get) => $get('field') != 'tmp_invites') ->hidden(fn (\Closure $get) => $get('field') != 'tmp_invites')
, ,
Forms\Components\Textarea::make('reason') Forms\Components\TextInput::make('reason')
->label(__('admin.resources.user.actions.change_bonus_etc_reason_label')) ->label(__('admin.resources.user.actions.change_bonus_etc_reason_label'))
, ,
]) ])
@@ -365,7 +365,7 @@ class UserProfile extends ViewRecord
->label(__('admin.resources.user.actions.change_class_btn')) ->label(__('admin.resources.user.actions.change_class_btn'))
->form([ ->form([
Forms\Components\Select::make('class') Forms\Components\Select::make('class')
->options(User::listClass()) ->options(User::listClass(User::CLASS_PEASANT, Auth::user()->class - 1))
->default($this->record->class) ->default($this->record->class)
->label(__('user.labels.class')) ->label(__('user.labels.class'))
->required() ->required()
+1 -1
View File
@@ -15,7 +15,7 @@ class Medal extends NexusModel
self::GET_TYPE_GRANT => ['text' => 'Grant'], self::GET_TYPE_GRANT => ['text' => 'Grant'],
]; ];
protected $fillable = ['name', 'description', 'image_large', 'image_small', 'price', 'duration', 'get_type']; protected $fillable = ['name', 'description', 'image_large', 'image_small', 'price', 'duration', 'get_type', 'display_on_medal_page'];
public $timestamps = true; public $timestamps = true;
+5
View File
@@ -43,4 +43,9 @@ class UserMeta extends NexusModel
return $this->status == self::STATUS_NORMAL && ($this->getRawOriginal('deadline') === null || ($this->deadline && $this->deadline->gte(now()))); return $this->status == self::STATUS_NORMAL && ($this->getRawOriginal('deadline') === null || ($this->deadline && $this->deadline->gte(now())));
} }
public function user()
{
return $this->belongsTo(User::class, 'uid');
}
} }
+2 -1
View File
@@ -471,7 +471,8 @@ class UserRepository extends BaseRepository
user_can('user-change-class', true); user_can('user-change-class', true);
$operator = $this->getUser($operator); $operator = $this->getUser($operator);
$targetUser = $this->getUser($targetUser); $targetUser = $this->getUser($targetUser);
if ($operator && $operator->class <= $targetUser->class) { if ($operator) {
if ($operator->class <= $targetUser->class || $operator->class <= $newClass)
throw new InsufficientPermissionException(); throw new InsufficientPermissionException();
} }
if ($targetUser->class == $newClass) { if ($targetUser->class == $newClass) {
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('medals', function (Blueprint $table) {
$table->integer('display_on_medal_page')->default(1)->after('price');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('medals', function (Blueprint $table) {
$table->dropColumn('display_on_medal_page');
});
}
};
+1 -1
View File
@@ -1,6 +1,6 @@
<?php <?php
defined('VERSION_NUMBER') || define('VERSION_NUMBER', '1.8.0'); defined('VERSION_NUMBER') || define('VERSION_NUMBER', '1.8.0');
defined('RELEASE_DATE') || define('RELEASE_DATE', '2023-01-07'); defined('RELEASE_DATE') || define('RELEASE_DATE', '2023-01-10');
defined('IN_TRACKER') || define('IN_TRACKER', false); defined('IN_TRACKER') || define('IN_TRACKER', false);
defined('PROJECTNAME') || define("PROJECTNAME","NexusPHP"); defined('PROJECTNAME') || define("PROJECTNAME","NexusPHP");
defined('NEXUSPHPURL') || define("NEXUSPHPURL","https://nexusphp.org"); defined('NEXUSPHPURL') || define("NEXUSPHPURL","https://nexusphp.org");
+1 -1
View File
@@ -1,7 +1,7 @@
<?php <?php
require "../include/bittorrent.php"; require "../include/bittorrent.php";
$query = \App\Models\Medal::query(); $query = \App\Models\Medal::query()->where('display_on_medal_page', 1);
$q = htmlspecialchars($_REQUEST['q'] ?? ''); $q = htmlspecialchars($_REQUEST['q'] ?? '');
if (!empty($q)) { if (!empty($q)) {
$query->where('username', 'name', "%{$q}%"); $query->where('username', 'name', "%{$q}%");
+1
View File
@@ -33,6 +33,7 @@ return [
'second_icon' => 'Second icons', 'second_icon' => 'Second icons',
'torrent_operation_log' => 'Torrent operation logs', 'torrent_operation_log' => 'Torrent operation logs',
'invite' => 'Invites', 'invite' => 'Invites',
'user_props' => 'User props',
], ],
'resources' => [ 'resources' => [
'agent_allow' => [ 'agent_allow' => [
+1
View File
@@ -31,6 +31,7 @@ return [
'second_icon' => '第二图标', 'second_icon' => '第二图标',
'torrent_operation_log' => '种子操作记录', 'torrent_operation_log' => '种子操作记录',
'invite' => '用户邀请', 'invite' => '用户邀请',
'user_props' => '用户道具',
], ],
'resources' => [ 'resources' => [
'agent_allow' => [ 'agent_allow' => [
+1
View File
@@ -111,6 +111,7 @@ return [
'get_type' => '获取方式', 'get_type' => '获取方式',
'duration' => '有效时长', 'duration' => '有效时长',
'duration_help' => '单位:天。如果留空,用户永久拥有', 'duration_help' => '单位:天。如果留空,用户永久拥有',
'display_on_medal_page' => '展示在勋章页面',
], ],
'user_medal' => [ 'user_medal' => [
'label' => '用户勋章', 'label' => '用户勋章',
+1
View File
@@ -33,6 +33,7 @@ return [
'second_icon' => '第二圖標', 'second_icon' => '第二圖標',
'torrent_operation_log' => '種子操作記錄', 'torrent_operation_log' => '種子操作記錄',
'invite' => '用戶邀請', 'invite' => '用戶邀請',
'user_props' => '用戶道具',
], ],
'resources' => [ 'resources' => [
'agent_allow' => [ 'agent_allow' => [