feat(admin): 密码校验统一与后台 API/设置增强
Some checks failed
lotterLaravel CI / test (push) Has been cancelled
lotterLaravel E2E / e2e-api (push) Has been cancelled

- 管理端账号/代理/站点等密码最短长度统一为 6 位
- LotterySettings、审计日志展示、币种与报表接口等小修复
- 补充设置批量更新、注单、校验错误等相关测试
This commit is contained in:
2026-06-26 14:39:22 +08:00
parent 8d5ff0a7ae
commit 3f04b4ebe3
28 changed files with 283 additions and 69 deletions

View File

@@ -19,6 +19,11 @@ use Illuminate\Support\Facades\DB;
*/
final class AdminSettingController extends Controller
{
public function deployment(): JsonResponse
{
return ApiResponse::success(LotterySettings::deploymentSnapshot());
}
public function index(AdminSettingIndexRequest $request): JsonResponse
{
$validated = $request->validated();

View File

@@ -50,4 +50,4 @@ final class AuditLogIndexController extends Controller
return ApiResponse::success(AuditLogApiPresenter::listPayload($paginator));
}
}
}

View File

@@ -24,7 +24,7 @@ final class AdminCurrencyStoreController extends Controller
$currency = Currency::query()->create([
'code' => $data['code'],
'name' => $data['name'],
'decimal_places' => (int) ($data['decimal_places'] ?? 2),
'decimal_places' => 2,
'is_enabled' => $enabled,
'is_bettable' => $bettable,
]);

View File

@@ -25,10 +25,6 @@ final class AdminCurrencyUpdateController extends Controller
$data['is_bettable'] = (bool) $data['is_bettable'];
}
if (array_key_exists('decimal_places', $data)) {
$data['decimal_places'] = (int) $data['decimal_places'];
}
if (array_key_exists('is_enabled', $data)) {
$data['is_enabled'] = (bool) $data['is_enabled'];
}

View File

@@ -35,4 +35,4 @@ final class ReportJobStoreController extends Controller
'status' => $job->status,
]);
}
}
}

View File

@@ -37,6 +37,7 @@ final class TicketItemsIndexController extends Controller
$statusInput,
))) : [];
$number = trim((string) $request->query('number', ''));
$orderNo = trim((string) $request->query('order_no', ''));
$startDate = $this->normalizeDate((string) $request->query('start_date', ''));
$endDate = $this->normalizeDate((string) $request->query('end_date', ''));
@@ -57,6 +58,10 @@ final class TicketItemsIndexController extends Controller
$query->whereIn('ticket_items.status', $statusValues);
}
if ($orderNo !== '') {
$query->whereHas('order', fn ($q) => $q->where('order_no', $orderNo));
}
$this->applyTicketItemNumberSearch($query, $number);
$this->applyOrderPlacedDateRange($query, $startDate, $endDate);

View File

@@ -17,7 +17,6 @@ final class AdminCurrencyStoreRequest extends ApiFormRequest
return [
'code' => ['required', 'string', 'max:16', 'regex:/^[A-Z0-9]{1,16}$/', Rule::unique('currencies', 'code')],
'name' => ['required', 'string', 'max:64'],
'decimal_places' => ['sometimes', 'integer', 'min:0', 'max:12'],
'is_enabled' => ['sometimes', 'boolean'],
'is_bettable' => ['sometimes', 'boolean'],
];

View File

@@ -15,7 +15,6 @@ final class AdminCurrencyUpdateRequest extends ApiFormRequest
{
return [
'name' => ['sometimes', 'string', 'max:64'],
'decimal_places' => ['sometimes', 'integer', 'min:0', 'max:12'],
'is_enabled' => ['sometimes', 'boolean'],
'is_bettable' => ['sometimes', 'boolean'],
];

View File

@@ -33,7 +33,7 @@ final class AdminIntegrationSiteStoreRequest extends ApiFormRequest
'admin_account' => ['required', 'array'],
'admin_account.username' => ['required', 'string', 'max:64', Rule::unique('admin_users', 'username')],
'admin_account.nickname' => ['required', 'string', 'max:64'],
'admin_account.password' => ['required', 'string', 'min:8', 'max:255'],
'admin_account.password' => ['required', 'string', 'min:6', 'max:255'],
'admin_account.email' => ['nullable', 'email', 'max:255'],
];
}

View File

@@ -50,7 +50,7 @@ final class AdminUserStoreRequest extends ApiFormRequest
'username' => ['required', 'string', 'min:2', 'max:64', 'regex:/^[a-zA-Z0-9._-]+$/u', 'unique:admin_users,username'],
'nickname' => ['required', 'string', 'max:128'],
'email' => ['nullable', 'string', 'email', 'max:255'],
'password' => ['required', 'string', 'min:8', 'max:256'],
'password' => ['required', 'string', 'min:6', 'max:256'],
'status' => ['sometimes', 'integer', 'in:0,1'],
'admin_site_id' => ['required', 'integer', 'exists:admin_sites,id'],
'role_slugs' => ['required', 'array', 'min:1'],

View File

@@ -34,7 +34,7 @@ final class AdminUserUpdateRequest extends ApiFormRequest
return [
'nickname' => ['sometimes', 'string', 'max:128'],
'email' => ['sometimes', 'nullable', 'string', 'email', 'max:255', Rule::unique('admin_users', 'email')->ignore($adminUser?->id)],
'password' => ['sometimes', 'nullable', 'string', 'min:8', 'max:256'],
'password' => ['sometimes', 'nullable', 'string', 'min:6', 'max:256'],
'status' => ['sometimes', 'integer', Rule::in([0, 1])],
];
}

View File

@@ -31,7 +31,7 @@ final class AgentNodeStoreRequest extends ApiFormRequest
'name' => ['required', 'string', 'max:128'],
'username' => ['sometimes', 'nullable', ...$this->adminOperatorUsernameRules(required: false), Rule::unique('admin_users', 'username')],
'email' => ['nullable', 'email', 'max:255', Rule::unique('admin_users', 'email')],
'password' => ['required', 'string', 'min:8', 'max:128'],
'password' => ['required', 'string', 'min:6', 'max:128'],
'status' => ['sometimes', 'integer', 'in:0,1'],
...$this->agentProfileFieldRules(),
];

View File

@@ -13,7 +13,7 @@ trait AdminAccountFieldRules
}
/** @return array<int, mixed> */
protected function adminLoginPasswordRules(bool $required = true, int $min = 8, int $max = 256): array
protected function adminLoginPasswordRules(bool $required = true, int $min = 6, int $max = 256): array
{
$rules = ['string', 'min:'.$min, 'max:'.$max];