README.md 30 KB

Текущая задача

доработай # Структура хранимых данных ## Описание всех хранимых объектов взяв за основу объёкт записи блога: {

_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

Структура хранимых данных

Описание всех хранимых объектов

  1. Настройки домена (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" }
  2. Блог посты (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 }
  3. Мероприятия (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" }
  4. Слайды (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" }
  5. Товары (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" }
  6. Категории (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" }
  7. Темы (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" }
  8. Страницы (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" }
  9. Меню (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" }
  10. Пользователи (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" }
  11. Заказы (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" }
  12. Настройки (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" }
  13. Аудит (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