feat: 增强维护模式和审计页面功能,优化构建流程
All checks were successful
docker-images / resolve-build-targets (push) Successful in 4s
ui-regression / playwright-regression (push) Successful in 5m55s
docker-images / build-and-push (admin) (push) Successful in 54s
docker-images / build-and-push (backend) (push) Successful in 4s
docker-images / build-and-push (frontend) (push) Successful in 1m8s
docker-images / submit-indexnow (push) Successful in 15s
All checks were successful
docker-images / resolve-build-targets (push) Successful in 4s
ui-regression / playwright-regression (push) Successful in 5m55s
docker-images / build-and-push (admin) (push) Successful in 54s
docker-images / build-and-push (backend) (push) Successful in 4s
docker-images / build-and-push (frontend) (push) Successful in 1m8s
docker-images / submit-indexnow (push) Successful in 15s
This commit is contained in:
@@ -13,13 +13,17 @@ COPY . .
|
||||
ARG PUBLIC_API_BASE_URL=http://localhost:5150/api
|
||||
ENV PUBLIC_API_BASE_URL=${PUBLIC_API_BASE_URL}
|
||||
|
||||
RUN pnpm build
|
||||
RUN pnpm build \
|
||||
&& pnpm prune --prod
|
||||
|
||||
FROM node:22-alpine AS runner
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=builder /app/package.json ./package.json
|
||||
COPY --from=builder /app/node_modules ./node_modules
|
||||
COPY --from=builder /app/dist ./dist
|
||||
|
||||
ENV NODE_ENV=production
|
||||
ENV HOST=0.0.0.0
|
||||
ENV PORT=4321
|
||||
EXPOSE 4321
|
||||
|
||||
@@ -13,9 +13,22 @@ interface MaintenanceVerifyResponse {
|
||||
}
|
||||
|
||||
export const POST: APIRoute = async ({ request, url, cookies, redirect }) => {
|
||||
const formData = await request.formData().catch(() => null)
|
||||
const code = String(formData?.get('code') ?? '').trim()
|
||||
const returnTo = sanitizeMaintenanceReturnTo(String(formData?.get('returnTo') ?? '/'))
|
||||
const contentType = request.headers.get('content-type') ?? ''
|
||||
let code = ''
|
||||
let returnTo = '/'
|
||||
|
||||
if (contentType.includes('application/json')) {
|
||||
const payload = (await request.json().catch(() => ({}))) as {
|
||||
code?: unknown
|
||||
returnTo?: unknown
|
||||
}
|
||||
code = String(payload.code ?? '').trim()
|
||||
returnTo = sanitizeMaintenanceReturnTo(String(payload.returnTo ?? '/'))
|
||||
} else {
|
||||
const formData = await request.formData().catch(() => null)
|
||||
code = String(formData?.get('code') ?? '').trim()
|
||||
returnTo = sanitizeMaintenanceReturnTo(String(formData?.get('returnTo') ?? '/'))
|
||||
}
|
||||
|
||||
if (!code) {
|
||||
return redirect(`/maintenance?error=empty&returnTo=${encodeURIComponent(returnTo)}`, 302)
|
||||
|
||||
@@ -62,7 +62,12 @@ const errorMessage =
|
||||
)}
|
||||
</div>
|
||||
|
||||
<form method="post" action="/api/maintenance/unlock" class="space-y-4">
|
||||
<form
|
||||
method="post"
|
||||
action="/api/maintenance/unlock"
|
||||
class="space-y-4"
|
||||
data-maintenance-unlock-form
|
||||
>
|
||||
<input type="hidden" name="returnTo" value={returnTo} />
|
||||
|
||||
<label class="block">
|
||||
@@ -95,5 +100,52 @@ const errorMessage =
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<script>
|
||||
const maintenanceForm = document.querySelector('[data-maintenance-unlock-form]');
|
||||
|
||||
if (maintenanceForm instanceof HTMLFormElement) {
|
||||
maintenanceForm.addEventListener('submit', async (event) => {
|
||||
event.preventDefault();
|
||||
|
||||
const submitButton = maintenanceForm.querySelector('button[type="submit"]');
|
||||
if (submitButton instanceof HTMLButtonElement) {
|
||||
submitButton.disabled = true;
|
||||
}
|
||||
|
||||
try {
|
||||
const formData = new FormData(maintenanceForm);
|
||||
const response = await fetch(maintenanceForm.action, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
credentials: 'same-origin',
|
||||
body: JSON.stringify({
|
||||
code: String(formData.get('code') || ''),
|
||||
returnTo: String(formData.get('returnTo') || '/'),
|
||||
}),
|
||||
});
|
||||
|
||||
window.location.assign(response.url);
|
||||
} catch (error) {
|
||||
console.error('Failed to submit maintenance unlock form:', error);
|
||||
const currentUrl = new URL(window.location.href);
|
||||
const nextUrl = new URL('/maintenance', currentUrl.origin);
|
||||
const returnToValue = new FormData(maintenanceForm).get('returnTo');
|
||||
nextUrl.searchParams.set(
|
||||
'returnTo',
|
||||
String(returnToValue || currentUrl.searchParams.get('returnTo') || '/'),
|
||||
);
|
||||
nextUrl.searchParams.set('error', 'unavailable');
|
||||
window.location.assign(nextUrl.toString());
|
||||
} finally {
|
||||
if (submitButton instanceof HTMLButtonElement) {
|
||||
submitButton.disabled = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user