main.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import Vue from 'vue'
  2. import App from './App.vue'
  3. import router from './router'
  4. import store from './store'
  5. import {
  6. Button, Table, TableColumn, Form, FormItem, Input, Select, Option, Dialog,
  7. Pagination, Tag, Card, Col, Row, Icon, Descriptions, DescriptionsItem,
  8. Radio, RadioGroup, Switch, Checkbox, CheckboxGroup, Dropdown,
  9. DropdownMenu, DropdownItem, DatePicker, Upload, Tabs, TabPane,
  10. Menu, Submenu, MenuItem, Empty, Drawer, Timeline, TimelineItem,
  11. Progress, Container, Header, Aside, Main, Avatar, Scrollbar, Divider,
  12. Tab, Badge, Tree, ColorPicker, Tooltip, Popover,
  13. Slider, InputNumber, Link, Rate, Loading, Alert,
  14. Image, RadioButton, CheckboxButton, Popconfirm, OptionGroup, Backtop,
  15. PageHeader as ElPageHeader,
  16. MessageBox, Message
  17. } from 'element-ui'
  18. import 'element-ui/lib/theme-chalk/index.css'
  19. import './styles/admin-tokens.css'
  20. import './assets/css/sort.css'
  21. import { formatPrice, formatPriceWithSymbol, formatRate, formatScore, formatDateTime, formatDate } from './utils/format'
  22. // 企业级复用组件(Phase 2):统一 KPI 卡 / 状态标签 / 页头 / 区块标题
  23. import StatCard from './components/StatCard.vue'
  24. import StatusTag from './components/StatusTag.vue'
  25. import PageHeader from './components/PageHeader.vue'
  26. import SectionTitle from './components/SectionTitle.vue'
  27. Vue.use(Button)
  28. Vue.use(Table)
  29. Vue.use(TableColumn)
  30. Vue.use(Form)
  31. Vue.use(FormItem)
  32. Vue.use(Input)
  33. Vue.use(Select)
  34. Vue.use(Option)
  35. Vue.use(Dialog)
  36. Vue.use(Pagination)
  37. Vue.use(Tag)
  38. Vue.use(Card)
  39. Vue.use(Col)
  40. Vue.use(Row)
  41. Vue.use(Icon)
  42. Vue.use(Descriptions)
  43. Vue.use(DescriptionsItem)
  44. Vue.use(Radio)
  45. Vue.use(RadioGroup)
  46. Vue.use(Switch)
  47. Vue.use(Checkbox)
  48. Vue.use(CheckboxGroup)
  49. Vue.use(Dropdown)
  50. Vue.use(DropdownMenu)
  51. Vue.use(DropdownItem)
  52. Vue.use(DatePicker)
  53. Vue.use(Upload)
  54. Vue.use(Tabs)
  55. Vue.use(TabPane)
  56. Vue.use(Menu)
  57. Vue.use(Submenu)
  58. Vue.use(MenuItem)
  59. Vue.use(Empty)
  60. Vue.use(Drawer)
  61. Vue.use(Timeline)
  62. Vue.use(TimelineItem)
  63. Vue.use(Progress)
  64. Vue.use(Container)
  65. Vue.use(Header)
  66. Vue.use(Aside)
  67. Vue.use(Main)
  68. Vue.use(Avatar)
  69. Vue.use(Scrollbar)
  70. Vue.use(Divider)
  71. Vue.use(Badge)
  72. Vue.use(Tree)
  73. Vue.use(ColorPicker)
  74. Vue.use(Tooltip)
  75. Vue.use(Popover)
  76. Vue.use(Slider)
  77. Vue.use(InputNumber)
  78. Vue.use(Link)
  79. Vue.use(Rate)
  80. Vue.use(Loading)
  81. Vue.use(Alert)
  82. // 补充注册:素材库与表单页用到的组件(此前漏注册,导致 el-image/el-radio-button 等渲染成惰性标签)
  83. Vue.use(Image)
  84. Vue.use(RadioButton)
  85. Vue.use(CheckboxButton)
  86. Vue.use(Popconfirm)
  87. Vue.use(OptionGroup)
  88. Vue.use(Backtop)
  89. Vue.use(ElPageHeader)
  90. // MessageBox 没有 install 方法,Vue.use(MessageBox) ——这是错误的,不会注册 $confirm
  91. // 需要手动挂载到 prototype 上
  92. Vue.prototype.$confirm = MessageBox.confirm
  93. Vue.prototype.$alert = MessageBox.alert
  94. Vue.prototype.$prompt = MessageBox.prompt
  95. Vue.prototype.$message = Message
  96. Vue.prototype.formatPrice = formatPrice
  97. Vue.prototype.formatPriceWithSymbol = formatPriceWithSymbol
  98. Vue.prototype.formatRate = formatRate
  99. Vue.prototype.formatScore = formatScore
  100. Vue.prototype.formatTime = formatDateTime
  101. Vue.prototype.formatDate = formatDate
  102. // 注册企业级复用组件:页面无需单独 import 即可直接使用
  103. Vue.component('StatCard', StatCard)
  104. Vue.component('StatusTag', StatusTag)
  105. Vue.component('PageHeader', PageHeader)
  106. Vue.component('SectionTitle', SectionTitle)
  107. // Fix Element UI 2.15.x el-submenu removeTabindex null error
  108. // https://github.com/ElemeFE/element/issues/21965
  109. // Also fixes: v-if 切换菜单项后 el-submenu 残留 DOM 遮罩导致无法点击的问题
  110. const ElSubmenu = Vue.component('ElSubmenu')
  111. if (ElSubmenu && ElSubmenu.options && ElSubmenu.options.methods) {
  112. const origRemove = ElSubmenu.options.methods.removeTabindex
  113. if (origRemove) {
  114. ElSubmenu.options.methods.removeTabindex = function() {
  115. try {
  116. if (!this.$el || !this.$el.querySelector) return
  117. const tooltip = this.$el.querySelector('.el-tooltip')
  118. if (!tooltip) return
  119. return origRemove.call(this)
  120. } catch (e) {
  121. // v-if 切换导致 DOM 已销毁时的静默容错
  122. }
  123. }
  124. }
  125. // el-submenu 展开/收起时也可能操作已销毁的 DOM
  126. const origOpen = ElSubmenu.options.methods.open
  127. if (origOpen) {
  128. ElSubmenu.options.methods.open = function() {
  129. try {
  130. return origOpen.call(this)
  131. } catch (e) {
  132. // 静默容错
  133. }
  134. }
  135. }
  136. }
  137. Vue.config.productionTip = false
  138. new Vue({
  139. router,
  140. store,
  141. render: h => h(App)
  142. }).$mount('#app')