index.coffee 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. # Инициализация глобальных переменных
  2. globalThis.renderFns = require 'pug.json'
  3. globalThis.stylFns = require 'styl.json'
  4. globalThis.themeConfig = require 'app/theme.config.coffee'
  5. # Инициализация Tailwind с кастомной конфигурацией
  6. tailwind.config = {
  7. theme: {
  8. extend: {
  9. colors: themeConfig.colors
  10. fontFamily: themeConfig.typography.fonts
  11. borderRadius: themeConfig.borderRadius
  12. }
  13. }
  14. darkMode: 'class'
  15. }
  16. PouchDBService = require 'app/utils/pouch.coffee'
  17. # Инициализация сервиса данных
  18. pouchService = PouchDBService
  19. document.head.insertAdjacentHTML 'beforeend','<meta charset="UTF-8">'
  20. document.head.insertAdjacentHTML 'beforeend','<meta name="viewport" content="width=device-width, initial-scale=1.0">'
  21. document.head.insertAdjacentHTML('beforeend','<style>'+stylFns['main.css']+'</style>')
  22. document.head.insertAdjacentHTML('beforeend','<style type="text/tailwindcss">'+stylFns['app/index.styl']+'</style>')
  23. document.head.insertAdjacentHTML('beforeend','<title> Кохи Борбад - Концертный зал Душанбе</title>')
  24. # Создание главного приложения Vue
  25. globalThis.app = Vue.createApp({
  26. data: ->
  27. return {
  28. theme: localStorage.getItem('theme') || 'light'
  29. companyName: 'Браер-Колор'
  30. loading: false
  31. cartItems: []
  32. user: null
  33. currentDomain: window.location.hostname
  34. languages: ['ru', 'en']
  35. currentLanguage: 'ru'
  36. }
  37. render: (new Function '_ctx', '_cache', renderFns['app/index.pug'])()
  38. computed:
  39. isAdmin: -> @user?.role == 'admin'
  40. methods:
  41. toggleTheme: ->
  42. @theme = if @theme == 'light' then 'dark' else 'light'
  43. localStorage.setItem 'theme', @theme
  44. document.documentElement.classList.toggle 'dark'
  45. setLanguage: (lang) ->
  46. if @languages.includes lang
  47. @currentLanguage = lang
  48. localStorage.setItem 'language', lang
  49. showNotification: (message, type = 'success') ->
  50. # Реализация системы уведомлений
  51. console.dir "#{type.toUpperCase()}: #{message}"
  52. loadUserData: ->
  53. # Загрузка данных пользователя из localStorage или PouchDB
  54. userData = localStorage.getItem 'user'
  55. if userData
  56. try
  57. @user = JSON.parse userData
  58. catch
  59. @user = null
  60. mounted: ->
  61. # Инициализация темы
  62. if @theme == 'dark'
  63. document.documentElement.classList.add 'dark'
  64. # Инициализация PouchDB
  65. try
  66. await pouchService.init()
  67. console.dir 'PouchDB инициализирован'
  68. catch error
  69. console.error 'Ошибка инициализации PouchDB:', error
  70. # Загрузка пользователя (если авторизован)
  71. @loadUserData()
  72. })
  73. # Настройка маршрутизатора
  74. router = VueRouter.createRouter({
  75. history: VueRouter.createWebHistory()
  76. routes: [
  77. { path: '/', component: require 'app/pages/Home' },
  78. {
  79. path: '/admin',
  80. component: require 'app/pages/Admin'
  81. meta: { requiresAdmin: true }
  82. redirect: '/admin/settings'
  83. children: [
  84. #{ path: 'slider', component: require 'app/pages/Admin/Slider' }
  85. #{ path: 'products', component: require 'app/pages/Admin/Products' }
  86. #{ path: 'clients', component: require 'app/pages/Admin/Clients' }
  87. #{ path: 'blog', component: require 'app/pages/Admin/Blog' }
  88. #{ path: 'routes', component: require 'app/pages/Admin/Routes' }
  89. { path: 'settings', component: require 'app/pages/Admin/Settings' }
  90. ]
  91. },
  92. #{ path: '/catalog', component: require 'app/pages/Catalog' },
  93. #{ path: '/blog/:slug', component: require 'app/pages/BlogArticle' },
  94. #{ path: '/contacts', component: require 'app/pages/Contacts' },
  95. #{ path: '/about', component: require 'app/pages/About' }
  96. ]
  97. })
  98. # Глобальный навигационный хук
  99. #router.beforeEach (to, from, next) ->
  100. # if to.meta.requiresAdmin
  101. # userData = localStorage.getItem 'user'
  102. # if userData
  103. # try
  104. # user = JSON.parse userData
  105. # if user.role == 'admin'
  106. # next()
  107. # else
  108. # next('/')
  109. # catch
  110. # next('/')
  111. # else
  112. # next('/')
  113. # else
  114. # next()
  115. app.use(router)
  116. # Глобальная обработка ошибок
  117. app.config.errorHandler = (err, vm, info) ->
  118. console.error 'Vue Error:', err
  119. console.error 'Component:', vm
  120. console.error 'Info:', info
  121. # В продакшне отправлять ошибки на сервер
  122. if process.env.NODE_ENV != 'production'
  123. vm?.$root?.showNotification?('Произошла ошибка приложения', 'error')
  124. # Монтирование приложения
  125. app.mount('body')
  126. debug.log 'Приложение Браер-Колор инициализировано'