add market-page layouts, v1 for endpoints
This commit is contained in:
@@ -12,7 +12,7 @@ export async function logout() {
|
||||
const token = await getSessionData('token');
|
||||
|
||||
try {
|
||||
await fetch(`${API_BASE_URL}/api/auth/logout`, {
|
||||
await fetch(`${API_BASE_URL}v1/api/auth/logout`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
@@ -43,7 +43,7 @@ export async function authorization(
|
||||
|
||||
try {
|
||||
const { email, password } = validatedFields.data;
|
||||
const response = await fetch(`${API_BASE_URL}/api/auth/login`, {
|
||||
const response = await fetch(`${API_BASE_URL}v1/api/auth/login`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
email: email,
|
||||
@@ -100,7 +100,7 @@ export async function registration(
|
||||
|
||||
try {
|
||||
const { full_name, email, password } = validatedFields.data;
|
||||
const response = await fetch(`${API_BASE_URL}/api/auth/register`, {
|
||||
const response = await fetch(`${API_BASE_URL}v1/api/auth/register`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({ fullName: full_name, email, password }),
|
||||
headers: {
|
||||
|
||||
@@ -36,7 +36,7 @@ export async function getUserData() {
|
||||
const token = await getSessionData('token');
|
||||
|
||||
try {
|
||||
const response = await fetch(`${API_BASE_URL}/api/user?email=${userEmail}`, {
|
||||
const response = await fetch(`${API_BASE_URL}v1/api/user?email=${userEmail}`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
import ProtectedFilesTable from '@/app/ui/marking-page/protected-files-table';
|
||||
import ProtectionSummary from '@/app/ui/marking-page/protection-summary';
|
||||
import TestSection from '@/app/ui/marking-page/test-section';
|
||||
import UploadSection from '@/app/ui/marking-page/upload-section';
|
||||
|
||||
export default function Page() {
|
||||
return (
|
||||
<div>
|
||||
<h1 className="page-title">🛡️ Защита изображений</h1>
|
||||
<ProtectionSummary />
|
||||
<UploadSection />
|
||||
<TestSection />
|
||||
<ProtectedFilesTable />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
@use './settings.scss';
|
||||
@use './payment-container.scss';
|
||||
@use './reports.scss';
|
||||
@use './marking-pages.scss';
|
||||
|
||||
.btn {
|
||||
padding: 12px 24px;
|
||||
|
||||
@@ -17,4 +17,11 @@ a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4 {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
@import "tailwindcss";
|
||||
@@ -0,0 +1,129 @@
|
||||
.protection-summary {
|
||||
background: linear-gradient(135deg, #e8f5e8, #c8e6c9);
|
||||
border: 2px solid #4caf50;
|
||||
border-radius: 15px;
|
||||
padding: 20px;
|
||||
margin-bottom: 25px;
|
||||
text-align: center;
|
||||
|
||||
h3 {
|
||||
color: #2e7d32;
|
||||
margin-bottom: 15px;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.protection-stats {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
||||
gap: 15px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.stat-card {
|
||||
background: rgba(255, 255, 255, 0.8);
|
||||
padding: 15px;
|
||||
border-radius: 10px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.stat-number {
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
color: #2e7d32;
|
||||
}
|
||||
|
||||
.stat-label {
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.upload-section {
|
||||
background: white;
|
||||
border-radius: 20px;
|
||||
padding: 30px;
|
||||
margin-bottom: 30px;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
|
||||
|
||||
h3 {
|
||||
margin-bottom: 20px;
|
||||
color: #111827;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.drag-drop-zone {
|
||||
border: 3px dashed #6366f1;
|
||||
border-radius: 15px;
|
||||
padding: 40px 20px;
|
||||
text-align: center;
|
||||
background: linear-gradient(135deg, #f0f9ff, #e0f2fe);
|
||||
margin-bottom: 20px;
|
||||
transition: all 0.3s ease;
|
||||
|
||||
h4 {
|
||||
color: #6366f1;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
p {
|
||||
color: #6b7280;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: linear-gradient(45deg, #6566f1, #01579b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.test-section {
|
||||
background: linear-gradient(135deg, #fff3e0, #ffe0b2);
|
||||
border-radius: 20px;
|
||||
padding: 30px;
|
||||
margin-bottom: 30px;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
|
||||
|
||||
h3 {
|
||||
margin-bottom: 20px;
|
||||
color: #e65100;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.test-section-content {
|
||||
border: 2px dashed #ff9800;
|
||||
border-radius: 10px;
|
||||
padding: 20px;
|
||||
text-align: center;
|
||||
background: #fff8e1;
|
||||
|
||||
h4 {
|
||||
font-size: 32px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.btn {
|
||||
background: linear-gradient(45deg, #ff9800, #f57c00);
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 15px;
|
||||
font-size: 12px;
|
||||
color: #e65100;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.protected-files-table {
|
||||
background: white;
|
||||
border-radius: 15px;
|
||||
overflow: hidden;
|
||||
margin-top: 30px;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
|
||||
|
||||
h3 {
|
||||
padding: 20px 20px 0;
|
||||
color: #111827;
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,6 @@
|
||||
margin-bottom: 16px;
|
||||
color: #1e293b;
|
||||
font-size: 1.15rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -306,7 +305,6 @@
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 1.1rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.secure-payments-grid {
|
||||
@@ -328,7 +326,6 @@
|
||||
color: #1e293b;
|
||||
margin-bottom: 6px;
|
||||
font-size: 0.95rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
p {
|
||||
|
||||
@@ -196,7 +196,6 @@
|
||||
color: #1e40af;
|
||||
margin-bottom: 10px;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
p {
|
||||
@@ -263,14 +262,12 @@
|
||||
h3 {
|
||||
color: #dc2626;
|
||||
margin-bottom: 15px;
|
||||
font-weight: bold;
|
||||
font-size: 1.17em;
|
||||
}
|
||||
|
||||
h4 {
|
||||
color: #991b1b;
|
||||
margin-bottom: 10px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
p {
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
export default function ProtectedFilesTable() {
|
||||
return (
|
||||
<div className="protected-files-table">
|
||||
<h3>
|
||||
📋 Защищенные изображения (0)
|
||||
</h3>
|
||||
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ФАЙЛ</th>
|
||||
<th>РАЗМЕР</th>
|
||||
<th>ЗАЩИТА</th>
|
||||
<th>ДАТА</th>
|
||||
<th>ДЕЙСТВИЯ</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<div>
|
||||
<div>
|
||||
🛡️
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
Screenshot 2025-11-13 at 10.20.14.p...
|
||||
</div>
|
||||
<div>
|
||||
ПОЛНАЯ ЗАЩИТА
|
||||
<span className="real-protection-badge">
|
||||
ВСЕ МОДУЛИ
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
1.93 МБ
|
||||
</td>
|
||||
<td>
|
||||
<div>
|
||||
<div>
|
||||
<div></div>
|
||||
</div>
|
||||
<span>
|
||||
100%
|
||||
</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
27.11.2025 10:16
|
||||
</td>
|
||||
<td>
|
||||
<button className="btn btn-secondary">
|
||||
📥 Скачать
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
export default function ProtectionSummary() {
|
||||
return (
|
||||
<div className="protection-summary">
|
||||
<h3>📊 Статистика защиты</h3>
|
||||
<div className="protection-stats">
|
||||
<div className="stat-card">
|
||||
<div className="stat-number">0</div>
|
||||
<div className="stat-label">Всего файлов</div>
|
||||
</div>
|
||||
<div className="stat-card">
|
||||
<div className="stat-number">0</div>
|
||||
<div className="stat-label">Защищено</div>
|
||||
</div>
|
||||
<div className="stat-card">
|
||||
<div className="stat-number">0</div>
|
||||
<div className="stat-label">Изображений</div>
|
||||
</div>
|
||||
<div className="stat-card">
|
||||
<div className="stat-number">100%</div>
|
||||
<div className="stat-label">Уровень защиты</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
export default function TestSection() {
|
||||
return (
|
||||
<div className="test-section">
|
||||
<h3>
|
||||
🔍 Проверить защиту изображения
|
||||
</h3>
|
||||
<div className="test-section-content">
|
||||
<h4>
|
||||
🔍
|
||||
</h4>
|
||||
<button className="btn btn-primary">
|
||||
🔍 Выбрать изображение для анализа
|
||||
</button>
|
||||
<p>
|
||||
При обнаружении защиты будет показана полная информация о владельце (WEBP НЕ поддерживается)
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
export default function UploadSection() {
|
||||
return (
|
||||
<div className="upload-section">
|
||||
<h3>
|
||||
📷 Загрузить изображение для защиты
|
||||
</h3>
|
||||
<div className="drag-drop-zone">
|
||||
<div className="text-[48px] mb-[15px]">🛡️</div>
|
||||
<h4>
|
||||
Перетащите изображения сюда
|
||||
</h4>
|
||||
<p>
|
||||
Размер: 150x150 - 4000x4000 пикселей, форматы: JPG, PNG, GIF, BMP (WEBP НЕ поддерживается)
|
||||
</p>
|
||||
<button className="btn btn-primary">
|
||||
🛡️ Выбрать файлы для защиты
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -15,7 +15,7 @@ export default function DropDownList() {
|
||||
const links = [
|
||||
{
|
||||
name: 'Маркировка фото',
|
||||
href: '/pages/emptypage'
|
||||
href: '/pages/marking-photo'
|
||||
},
|
||||
{
|
||||
name: 'Маркировка видео',
|
||||
|
||||
Reference in New Issue
Block a user