统一用户信息付费查看
This commit is contained in:
@@ -17,10 +17,12 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\CurrencySource;
|
||||
use App\Events\UserKicked;
|
||||
use App\Events\UserMuted;
|
||||
use App\Events\UserStatusUpdated;
|
||||
use App\Http\Requests\ChangePasswordRequest;
|
||||
use App\Http\Requests\RevealProfileInfoRequest;
|
||||
use App\Http\Requests\UpdateChatPreferencesRequest;
|
||||
use App\Http\Requests\UpdateDailyStatusRequest;
|
||||
use App\Http\Requests\UpdateProfileRequest;
|
||||
@@ -29,6 +31,7 @@ use App\Models\Sysparam;
|
||||
use App\Models\User;
|
||||
use App\Services\ChatStateService;
|
||||
use App\Services\ChatUserPresenceService;
|
||||
use App\Services\UserCurrencyService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
@@ -40,12 +43,28 @@ use Illuminate\Support\Facades\Redis;
|
||||
*/
|
||||
class UserController extends Controller
|
||||
{
|
||||
/**
|
||||
* 查看别人隐藏信息的单次扣费金额。
|
||||
*/
|
||||
public const INFO_REVEAL_COST = 1000;
|
||||
|
||||
/**
|
||||
* 可付费查看的信息字段和中文名称。
|
||||
*/
|
||||
private const REVEALABLE_INFO_LABELS = [
|
||||
'exp_num' => '经验',
|
||||
'jjb' => '金币',
|
||||
'bank_jjb' => '存款',
|
||||
'meili' => '魅力',
|
||||
];
|
||||
|
||||
/**
|
||||
* 构造用户控制器依赖。
|
||||
*/
|
||||
public function __construct(
|
||||
private readonly ChatStateService $chatState,
|
||||
private readonly ChatUserPresenceService $chatUserPresenceService,
|
||||
private readonly UserCurrencyService $currencyService,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -88,21 +107,29 @@ class UserController extends Controller
|
||||
'position_rank' => (int) ($activePosition?->rank ?? 0),
|
||||
];
|
||||
|
||||
// 只有等级不低于对方,或者自己看自己时,才能看到详细的财富、经验资产
|
||||
if ($operator && ($operator->user_level >= $targetUser->user_level || $operator->id === $targetUser->id)) {
|
||||
$data['exp_num'] = $targetUser->exp_num ?? 0;
|
||||
$data['jjb'] = $targetUser->jjb ?? 0;
|
||||
$data['meili'] = $targetUser->meili ?? 0;
|
||||
}
|
||||
// 经验、金币、魅力卡片始终展示;等级不足时只显示星号,不隐藏字段本身。
|
||||
$canViewAssetNumbers = $operator && $this->canViewAssetNumbers($operator, $targetUser);
|
||||
$data['exp_num'] = $canViewAssetNumbers ? ($targetUser->exp_num ?? 0) : '******';
|
||||
$data['jjb'] = $canViewAssetNumbers ? ($targetUser->jjb ?? 0) : '******';
|
||||
$data['meili'] = $canViewAssetNumbers ? ($targetUser->meili ?? 0) : '******';
|
||||
$data['asset_numbers_masked'] = ! $canViewAssetNumbers;
|
||||
$data['asset_numbers_can_reveal'] = ! $canViewAssetNumbers;
|
||||
$data['asset_numbers_reveal_cost'] = self::INFO_REVEAL_COST;
|
||||
$data['asset_reveal_user_id'] = $targetUser->id;
|
||||
|
||||
// 银行存款:只有超级管理员(user_level >= superlevel)或本人才能查看具体金额,其余一律显示星号
|
||||
if ($operator) {
|
||||
$isSelf = $operator->id === $targetUser->id;
|
||||
$superLevel = (int) Sysparam::getValue('superlevel', '100');
|
||||
$isSuperAdmin = $operator->user_level >= $superLevel;
|
||||
$data['bank_jjb'] = ($isSelf || $isSuperAdmin)
|
||||
? ($targetUser->bank_jjb ?? 0)
|
||||
: '******';
|
||||
$canViewBankBalance = $isSelf || $isSuperAdmin;
|
||||
|
||||
// 名片里的别人存款默认只返回星号,真实金额必须通过付费查看接口当次获取。
|
||||
$data['bank_jjb'] = $canViewBankBalance ? ($targetUser->bank_jjb ?? 0) : '******';
|
||||
$data['bank_jjb_masked'] = ! $canViewBankBalance;
|
||||
$data['bank_jjb_can_reveal'] = ! $canViewBankBalance;
|
||||
$data['bank_jjb_reveal_cost'] = self::INFO_REVEAL_COST;
|
||||
$data['bank_reveal_user_id'] = $targetUser->id;
|
||||
}
|
||||
|
||||
// 仅当自己看自己时,附加邀请相关信息,用于展示专属邀请链接
|
||||
@@ -191,6 +218,54 @@ class UserController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 付费查看用户资料中被星号隐藏的经验、金币、存款或魅力。
|
||||
*/
|
||||
public function revealInfo(RevealProfileInfoRequest $request): JsonResponse
|
||||
{
|
||||
/** @var User $operator */
|
||||
$operator = Auth::user();
|
||||
$targetUser = User::query()
|
||||
->select(['id', 'username', 'user_level', 'exp_num', 'jjb', 'bank_jjb', 'meili'])
|
||||
->findOrFail($request->integer('user_id'));
|
||||
$asset = (string) $request->string('asset');
|
||||
$assetLabel = self::REVEALABLE_INFO_LABELS[$asset];
|
||||
$charged = false;
|
||||
$operatorGold = (int) $operator->jjb;
|
||||
|
||||
if (! $this->canViewProfileInfo($operator, $targetUser, $asset)) {
|
||||
$operatorGold = $this->currencyService->deductGoldIfEnough(
|
||||
user: $operator,
|
||||
amount: self::INFO_REVEAL_COST,
|
||||
source: CurrencySource::USER_INFO_REVEAL,
|
||||
remark: "查看 {$targetUser->username} 的{$assetLabel}",
|
||||
);
|
||||
|
||||
if ($operatorGold === null) {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => '金币不足,查看'.$assetLabel.'需要 '.self::INFO_REVEAL_COST.' 金币。',
|
||||
]);
|
||||
}
|
||||
|
||||
$charged = true;
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'message' => $charged
|
||||
? '已扣除 '.self::INFO_REVEAL_COST.' 金币,'.$assetLabel.'已显示。'
|
||||
: $assetLabel.'已显示。',
|
||||
'user_id' => $targetUser->id,
|
||||
'username' => $targetUser->username,
|
||||
'asset' => $asset,
|
||||
'value' => $targetUser->{$asset} ?? 0,
|
||||
'charged' => $charged,
|
||||
'reveal_cost' => self::INFO_REVEAL_COST,
|
||||
'jjb' => $operatorGold,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改个人资料 (对应 USERSET.ASP)
|
||||
*/
|
||||
@@ -531,4 +606,31 @@ class UserController extends Controller
|
||||
|
||||
return response()->json(['status' => 'success', 'message' => "用户 {$username} 已被封号并封IP{$ipInfo}。"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断操作者是否可以免费查看目标用户经验、金币与魅力。
|
||||
*/
|
||||
private function canViewAssetNumbers(User $operator, User $targetUser): bool
|
||||
{
|
||||
return $operator->id === $targetUser->id
|
||||
|| (int) $operator->user_level >= (int) $targetUser->user_level;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断操作者是否可以免费查看指定资料信息。
|
||||
*/
|
||||
private function canViewProfileInfo(User $operator, User $targetUser, string $asset): bool
|
||||
{
|
||||
if ($asset !== 'bank_jjb') {
|
||||
return $this->canViewAssetNumbers($operator, $targetUser);
|
||||
}
|
||||
|
||||
if ($operator->id === $targetUser->id) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$superLevel = (int) Sysparam::getValue('superlevel', '100');
|
||||
|
||||
return (int) $operator->user_level >= $superLevel;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user