Nincs leírás

Gogs 2ea2b002fa -- 3 hete
assets d100bd6170 -- 3 hete
pug 06219819b6 -- 3 hete
scripts 2ea2b002fa -- 3 hete
vue 2ea2b002fa -- 3 hete
.gitignore 06219819b6 -- 3 hete
README.md 2ea2b002fa -- 3 hete
doc.json 80710f8924 -- 3 hete
lzma.coffee c0e0a044f2 -- 3 hete

README.md

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

доработай seed-events.coffee, так что бы он проверял наличие базы данных. создай _desing документы с необходимым набором view/map функций, _desing документ сделай отдельным файлом, весь код на coffeescript ля взаимодействия с couchdb используй pouchdb. скрипт должен проверять их наличие и соответствие текущей версии, и если их нет то создавать или обновлять. добавь к структуре, документ товара, с произвольным набором атрибутов, (Категории/Темы - доработать существующие структуры на взаимодействие с ними.), Теги. основной текст, пишется на markdown.

применяй правила:

оформление ссылок

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
    

определение шаблонов для слотов

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

файл с правилами

https://gogs.osvoj.ru/s5l.ru/borbad.s5l.ru/raw/master/README.md

общая структура проекта

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

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

Базовый объект "Запись блога"

coffee {

_id: String                    # Уникальный идентификатор
type: 'blog_post'              # Тип записи
title: String                  # Заголовок
content: String                # Основной текст в Markdown
excerpt: String                # Краткое описание
image: String                  # Главное изображение
tags: Array[String]            # Теги для категоризации
author: String                 # Автор записи
status: 'published' | 'draft'  # Статус публикации
created_at: ISOString          # Дата создания
updated_at: ISOString          # Дата обновления
views: Number                  # Количество просмотров

}

Наследник "Слайд"

coffee {

_id: String
type: 'slide'
title: String
content: String                # Markdown контент
image: String                  # Фоновое изображение
order: Number                  # Порядок отображения
active: Boolean                # Активен ли слайд
button_text: String            # Текст кнопки
button_link: String            # Ссылка кнопки
created_at: ISOString
updated_at: ISOString

}

Наследник "Мероприятие"

coffee {

_id: String
type: 'event'
title: String
content: String                # Markdown описание мероприятия
event_date: ISOString          # Дата и время мероприятия
end_date: ISOString            # Дата и время окончания
location: String               # Место проведения
price: Number                  # Стоимость билета
currency: String               # Валюта (TJS, USD, etc.)
available_tickets: Number      # Количество доступных билетов
total_tickets: Number          # Общее количество билетов
image: String                  # Изображение мероприятия
gallery: Array[String]         # Галерея изображений
tags: Array[String]            # Теги (концерт, выставка, etc.)
status: 'upcoming' | 'ongoing' | 'completed' | 'cancelled'
registration_required: Boolean # Требуется ли регистрация
created_at: ISOString
updated_at: ISOString

}