Текущая ззадача
доработай # Структура хранимых данных ## Описание всех хранимых объектов
взяв за основу объёкт записи блога:
{
_id: "blog_post_season_opening_2024_borbad"
type: "blog_post"
domain: ["borbad.s5l.ru", "global"] # определяет приоритет доменов по порядку
language: ["ru","en"]
title: ["Открытие нового сезона 2024","Opening of the new season 2024"]
content: ["# Добро пожаловать в новый творческий сезон!...","# Welcome to the new creative season!..."]
excerpt: ["Новый творческий сезон 2024 года в концертном зале Борбад","A new creative season in 2024 at the Borbad Concert Hall"]
seo: {
description: ["Концертный зал Борбад - культурный центр Душанбе","Borbad Concert Hall - Dushanbe Cultural Center"]
keywords: [["концерты", "мероприятия", "Душанбе", "культура"],["concerts", "events", "Dushanbe", "culture"]]
}
image: ["/assets/borbad.s5l.ru/events/beethoven-concert.jpg","/assets/borbad.s5l.ru/events/beethoven-concert.jpg"]
gallery: [[
"/assets/borbad.s5l.ru/gallery/concert1.jpg"
"/assets/borbad.s5l.ru/gallery/concert2.jpg"
],[
"/assets/borbad.s5l.ru/gallery/concert1.jpg"
"/assets/borbad.s5l.ru/gallery/concert2.jpg"
]]
tags: [["новости", "сезон", "анонс"],["news", "season", "announcement"]]
category_id: "category_news_borbad" # ID конечной категории
category_path: ["category_news_borbad"] # Полный путь категории
author: ["Администрация Борбад","Borbad Administration"]
status: "published"
featured: true
created_at: "2024-01-15T10:00:00.000Z"
updated_at: "2024-01-15T10:00:00.000Z"
published_at: "2024-01-15T10:00:00.000Z"
views: 156
}
Отальные оъекты переделать по данному примеру, приэтом объекты товаров событий и слайдеров, будут объектами которые хранять только дополнительные поля к документу блогу.
файл с правилами
https://gogs.osvoj.ru/s5l.ru/borbad.s5l.ru/raw/master/README.md
применяй правила:
оформление ссылок
a(href="[ссылка]") - не правильно
router-link(to="[ссылка]") - не правильно
app-link(to="[ссылка]") - правильно (должен быть подключен компанент: 'app-link': require 'app/shared/AppLink')
Корневой каталог и мета данные
Важно: мета данные добавляются через app/temp.coffe
базовым тегоьм для vuejs является body, app/index.pug начинается с div,
теги html, head, body ЗАПРЕЩЕНО использовать.
пример кода app/temp.coffee
# обязательно подключение глобальных массивов
globalThis.renderFns = require 'pug.json'
globalThis.stylFns = require 'styl.json'
# подключение мета информации (строго в данном фиде)
document.head.insertAdjacentHTML 'beforeend','<meta charset="UTF-8">'
document.head.insertAdjacentHTML 'beforeend','<meta name="viewport" content="width=device-width, initial-scale=1.0">'
document.head.insertAdjacentHTML('beforeend','<title> Кохи Борбад - Концертный зал Душанбе</title>')
# Настройка tailwind
tailwind.config = require 'tailwind.config.js'
# подключение основных стилей
## tailwind
document.head.insertAdjacentHTML('beforeend','<style type="text/tailwindcss" page="main">'+stylFns['main.css']+'</style>')
## базовой стиль приложения
document.head.insertAdjacentHTML('beforeend','<style type="text/tailwindcss" page="root">'+stylFns['app/temp.styl']+'</style>')
# Маршруты
routes = [
{ path: '/', component: require 'app/pages/Home' }
{ path: '/events', component: require 'app/pages/Events' }
{ path: '/about', component: require 'app/pages/About' }
{ path: '/contacts', component: require 'app/pages/Contacts' }
]
# Глобальное определение vuejs приложения
app = Vue.createApp
name: 'app'
data: ()->
return {
appState:
events: []
featuredEvents: []
sliderEvents: []
loading: true
error: null
modalState: #управление модальными окнами
isVisible: false
component: null
props: {}
couchDBService: new CouchDBService()
}
beforeMount: ()->
debug.log "start beforeMount"
# определение контекста vuejs приложения как глобальной переменной _
globalThis._ = @
# все глобальные переменные необходимые для работы определяем в data
# и получаем доступ через _.*
render: (new Function '_ctx', '_cache', renderFns['app/temp.pug'])()
mounted: ->{}
methods: {}
components:
'themetoggle': require 'app/shared/ThemeToggle'
'multilevelmenu': require 'app/shared/MultiLevelMenu'
'imageslider': require 'app/shared/ImageSlider'
app.use(VueRouter.createRouter({
routes: routes
history: VueRouter.createWebHistory()
scrollBehavior: (to, from, savedPosition) ->
if savedPosition
return savedPosition
else
return { x: 0, y: 0 }
}))
# подключаем в body ОБЯЗАТЕЛЬНО!!!
app.mount('body')
Привер кода index.coffee для компанентов/страниц
# Важно загрузка стилей компонента/страницы
document.head.insertAdjacentHTML('beforeend','<style type="text/tailwindcss" page="Blog">'+stylFns['app/pages/Blog/index.styl']+'</style>')
module.exports =
name: 'BlogPage'
# ВАЖНО загрузка шаблона через рендер функцию
render: (new Function '_ctx', '_cache', renderFns['app/pages/Blog/index.pug'])()
data: ->
posts: []
loading: true
error: null
beforeMount: ->
@loadBlogPosts()
methods:
loadBlogPosts: ->
try
@loading = true
@posts = await AppDB.getBlogPosts(limit: 10)
@loading = false
catch error
@error = "Ошибка загрузки постов: "+error
@loading = false
определение функций в _deing документе
при обновлении документа учитывай версионность
# Design документ для блог постов
blog_posts:
version: "1.1"
views:
# Все опубликованные блог посты
published:
map: ((doc) ->
if doc.type is 'blog_post' and doc.status is 'published'
emit(doc.created_at, doc)).toString()
Важно сохранять для seed-events.coffee
debug = require('../../../utils/coffee/debug.coffee').default
определение шаблонов для слотов
template(#body) - не правильно
template(v-slot:body) - не правильно
template([body]) - правильно
async в методах
async loadData: -> - не правильно
loadData: -> - правильно
Радота с кодом
всегда приводи полный листинг файлов
при форматировании кода для отделения логических блоков используй 4 пробела (" ")
следи за строгим соблюдением синтаксиса используемых языков (coffeescript, pug, stylus)
в pug не используй многострочные вычисляемые атрибуты
работа с консолью и текстовыми константами/переменными используй конкатенацию (СТРОГО! ВАЖНО!)
используй для вывода в консоль debug.log
console.log "переменная temp = #{temp}" - не правильно
debug.log "переменная temp = "+temp - правильно
shareUrl = "https://twitter.com/intent/tweet?text=#{text}" - не правильно
shareUrl = "https://twitter.com/intent/tweet?text="+text - правильно
"#{@baseUrl}/#{@dbName}/_all_docs?include_docs=true" - не правильно
@baseUrl+"/"+@dbName+"/_all_docs?include_docs=true" - правильно
Цвета и управление темами
во всех *.styl файлах используй цвета в виде переменных, определённых в файле tailwind.config.js
Стили
все глобальный настройки стилей, пиши в app/temp.styl в остальных файлах, строго стили необходимые только для данного компаонента
Расположение статических файлов/изображений
img(src="/images/hall-interior.jpg") - не правильно
img(src="/assets/[domenName]/hall-interior.jpg") - правильно
стиль написания классов
.container.mx-auto.px-4 - не правильно
div(class="container.mx-auto px-4") - правильно
не используй вызовы
Vue = require 'vue'
VueRouter = require 'vue-router'
- Подключение осуществлено глобально через файл doc.json
git ВАЖНО
для анализа кода бери версии файлов СТРОГО из репозитария:
https://gogs.osvoj.ru/s5l.ru/borbad.s5l.ru/src/master
, корневой каталог vue/
от него идут пути к файлам пример: в коде -> app/temp.coffee, в репозитарии -> vue/app/temp.coffee
Общее описание
Универсаньная CMS для работы с couchdb как бекендом.
CMS мультидоменная и мультиязычная.
мультидоменность во все view через поле domain
общая структура проекта
app/
├── tailwind.config.js (настройка тем и Tailwind CSS)
├── temp.pug (основной layout)
├── temp.coffee (инициализация Vue и роутера)
├── temp.styl (стили которые сложно или не удобно сделать на Tailwind CSS или стили к однотипным элементам на stylus)
├── core/ - Каталог для хранения coffee файлов частей ядра системы, для улучшения чтения temp.coffee
| ├── CouchdbClass.coffee
| ...
├── page/
| ├── Home/ (главная страница)
| | ├── index.coffee
| | ├── index.pug
| | ├── index.styl
| ├── [другие_страницы]/
| ├── index.coffee
| ├── index.pug
| ├── index.styl
└── shared/
├── ThemeToggle/
| ├── index.coffee
| ├── index.pug
| ├── index.styl
├── MultiLevelMenu/
| ├── index.coffee
| ├── index.pug
| ├── index.styl
├── ImageSlider/
| ├── index.coffee
| ├── index.pug
| ├── index.styl
├── ModalWindow/
| ├── index.coffee
| ├── index.pug
| ├── index.styl
├── FormValidator/
| ├── index.coffee
| ├── index.pug
| ├── index.styl
├── FilterSort/
├── index.coffee
├── index.pug
├── index.styl
Структура хранимых данных
Описание всех хранимых объектов
- Настройки домена (domain_settings)
coffee
{
_id: "domain_settings_borbad_s5l_ru" # domainsettings[домен]
type: "domain_settings"
domain: "borbad.s5l.ru" # Доменное имя
name: "Кохи Борбад - Концертный зал Душанбе" # Название сайта
description: "Официальный сайт концертного зала Борбад" # Описание
active: true # Активен ли домен
priority: 1 # Приоритет домена
theme: "borbad" # Тема оформления
languages: ["ru", "en", "tj"] # Поддерживаемые языки
default_language: "ru" # Язык по умолчанию
timezone: "Asia/Dushanbe" # Часовой пояс
currency: "TJS" # Валюта по умолчанию
settings: {
seo: {
title_template: "{page} - Кохи Борбад"
description: "Концертный зал Борбад - культурный центр Душанбе"
keywords: ["концерты", "мероприятия", "Душанбе", "культура"]
}
social: {
facebook: "https://facebook.com/borbad"
instagram: "https://instagram.com/borbad"
twitter: "https://twitter.com/borbad"
}
contact: {
address: "г. Душанбе, пр. Рудаки 22"
phone: "+992 37 123-45-67"
email: "info@borbad.s5l.ru"
}
features: {
online_booking: true
multi_language: true
ecommerce: true
}
}
created_at: "2024-01-15T10:00:00.000Z"
updated_at: "2024-01-15T10:00:00.000Z"
}
- Блог посты (blog_post) - мультидоменные
coffee
{
_id: "blog_post_season_opening_2024_borbad"
type: "blog_post"
domain: ["borbad.s5l.ru", "global"]
domain_priority: ["borbad.s5l.ru", "global"]
language: "ru"
title: "Открытие нового сезона 2024"
content: "# Добро пожаловать в новый творческий сезон!..."
excerpt: "Новый творческий сезон 2024 года в концертном зале Борбад"
seo: {
description: "Концертный зал Борбад - культурный центр Душанбе"
keywords: ["концерты", "мероприятия", "Душанбе", "культура"]
}
image: "/assets/borbad.s5l.ru/events/beethoven-concert.jpg"
gallery: [
"/assets/borbad.s5l.ru/gallery/concert1.jpg"
"/assets/borbad.s5l.ru/gallery/concert2.jpg"
]
tags: ["новости", "сезон", "анонс"]
category_id: "category_news_borbad" # ID конечной категории
category_path: ["category_news_borbad"] # Полный путь категории
author: "Администрация Борбад"
status: "published"
featured: true
created_at: "2024-01-15T10:00:00.000Z"
updated_at: "2024-01-15T10:00:00.000Z"
published_at: "2024-01-15T10:00:00.000Z"
views: 156
}
- Мероприятия (event) - мультидоменные
coffee
{
_id: "event_beethoven_concert_2024_03_borbad"
type: "event"
domain: ["borbad.s5l.ru", "concert-hall.tj"] # Принадлежит двум доменам
domain_priority: ["borbad.s5l.ru", "concert-hall.tj"] # Приоритет отображения
language: "ru"
translation_of: null
translation_status: "original"
title: "Симфонический концерт: Бетховен и Чайковский"
content: "# Великие композиторы\n\n## Программа концерта\n\n- Л. ван Бетховен - Симфония №5..."
event_date: "2024-03-20T19:00:00.000Z"
end_date: "2024-03-20T21:00:00.000Z"
location: "Большой зал"
venue_id: "venue_main_hall_borbad"
address: {
street: "пр. Рудаки 22"
city: "Душанбе"
country: "Таджикистан"
}
coordinates: {
lat: 38.5732
lng: 68.7734
}
price: 500
currency: "TJS"
available_tickets: 45
total_tickets: 300
image: "/assets/borbad.s5l.ru/events/beethoven-concert.jpg"
gallery: [
"/assets/borbad.s5l.ru/gallery/concert1.jpg"
"/assets/borbad.s5l.ru/gallery/concert2.jpg"
]
tags: ["концерт", "симфоническая музыка", "классика", "Бетховен", "Чайковский"]
category_id: "category_classical_music_concerts_events_borbad" # ID конечной категории
category_path: ["category_events_borbad", "category_concerts_events_borbad", "category_classical_music_concerts_events_borbad"] # Полный путь
status: "upcoming"
registration_required: true
max_attendees: 300
age_restriction: "6+"
organizer: "Симфонический оркестр Борбад"
performers: ["Фаррух Саидов (дирижер)", "Солисты оркестра"]
duration: 120 # Продолжительность в минутах
created_at: "2024-01-10T09:00:00.000Z"
updated_at: "2024-01-15T14:30:00.000Z"
}
- Слайды (slide) - мультидоменные
coffee
{
_id: "slide_01_borbad"
type: "slide"
domain: ["borbad.s5l.ru", "global"] # Глобальный слайд
domain_priority: ["borbad.s5l.ru", "global"]
language: "ru"
translation_of: null
translation_status: "original"
title: "Добро пожаловать в Кохи Борбад"
content: "## Современный концертный зал в сердце Душанбе\n\nМесто, где встречаются искусство и культура"
image: "/assets/borbad.s5l.ru/sliders/main-hall.jpg"
mobile_image: "/assets/borbad.s5l.ru/sliders/main-hall-mobile.jpg" # Оптимизация для мобильных
order: 1
active: true
button_text: "Узнать больше"
button_link: "/about"
button_style: "primary" # primary, secondary, outline
text_color: "#ffffff"
text_position: "center" # left, center, right
overlay: true
overlay_opacity: 0.4
start_date: "2024-01-01T00:00:00.000Z" # Дата начала показа
end_date: "2024-12-31T23:59:59.000Z" # Дата окончания показа
target_audience: ["all"] # all, registered, specific
created_at: "2024-01-01T00:00:00.000Z"
updated_at: "2024-01-15T10:00:00.000Z"
}
- Товары (product) - мультидоменные
coffee
{
_id: "product_tshirt_logo_2024_borbad"
type: "product"
domain: ["borbad.s5l.ru", "shop.borbad.s5l.ru"] # Основной домен и магазин
domain_priority: ["shop.borbad.s5l.ru", "borbad.s5l.ru"]
language: "ru"
translation_of: null
translation_status: "original"
title: "Футболка с логотипом Борбад"
content: "## Качественная хлопковая футболка\n\nРазмеры: S, M, L, XL..."
excerpt: "Фирменная футболка концертного зала с логотипом"
image: "/assets/borbad.s5l.ru/products/tshirt.jpg"
gallery: [
"/assets/borbad.s5l.ru/products/tshirt-front.jpg"
"/assets/borbad.s5l.ru/products/tshirt-back.jpg"
]
price: 250
currency: "TJS"
compare_price: 350 # Старая цена
category_id: "category_souvenirs_borbad"
tags: ["одежда", "сувениры", "мерч"]
attributes: {
sizes: ["S", "M", "L", "XL"]
colors: ["белый", "черный", "красный"]
material: "100% хлопок"
brand: "Борбад"
}
inventory: 50
sku: "TSH-BRB-001"
status: "available"
featured: true
weight: 0.3 # Вес в кг
dimensions: {
length: 70,
width: 50,
height: 5
}
shipping: {
free_shipping: false
shipping_cost: 50
}
seo: {
title: "Футболка с логотипом Борбад - Сувениры"
description: "Качественная хлопковая футболка с логотипом концертного зала Борбад"
keywords: ["футболка", "сувениры", "Борбад", "мерч"]
}
created_at: "2024-01-10T09:00:00.000Z"
updated_at: "2024-01-15T14:30:00.000Z"
}
- Категории (category) - мультидоменные
coffee
{
_id: "category_classical_music_concerts_events_borbad"
type: "category"
domain: ["borbad.s5l.ru", "concert-hall.tj"]
domain_priority: ["borbad.s5l.ru", "concert-hall.tj"]
language: "ru"
name: "Классическая музыка"
slug: "classical-music"
description: "Симфонические концерты и классические произведения"
image: "/assets/borbad.s5l.ru/categories/classical-music.jpg"
icon: "classical"
parent_id: "category_concerts_events_borbad" # ID родительской категории
parent_path: ["category_events_borbad", "category_concerts_events_borbad"] # Полный путь от корня
level: 2 # Уровень в иерархии (0 - корень)
order: 1
children_count: 0 # Количество дочерних категорий
meta_title: "Классическая музыка - Кохи Борбад"
meta_description: "Симфонические концерты и классические произведения"
active: true
featured: true
show_in_menu: true
menu_order: 1
color: "#3B82F6"
created_at: "2024-01-15T10:00:00.000Z"
updated_at: "2024-01-15T10:00:00.000Z"
}
- Темы (theme) - мультидоменные
coffee
{
_id: "theme_classical_music_borbad"
type: "theme"
domain: ["borbad.s5l.ru", "global"] # Глобальная тема
domain_priority: ["borbad.s5l.ru", "global"]
language: "ru"
translation_of: null
translation_status: "original"
name: "Классическая музыка"
slug: "classical-music"
description: "Мероприятия классической музыки и симфонические концерты"
color: "#8B5CF6"
image: "/assets/borbad.s5l.ru/themes/classical-music.jpg"
order: 1
active: true
settings: {
font_family: "Georgia, serif"
background_color: "#F8FAFC"
text_color: "#1E293B"
}
created_at: "2024-01-01T00:00:00.000Z"
updated_at: "2024-01-15T10:00:00.000Z"
}
- Страницы (page) - мультидоменные
coffee
{
_id: "page_about_borbad"
type: "page"
domain: ["borbad.s5l.ru", "concert-hall.tj"] # Общая страница "О нас"
domain_priority: ["borbad.s5l.ru", "concert-hall.tj"]
language: "ru"
translation_of: null
translation_status: "original"
title: "О нас - Кохи Борбад"
slug: "about"
content: "# О концертном зале Борбад\n\nИстория и описание нашего зала..."
excerpt: "Информация о концертном зале Борбад в Душанбе"
image: "/assets/borbad.s5l.ru/pages/about.jpg"
parent_id: null
order: 2
template: "default"
meta_title: "О нас - Концертный зал Борбад"
meta_description: "Узнайте больше о концертном зале Борбад в Душанбе"
status: "published"
protected: false
show_in_sitemap: true
allow_comments: false
featured: false
created_at: "2024-01-01T00:00:00.000Z"
updated_at: "2024-01-15T10:00:00.000Z"
}
- Меню (menu) - мультидоменные
coffee
{
_id: "menu_header_borbad_s5l_ru"
type: "menu"
domain: "borbad.s5l.ru" # Специфичное для домена меню
domain_priority: ["borbad.s5l.ru"]
language: "ru"
translation_of: null
translation_status: "original"
name: "Главное меню"
location: "header"
active: true
items: [
{
title: "Главная"
url: "/"
order: 1
target: "_self"
icon: "home"
children: []
}
{
title: "Мероприятия"
url: "/events"
order: 2
target: "_self"
icon: "calendar"
children: [
{
title: "Концерты"
url: "/events?category=concerts"
order: 1
target: "_self"
}
{
title: "Выставки"
url: "/events?category=exhibitions"
order: 2
target: "_self"
}
]
}
]
settings: {
mobile_breakpoint: 768
dropdown_animation: "fade"
}
created_at: "2024-01-01T00:00:00.000Z"
updated_at: "2024-01-15T10:00:00.000Z"
}
- Пользователи (user) - глобальные
coffee
{
_id: "user_admin_main"
type: "user"
domain: "global" # Глобальный пользователь
email: "admin@borbad.s5l.ru"
name: "Администратор Борбад"
role: "admin"
active: true
permissions: ["read", "write", "delete", "admin"]
profile: {
avatar: "/assets/borbad.s5l.ru/avatars/admin.jpg"
phone: "+992 37 123-45-67"
position: "Системный администратор"
bio: "Ответственный за техническую часть сайта"
}
preferences: {
language: "ru"
notifications: true
theme: "dark"
timezone: "Asia/Dushanbe"
}
security: {
last_password_change: "2024-01-01T00:00:00.000Z"
two_factor_enabled: true
login_attempts: 0
}
domains_access: ["borbad.s5l.ru", "concert-hall.tj"] # Доступ к доменам
created_at: "2024-01-01T00:00:00.000Z"
updated_at: "2024-01-15T10:00:00.000Z"
last_login: "2024-01-15T09:30:00.000Z"
}
- Заказы (order) - мультидоменные
coffee
{
_id: "order_2024_001_borbad"
type: "order"
domain: "shop.borbad.s5l.ru" # Заказ из магазина
language: "ru"
user_id: "user_customer_ivanov"
status: "completed"
total: 1500
currency: "TJS"
items: [
{
product_id: "event_ticket_1"
name: "Билет на симфонический концерт"
quantity: 2
price: 500
total: 1000
type: "ticket"
}
{
product_id: "product_tshirt_logo_2024_borbad"
name: "Футболка с логотипом"
quantity: 1
price: 500
total: 500
type: "product"
}
]
customer_info: {
name: "Иван Иванов"
email: "ivan@example.com"
phone: "+992 123-45-67"
}
payment_info: {
method: "card"
transaction_id: "txn_123456"
status: "paid"
amount: 1500
currency: "TJS"
payment_date: "2024-01-15T14:00:00.000Z"
}
shipping_info: {
method: "pickup"
address: null
tracking_number: null
}
metadata: {
ip_address: "192.168.1.100"
user_agent: "Mozilla/5.0..."
source: "website"
}
created_at: "2024-01-15T13:45:00.000Z"
updated_at: "2024-01-15T14:00:00.000Z"
}
- Настройки (setting) - мультидоменные
coffee
{
_id: "setting_seo_title_borbad_s5l_ru"
type: "setting"
domain: "borbad.s5l.ru" # Специфичная настройка для домена
language: "ru"
key: "seo_title"
value: "Кохи Борбад - Концертный зал Душанбе"
type: "string" # string, number, boolean, object, array
is_global: false
description: "Заголовок сайта для SEO"
category: "seo"
group: "site_settings"
editable: true
created_at: "2024-01-01T00:00:00.000Z"
updated_at: "2024-01-15T10:00:00.000Z"
}
- Аудит (audit_log) - глобальные
coffee
{
_id: "audit_2024_001"
type: "audit_log"
domain: "global" # Глобальный лог
user_id: "user_admin_main"
action: "create"
resource_type: "blog_post"
resource_id: "blog_post_season_opening_2024_borbad"
description: "Создана новая запись блога 'Открытие нового сезона 2024'"
ip_address: "192.168.1.1"
user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
language: "ru"
metadata: {
old_value: null
new_value: {
title: "Открытие нового сезона 2024"
status: "published"
}
changes: ["title", "status"]
}
created_at: "2024-01-15T10:00:00.000Z"
}
_desing документ для работы с данными
https://gogs.osvoj.ru/s5l.ru/borbad.s5l.ru/raw/master/scripts/design-documents.coffee