mirror of
https://github.com/StepanovPlaton/AboutMe.git
synced 2026-04-05 21:30:51 +04:00
Update categories
This commit is contained in:
@@ -6,9 +6,8 @@ backend:
|
||||
base_url: https://stepanovplaton.ru
|
||||
auth_endpoint: oauth
|
||||
|
||||
# Явно указываем site_url для правильного формирования OAuth callback URL
|
||||
# Это предотвращает добавление порта 8091 к OAuth ссылкам
|
||||
site_url: https://stepanovplaton.ru
|
||||
|
||||
media_folder: "public/images"
|
||||
public_folder: "/images"
|
||||
collections:
|
||||
@@ -39,7 +38,7 @@ collections:
|
||||
- { label: "Title", name: "title", widget: "string" }
|
||||
- { label: "Description", name: "description", widget: "text" }
|
||||
- { label: "Image", name: "image", widget: "image", required: false }
|
||||
- { label: "Category", name: "category", widget: "select", options: ["library","ai","software","website","game"] }
|
||||
- { label: "Category", name: "category", widget: "select", options: ["proud","older","other"] }
|
||||
- { label: "Tech Stack", name: "techStack", widget: "list", default: [] }
|
||||
- { label: "Status", name: "status", widget: "select", options: ["completed","in-progress","planned"] }
|
||||
- { label: "Live Demo", name: "liveDemo", widget: "string", required: false }
|
||||
@@ -59,7 +58,7 @@ collections:
|
||||
- { label: "Name", name: "name", widget: "string" }
|
||||
- { label: "Description", name: "description", widget: "text" }
|
||||
- { label: "Icon", name: "icon", widget: "string" }
|
||||
- { label: "Category", name: "category", widget: "select", options: ["ai","backend","client","frontend","database","engines","tools","others"] }
|
||||
- { label: "Category", name: "category", widget: "select", options: ["ai","frontend","backend","native","devops","ide","tools","others"] }
|
||||
- { label: "Level", name: "level", widget: "select", options: ["beginner","intermediate","advanced","expert"] }
|
||||
- label: "Experience"
|
||||
name: "experience"
|
||||
|
||||
97
public/admin/index.html
Normal file
97
public/admin/index.html
Normal file
@@ -0,0 +1,97 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Content Manager</title>
|
||||
<script>
|
||||
// КРИТИЧНО: Переопределяем window.location.origin ПЕРЕД загрузкой DecapCMS
|
||||
// Это гарантирует, что DecapCMS будет использовать правильный URL без порта 8091
|
||||
(function() {
|
||||
const correctOrigin = 'https://stepanovplaton.ru';
|
||||
const originalLocation = window.location;
|
||||
|
||||
// Сохраняем оригинальные значения
|
||||
const originalOrigin = originalLocation.origin;
|
||||
const originalHref = originalLocation.href;
|
||||
|
||||
// Переопределяем window.location.origin
|
||||
try {
|
||||
Object.defineProperty(window.location, 'origin', {
|
||||
get: function() {
|
||||
// Если origin содержит порт 8091, возвращаем правильный origin
|
||||
if (originalOrigin.includes(':8091')) {
|
||||
return correctOrigin;
|
||||
}
|
||||
// Иначе возвращаем оригинальный origin, но без порта если это стандартный порт
|
||||
const origin = originalOrigin;
|
||||
if (origin.startsWith('http://') && origin.endsWith(':8091')) {
|
||||
return origin.replace(':8091', '');
|
||||
}
|
||||
if (origin.startsWith('https://') && origin.endsWith(':8091')) {
|
||||
return origin.replace(':8091', '');
|
||||
}
|
||||
return origin;
|
||||
},
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
});
|
||||
|
||||
// Также переопределяем host для полной совместимости
|
||||
Object.defineProperty(window.location, 'host', {
|
||||
get: function() {
|
||||
const host = originalLocation.host;
|
||||
if (host.includes(':8091')) {
|
||||
return host.replace(':8091', '');
|
||||
}
|
||||
return host;
|
||||
},
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
});
|
||||
|
||||
// Переопределяем hostname
|
||||
Object.defineProperty(window.location, 'hostname', {
|
||||
get: function() {
|
||||
return 'stepanovplaton.ru';
|
||||
},
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
});
|
||||
|
||||
// Переопределяем port
|
||||
Object.defineProperty(window.location, 'port', {
|
||||
get: function() {
|
||||
return '';
|
||||
},
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
});
|
||||
|
||||
// Переопределяем protocol
|
||||
Object.defineProperty(window.location, 'protocol', {
|
||||
get: function() {
|
||||
return 'https:';
|
||||
},
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
});
|
||||
|
||||
console.log('[DecapCMS Fix] Переопределен window.location.origin:', originalOrigin, '→', correctOrigin);
|
||||
} catch (e) {
|
||||
console.error('[DecapCMS Fix] Ошибка при переопределении location:', e);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<script src="https://unpkg.com/decap-cms@^3.0.0/dist/decap-cms.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
// Проверка после загрузки
|
||||
window.addEventListener('load', function() {
|
||||
console.log('[DecapCMS Fix] Загружено. Текущий origin:', window.location.origin);
|
||||
console.log('[DecapCMS Fix] Текущий host:', window.location.host);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -51,7 +51,7 @@ let currentTime = $state(0);
|
||||
// 歌曲总时长
|
||||
let duration = $state(0);
|
||||
// 音量
|
||||
let volume = $state(0.5);
|
||||
let volume = $state(0.15);
|
||||
// 是否静音
|
||||
let isMuted = $state(false);
|
||||
// 是否正在加载
|
||||
|
||||
@@ -70,9 +70,8 @@ enum I18nKey {
|
||||
projects = "projects",
|
||||
projectsSubtitle = "projectsSubtitle",
|
||||
projectsAll = "projectsAll",
|
||||
projectsWeb = "projectsWeb",
|
||||
projectsMobile = "projectsMobile",
|
||||
projectsDesktop = "projectsDesktop",
|
||||
projectsProud = "projectsProud",
|
||||
projectsOlder = "projectsOlder",
|
||||
projectsOther = "projectsOther",
|
||||
projectTechStack = "projectTechStack",
|
||||
projectLiveDemo = "projectLiveDemo",
|
||||
@@ -95,11 +94,11 @@ enum I18nKey {
|
||||
skills = "skills",
|
||||
skillsSubtitle = "skillsSubtitle",
|
||||
skillsAI = "skillsAI",
|
||||
skillsBackend = "skillsBackend",
|
||||
skillsClient = "skillsClient",
|
||||
skillsFrontend = "skillsFrontend",
|
||||
skillsDatabase = "skillsDatabase",
|
||||
skillsEngines = "skillsEngines",
|
||||
skillsBackend = "skillsBackend",
|
||||
skillsNative = "skillsNative",
|
||||
skillsDevOps = "skillsDevOps",
|
||||
skillsIDE = "skillsIDE",
|
||||
skillsTools = "skillsTools",
|
||||
skillsOthers = "skillsOthers",
|
||||
skillLevel = "skillLevel",
|
||||
|
||||
@@ -73,10 +73,9 @@ export const ru: Translation = {
|
||||
[Key.projects]: "Проекты",
|
||||
[Key.projectsSubtitle]: "Мое портфолио проектов",
|
||||
[Key.projectsAll]: "Все",
|
||||
[Key.projectsWeb]: "Веб-приложения",
|
||||
[Key.projectsMobile]: "Мобильные приложения",
|
||||
[Key.projectsDesktop]: "Десктопные приложения",
|
||||
[Key.projectsOther]: "Другое",
|
||||
[Key.projectsProud]: "Проекты, которыми я горжусь",
|
||||
[Key.projectsOlder]: "Более старые проекты, которые показывают мой путь",
|
||||
[Key.projectsOther]: "Прочие начинания",
|
||||
[Key.projectTechStack]: "Технологический стек",
|
||||
[Key.projectLiveDemo]: "Живая демонстрация",
|
||||
[Key.projectSourceCode]: "Исходный код",
|
||||
@@ -97,14 +96,14 @@ export const ru: Translation = {
|
||||
// Страница навыков
|
||||
[Key.skills]: "Навыки",
|
||||
[Key.skillsSubtitle]: "Мои технические навыки и экспертиза",
|
||||
[Key.skillsAI]: "AI разработка",
|
||||
[Key.skillsBackend]: "Backend разработка",
|
||||
[Key.skillsClient]: "Client разработка",
|
||||
[Key.skillsFrontend]: "Frontend разработка",
|
||||
[Key.skillsDatabase]: "База данных",
|
||||
[Key.skillsEngines]: "Движки",
|
||||
[Key.skillsTools]: "Инструменты разработки",
|
||||
[Key.skillsOthers]: "Другие навыки",
|
||||
[Key.skillsAI]: "ИИ",
|
||||
[Key.skillsFrontend]: "Frontend",
|
||||
[Key.skillsBackend]: "Backend",
|
||||
[Key.skillsNative]: "Native",
|
||||
[Key.skillsDevOps]: "DevOps",
|
||||
[Key.skillsIDE]: "IDE",
|
||||
[Key.skillsTools]: "Инструменты",
|
||||
[Key.skillsOthers]: "Прочее",
|
||||
[Key.skillLevel]: "Уровень владения",
|
||||
[Key.skillLevelBeginner]: "Начинающий",
|
||||
[Key.skillLevelIntermediate]: "Средний",
|
||||
|
||||
@@ -44,12 +44,10 @@ const projectsByCategory = categories.reduce(
|
||||
// 获取分类文本的国际化翻译
|
||||
const getCategoryText = (category: string) => {
|
||||
switch (category) {
|
||||
case "web":
|
||||
return i18n(I18nKey.projectsWeb);
|
||||
case "mobile":
|
||||
return i18n(I18nKey.projectsMobile);
|
||||
case "desktop":
|
||||
return i18n(I18nKey.projectsDesktop);
|
||||
case "proud":
|
||||
return i18n(I18nKey.projectsProud);
|
||||
case "older":
|
||||
return i18n(I18nKey.projectsOlder);
|
||||
case "other":
|
||||
return i18n(I18nKey.projectsOther);
|
||||
case UNCATEGORIZED:
|
||||
|
||||
@@ -45,16 +45,16 @@ const getCategoryText = (category: string) => {
|
||||
switch (category) {
|
||||
case "ai":
|
||||
return i18n(I18nKey.skillsAI);
|
||||
case "server":
|
||||
return i18n(I18nKey.skillsBackend);
|
||||
case "client":
|
||||
return i18n(I18nKey.skillsClient);
|
||||
case "web":
|
||||
case "frontend":
|
||||
return i18n(I18nKey.skillsFrontend);
|
||||
case "database":
|
||||
return i18n(I18nKey.skillsDatabase);
|
||||
case "engines":
|
||||
return i18n(I18nKey.skillsEngines);
|
||||
case "backend":
|
||||
return i18n(I18nKey.skillsBackend);
|
||||
case "native":
|
||||
return i18n(I18nKey.skillsNative);
|
||||
case "devops":
|
||||
return i18n(I18nKey.skillsDevOps);
|
||||
case "ide":
|
||||
return i18n(I18nKey.skillsIDE);
|
||||
case "tools":
|
||||
return i18n(I18nKey.skillsTools);
|
||||
case "others":
|
||||
|
||||
@@ -7,7 +7,7 @@ export interface Project {
|
||||
title: string;
|
||||
description: string;
|
||||
image: string;
|
||||
category: "library" | "ai" | "software" | "website" | "game";
|
||||
category: "proud" | "older" | "other";
|
||||
techStack: string[];
|
||||
status: "completed" | "in-progress" | "planned";
|
||||
demoUrl?: string;
|
||||
|
||||
@@ -7,7 +7,7 @@ export interface Skill {
|
||||
name: string;
|
||||
description: string;
|
||||
icon: string; // Iconify icon name
|
||||
category: "ai" | "backend" | "client" | "frontend" | "database" | "engines" | "tools" | "others";
|
||||
category: "ai" | "frontend" | "backend" | "native" | "devops" | "ide" | "tools" | "others";
|
||||
level: "beginner" | "intermediate" | "advanced" | "expert";
|
||||
experience: {
|
||||
years: number;
|
||||
@@ -35,12 +35,12 @@ export const getSkillStats = () => {
|
||||
};
|
||||
const byCategory = {
|
||||
ai: skillsData.filter((s) => s.category === "ai").length,
|
||||
backend: skillsData.filter((s) => s.category === "backend").length,
|
||||
client: skillsData.filter((s) => s.category === "client").length,
|
||||
frontend: skillsData.filter((s) => s.category === "frontend").length,
|
||||
database: skillsData.filter((s) => s.category === "database").length,
|
||||
backend: skillsData.filter((s) => s.category === "backend").length,
|
||||
native: skillsData.filter((s) => s.category === "native").length,
|
||||
devops: skillsData.filter((s) => s.category === "devops").length,
|
||||
ide: skillsData.filter((s) => s.category === "ide").length,
|
||||
tools: skillsData.filter((s) => s.category === "tools").length,
|
||||
engines: skillsData.filter((s) => s.category === "engines").length,
|
||||
others: skillsData.filter((s) => s.category === "others").length,
|
||||
};
|
||||
return { total, byLevel, byCategory };
|
||||
|
||||
Reference in New Issue
Block a user