modified: log/access_blogbaster.log

modified:   src/app/globals.css
	modified:   src/pages/api/log.ts
	modified:   src/pages/log.tsx
master
joker 2 years ago
parent ed689b3825
commit 884eb74a26
  1. 5682
      log/access_blogbaster.log
  2. 8
      src/app/globals.css
  3. 3
      src/pages/api/log.ts
  4. 46
      src/pages/log.tsx

File diff suppressed because it is too large Load Diff

@ -8,14 +8,6 @@
--background-end-rgb: 255, 255, 255; --background-end-rgb: 255, 255, 255;
} }
@media (prefers-color-scheme: dark) {
:root {
--foreground-rgb: 255, 255, 255;
--background-start-rgb: 0, 0, 0;
--background-end-rgb: 0, 0, 0;
}
}
body { body {
color: rgb(var(--foreground-rgb)); color: rgb(var(--foreground-rgb));
background: linear-gradient( background: linear-gradient(

@ -4,12 +4,13 @@ import type { NextApiRequest, NextApiResponse } from 'next';
// Путь к лог-файлу доступа Nginx // Путь к лог-файлу доступа Nginx
const logFilePath = '@../../log/access_blogbaster.log'; const logFilePath = '@../../log/access_blogbaster.log';
let log: string[] = [];
export default function handler( export default function handler(
req: NextApiRequest, req: NextApiRequest,
res: NextApiResponse res: NextApiResponse
) { ) {
let log: string[] = [];
// Чтение лог-файла // Чтение лог-файла
fs.readFile(logFilePath, 'utf8', (err, data) => { fs.readFile(logFilePath, 'utf8', (err, data) => {
if (err) throw err; if (err) throw err;

@ -1,4 +1,8 @@
"use client";
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
// These styles apply to every route in the application
import '../app/globals.css'
type LogData = { type LogData = {
fileName: string; fileName: string;
@ -8,8 +12,39 @@ type LogData = {
const LogTable: React.FC = () => { const LogTable: React.FC = () => {
const [logData, setLogData] = useState<LogData[]>([]); const [logData, setLogData] = useState<LogData[]>([]);
const translationDict = {
'to_africa_for_gold.mp3': 'В Африку за золотом',
'event_industry_in_action.mp3': 'Event - индустрия в действии. Как стоить империю в этой сфере и сколько можно заработать',
'i_live_the_way_I_want_I_also_earn.mp3':'Живу как хочу, ещё и зарабатываю. Как стать ведущим',
'Your-opportunities-today.mp3':'Твои возможности сегодня',
'Taurida_What-can-you-learn-on-the-Black-Sea-coast.mp3':'Таврида. Чему можно научиться на берегу Черного моря',
'Digital_communications_and_youth.mp3':'Цифровые коммуникации и молодежь',
'Special-issue-How-%D1%81loser-the-grant.mp3':'Спецвыпуск «Как выиграть грант»',
'Pass_exam_without_fear.mp3':'Как сдать экзамен без страха',
'where-to-go-this-summer.mp3':'Дайджест: куда поехать этим летом?',
'Fears_and_living_with_them.mp3':'Страхи и жизнь с ними',
'Страхи и жизнь с ними':'Спецвыпуск подкаста в Дубраве',
'what_to_watch.mp3':'Что посмотреть?',
'FoodWhatHowAndWhereDoWeEat.mp3':'Еда. Что, как и где мы едим?',
'WhatGearDoYouWearAndWhereToBuyIt.mp3':'Какой шмот ты носишь и где его покупать?',
'Lets_go_Why_Argentina.mp3':'Почему Аргентина?',
'Money_cards_and_black_dollar_exchange_rat.mp3':'Аргентина: деньги, карты и чёрный курс доллара',
'Argentina-What-for-what.mp3':'Аргентина: Что почем?',
'Make_money_on_a_childhood_dream_Aeromodelling_centers.mp3':'Заработать на мечте детства? Центры авиамоделирования',
'is_it_possible_to_make_money_on_tricks.mp3':'Можно ли заработать на фокусах?',
'Like_to_listen_in_Dubrava.mp3':'Спецвыпуск подкаста в Дубраве',
// Добавьте другие пары английское/русское название при необходимости
};
const englishFileNameToFind = 'event_industry_in_action.mp3';
const russianTranslation = translationDict[englishFileNameToFind];
console.log(russianTranslation);
useEffect(() => { useEffect(() => {
fetch('/api/log') // Обращаемся к REST API fetch('/api/log')
.then((response) => response.json()) .then((response) => response.json())
.then((data: string[]) => { .then((data: string[]) => {
const parsedData: LogData[] = data.map((item: string) => { const parsedData: LogData[] = data.map((item: string) => {
@ -21,10 +56,15 @@ const LogTable: React.FC = () => {
}); });
}, []); }, []);
// Добавляем useEffect для обновления данных при изменении logData
useEffect(() => {
// Можете добавить здесь дополнительную логику, если необходимо
}, [logData]);
return ( return (
<div className="m-3 card lg:card-side bg-base-100 shadow-xl"> <div className="m-3 card lg:card-side bg-base-100 shadow-xl">
<div className="flex flex-col items-center bg-white border border-gray-200 rounded-lg shadow md:flex-row "> <div className="flex flex-col items-center bg-white border border-gray-200 rounded-lg shadow md:flex-row ">
<div className="mb-3 object-cover rounded-t-lg md:w-auto md:min-w-64 md:max-w-64 md:rounded-s-lg md:m-3"> <div className="mb-3 object-cover rounded-t-lg md:w-auto md:min-w-64 md:max-w-96 md:rounded-s-lg md:m-3">
<div> <div>
<h2>Статистика доступа к mp3 файлам</h2> <h2>Статистика доступа к mp3 файлам</h2>
<div className="container mx-auto p-6"> <div className="container mx-auto p-6">
@ -33,6 +73,7 @@ const LogTable: React.FC = () => {
<tr> <tr>
<th className="py-2 px-4 border-b"></th> <th className="py-2 px-4 border-b"></th>
<th className="py-2 px-4 border-b">Имя файла</th> <th className="py-2 px-4 border-b">Имя файла</th>
<th className="py-2 px-4 border-b">Подкаст</th>
<th className="py-2 px-4 border-b">Количество доступов</th> <th className="py-2 px-4 border-b">Количество доступов</th>
</tr> </tr>
</thead> </thead>
@ -41,6 +82,7 @@ const LogTable: React.FC = () => {
<tr key={index}> <tr key={index}>
<td className="py-2 px-4 border-b">{index + 1}</td> <td className="py-2 px-4 border-b">{index + 1}</td>
<td className="py-2 px-4 border-b">{item.fileName}</td> <td className="py-2 px-4 border-b">{item.fileName}</td>
<td className="py-2 px-4 border-b">{translationDict[item.fileName]}</td>
<td className="py-2 px-4 border-b">{item.accessCount}</td> <td className="py-2 px-4 border-b">{item.accessCount}</td>
</tr> </tr>
))} ))}

Loading…
Cancel
Save