{fullName}
+{employee.position?.name || 'Не указана'}
+diff --git a/DOCKER_ORCHESTRATION.md b/DOCKER_ORCHESTRATION.md index 4f7a5693..f1abcf74 100644 --- a/DOCKER_ORCHESTRATION.md +++ b/DOCKER_ORCHESTRATION.md @@ -285,5 +285,5 @@ docker-compose ps --- -**Дата создания**: 19 февраля 2025 +**Дата создания**: 19 февраля 2025 **Версия**: 1.0 diff --git a/corp.front/.dockerignore b/corp.front/.dockerignore new file mode 100644 index 00000000..13e59b48 --- /dev/null +++ b/corp.front/.dockerignore @@ -0,0 +1,35 @@ +# Dependencies +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Next.js +.next/ +out/ +build +dist + +# Environment +.env*.local +.env + +# Testing +coverage + +# Misc +.DS_Store +*.pem + +# Debug +*.log + +# IDE +.vscode +.idea +*.swp +*.swo +*~ + +# Vercel +.vercel diff --git a/corp.front/.env.example b/corp.front/.env.example new file mode 100644 index 00000000..f0f5164d --- /dev/null +++ b/corp.front/.env.example @@ -0,0 +1,5 @@ +# Backend API URL +NEXT_PUBLIC_API_URL=http://localhost:8000 + +# WebSocket URL for real-time features +NEXT_PUBLIC_WS_URL=ws://localhost:8000 diff --git a/corp.front/Dockerfile b/corp.front/Dockerfile new file mode 100644 index 00000000..75ed2dd4 --- /dev/null +++ b/corp.front/Dockerfile @@ -0,0 +1,48 @@ +# Build stage +FROM node:20-alpine AS builder + +WORKDIR /app + +# Copy package files +COPY package.json package-lock.json* ./ +RUN npm ci + +# Copy source files +COPY . . + +# Set environment variables for build +ENV NEXT_TELEMETRY_DISABLED=1 +ENV NODE_ENV=production + +# Build the application +RUN npm run build + +# Production stage +FROM node:20-alpine AS runner + +WORKDIR /app + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +# Copy necessary files from builder +COPY --from=builder /app/public ./public +COPY --from=builder /app/.next ./.next +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/package.json ./package.json + +# Set correct permissions +RUN chown -R nextjs:nodejs /app + +USER nextjs + +EXPOSE 3000 + +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" + +# Start Next.js server +CMD ["npm", "start"] diff --git a/corp.front/INTEGRATION_GUIDE.md b/corp.front/INTEGRATION_GUIDE.md new file mode 100644 index 00000000..31c6835d --- /dev/null +++ b/corp.front/INTEGRATION_GUIDE.md @@ -0,0 +1,410 @@ +# Frontend Integration Guide + +## Обзор + +Фронтенд corp.front полностью интегрирован с Django Backend через REST API. Используется Next.js 16 с TypeScript и Tailwind CSS. + +## Структура проекта + +``` +corp.front/ +├── src/ +│ ├── app/ # Next.js страницы +│ │ ├── page.tsx # Главная (Лента) ✅ Интегрирован +│ │ ├── employees/ # Сотрудники ✅ Интегрирован +│ │ ├── departments/ # Отделы +│ │ ├── documents/ # Документы +│ │ ├── messages/ # Сообщения +│ │ ├── requests/ # Заявки +│ │ ├── finances/ # Финансы +│ │ └── login/ # Вход +│ ├── lib/ +│ │ └── api.ts # API клиент ✅ +│ ├── types/ +│ │ └── api.ts # TypeScript типы ✅ +│ └── hooks/ +│ └── useApi.ts # React хуки для API ✅ +``` + +## API клиент + +### Базовая конфигурация + +API клиент автоматически: +- Добавляет JWT токен к запросам +- Обрабатывает ошибки авторизации +- Сохраняет токены в localStorage +- Перенаправляет на /login при 401 + +### Использование + +```typescript +import apiClient from '@/lib/api'; + +// Авторизация +const { access, refresh, user } = await apiClient.login({ + username: 'user@example.com', + password: 'password' +}); + +// Получение данных +const employees = await apiClient.getEmployees(); +const posts = await apiClient.getPosts(); +``` + +## React хуки + +Используйте готовые хуки из `@/hooks/useApi`: + +```tsx +import { useCurrentUser, useEmployees, usePosts } from '@/hooks/useApi'; + +function MyComponent() { + const { user, loading, error } = useCurrentUser(); + const { employees } = useEmployees({ search: 'John' }); + const { posts } = usePosts({ page: 1 }); + + if (loading) return
{error.message}
+ +
+ Команда
+Загрузка сотрудников...
+Ошибка загрузки: {error.message}
+Сотрудники не найдены
+{fullName}
+{employee.position?.name || 'Не указана'}
++ Используйте учетные данные LDAP для входа +
+ + + + + ++ Для входа используйте корпоративные учетные данные +
+
+
+ Загрузка...
+Ошибка загрузки: {error.message}
+Проверьте подключение к серверу
+Нет постов в ленте
+{post.author.first_name} {post.author.last_name}
+{formatTimeAgo(post.created_at)}
+{post.content}
+ {post.tags && post.tags.length > 0 && ( ++ Создайте новый аккаунт, указав имя и контактные данные. +
+ + + ++ Регистрируясь, вы принимаете условия использования и подтверждаете ознакомление с политикой конфиденциальности. +
+Загрузка...
+{error}
+{employee.name}
-{employee.role}
+{fullName}
+{position}