index.coffee 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. # Инициализация глобальных переменных
  2. globalThis.renderFns = require 'pug.json'
  3. globalThis.stylFns = require 'styl.json'
  4. PouchDBService = require 'app/utils/pouch.coffee'
  5. # Инициализация сервиса данных
  6. pouchService = PouchDBService
  7. document.head.insertAdjacentHTML 'beforeend','<meta charset="UTF-8">'
  8. document.head.insertAdjacentHTML 'beforeend','<meta name="viewport" content="width=device-width, initial-scale=1.0">'
  9. document.head.insertAdjacentHTML('beforeend','<style type="text/css">'+stylFns['app/index.styl']+'</style>')
  10. document.head.insertAdjacentHTML('beforeend','<title></title>')
  11. # Создание главного приложения Vue
  12. app = Vue.createApp({
  13. data: ->
  14. return {
  15. theme: localStorage.getItem('theme') || 'light'
  16. companyName: 'Браер-Колор'
  17. loading: false
  18. cartItems: []
  19. user: null
  20. currentDomain: window.location.hostname
  21. languages: ['ru', 'en']
  22. currentLanguage: 'ru'
  23. currentDomainSettings: null
  24. }
  25. render: (new Function '_ctx', '_cache', renderFns['app/index.pug'])()
  26. computed:
  27. isAdmin: -> @user?.role == 'admin'
  28. methods:
  29. toggleTheme: ->
  30. @theme = if @theme == 'light' then 'dark' else 'light'
  31. localStorage.setItem 'theme', @theme
  32. document.documentElement.classList.toggle 'dark'
  33. setLanguage: (lang) ->
  34. if @languages.includes lang
  35. @currentLanguage = lang
  36. localStorage.setItem 'language', @lang
  37. loadDomainSettings: ->
  38. pouchService.getDocument("domain_settings:#{@currentDomain}")
  39. .then (settings) =>
  40. @currentDomainSettings = settings
  41. # Устанавливаем заголовок страницы
  42. if settings?.companyName
  43. document.title = settings.companyName
  44. .catch (error) =>
  45. debug.log 'Настройки домена не найдены, используются значения по умолчанию'
  46. @currentDomainSettings = null
  47. showNotification: (message, type = 'success') ->
  48. # Реализация системы уведомлений
  49. debug.log "#{type.toUpperCase()}: #{message}"
  50. mounted: ->
  51. # Инициализация темы
  52. if @theme == 'dark'
  53. document.documentElement.classList.add 'dark'
  54. # Инициализация PouchDB
  55. try
  56. await pouchService.init()
  57. debug.log 'PouchDB инициализирован'
  58. # Загружаем настройки домена
  59. await @loadDomainSettings()
  60. catch error
  61. console.error 'Ошибка инициализации PouchDB:', error
  62. # Загрузка пользователя (если авторизован)
  63. @loadUserData()
  64. loadUserData: ->
  65. # Загрузка данных пользователя из localStorage или PouchDB
  66. userData = localStorage.getItem 'user'
  67. if userData
  68. try
  69. @user = JSON.parse userData
  70. catch
  71. @user = null
  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 'Приложение Браер-Колор инициализировано'