Layout.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <template>
  2. <div class="layout">
  3. <!-- 侧边栏 -->
  4. <aside :class="['sidebar', { collapsed }]">
  5. <div class="logo">
  6. <el-icon><Monitor /></el-icon>
  7. <span v-if="!collapsed">管理后台</span>
  8. </div>
  9. <el-menu
  10. :default-active="$route.path"
  11. router
  12. :collapse="collapsed"
  13. background-color="#304156"
  14. text-color="#bfcbd9"
  15. active-text-color="#409EFF"
  16. >
  17. <el-sub-menu index="customization">
  18. <template #title>
  19. <el-icon><Setting /></el-icon>
  20. <span>定制功能</span>
  21. </template>
  22. <el-sub-menu index="customization-hsbc">
  23. <template #title>汇丰银行</template>
  24. <el-sub-menu index="customization-hsbc-pages">
  25. <template #title>页面管理</template>
  26. <el-menu-item index="/customization/hsbc/pages/home">
  27. 权益介绍页
  28. </el-menu-item>
  29. <el-menu-item index="/customization/hsbc/pages/zone">
  30. 权益首页
  31. </el-menu-item>
  32. <el-menu-item index="/customization/hsbc/pages/assembly">
  33. 组装页
  34. </el-menu-item>
  35. </el-sub-menu>
  36. <el-sub-menu index="customization-hsbc-equity">
  37. <template #title>权益管理</template>
  38. <el-menu-item index="/customization/hsbc/equity-products">
  39. 借记卡权益
  40. </el-menu-item>
  41. <el-menu-item index="/customization/hsbc/credit-card-equity">
  42. 信用卡权益
  43. </el-menu-item>
  44. <el-menu-item index="/customization/hsbc/audit">
  45. 权益审核
  46. </el-menu-item>
  47. </el-sub-menu>
  48. <el-menu-item index="/customization/hsbc/equity-grant-campaign">
  49. 发放计划
  50. </el-menu-item>
  51. <el-sub-menu index="customization-hsbc-crowd">
  52. <template #title>人群管理</template>
  53. <el-menu-item index="/customization/hsbc/crowd-tasks">
  54. 客群任务管理
  55. </el-menu-item>
  56. <el-menu-item index="/customization/hsbc/rule-groups">
  57. 规则组管理
  58. </el-menu-item>
  59. </el-sub-menu>
  60. <el-sub-menu index="customization-hsbc-sms">
  61. <template #title>短信管理</template>
  62. <el-menu-item index="/customization/hsbc/sms-templates">
  63. 短信模板管理
  64. </el-menu-item>
  65. <el-menu-item index="/customization/hsbc/sms-send-records">
  66. 发送记录查询
  67. </el-menu-item>
  68. </el-sub-menu>
  69. <el-sub-menu index="customization-hsbc-channel">
  70. <template #title>渠道管理</template>
  71. <el-menu-item index="/customization/hsbc/channel">
  72. Channel管理
  73. </el-menu-item>
  74. <el-menu-item index="/customization/hsbc/campaign">
  75. Campaign管理
  76. </el-menu-item>
  77. </el-sub-menu>
  78. <el-sub-menu index="customization-hsbc-report">
  79. <template #title>报表中心</template>
  80. <el-menu-item index="/customization/hsbc/points-detail">
  81. 积分明细查询
  82. </el-menu-item>
  83. <el-menu-item index="/customization/hsbc/equity-grant">
  84. 客户权益发放
  85. </el-menu-item>
  86. <el-menu-item index="/customization/hsbc/cash-discount-grant">
  87. 立减金发放明细
  88. </el-menu-item>
  89. </el-sub-menu>
  90. </el-sub-menu>
  91. </el-sub-menu>
  92. <el-sub-menu index="system">
  93. <template #title>
  94. <el-icon><Tools /></el-icon>
  95. <span>系统设置</span>
  96. </template>
  97. <el-menu-item index="/system/users">用户管理</el-menu-item>
  98. <el-menu-item index="/system/roles">角色管理</el-menu-item>
  99. </el-sub-menu>
  100. </el-menu>
  101. </aside>
  102. <!-- 主内容区 -->
  103. <div class="main">
  104. <!-- 顶部栏 -->
  105. <header class="header">
  106. <el-icon class="toggle-btn" @click="collapsed = !collapsed">
  107. <component :is="collapsed ? 'Expand' : 'Fold'" />
  108. </el-icon>
  109. <el-breadcrumb separator="/" class="breadcrumb">
  110. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  111. <el-breadcrumb-item v-if="currentTitle">
  112. {{ currentTitle }}
  113. </el-breadcrumb-item>
  114. </el-breadcrumb>
  115. <el-dropdown trigger="click" @command="handleUserCommand">
  116. <span class="user-info">
  117. <el-icon><UserFilled /></el-icon>
  118. {{ username }}
  119. <el-icon><ArrowDown /></el-icon>
  120. </span>
  121. <template #dropdown>
  122. <el-dropdown-menu>
  123. <el-dropdown-item command="logout">退出登录</el-dropdown-item>
  124. </el-dropdown-menu>
  125. </template>
  126. </el-dropdown>
  127. </header>
  128. <!-- 页面内容 -->
  129. <div class="content">
  130. <router-view />
  131. </div>
  132. </div>
  133. </div>
  134. </template>
  135. <script>
  136. import { ElMessageBox } from 'element-plus'
  137. export default {
  138. name: 'Layout',
  139. data() {
  140. return {
  141. collapsed: false,
  142. username: localStorage.getItem('username') || '用户'
  143. }
  144. },
  145. computed: {
  146. currentTitle() {
  147. return this.$route.meta?.title || ''
  148. }
  149. },
  150. methods: {
  151. handleUserCommand(cmd) {
  152. if (cmd === 'logout') {
  153. ElMessageBox.confirm('确定要退出登录吗?', '提示', {
  154. confirmButtonText: '退出',
  155. cancelButtonText: '取消',
  156. type: 'warning'
  157. }).then(() => {
  158. localStorage.removeItem('token')
  159. localStorage.removeItem('username')
  160. this.$router.replace('/login')
  161. }).catch(() => {})
  162. }
  163. }
  164. }
  165. }
  166. </script>
  167. <style scoped>
  168. .layout { display: flex; height: 100vh; overflow: hidden; }
  169. .sidebar {
  170. width: 210px;
  171. background: #304156;
  172. transition: width 0.3s;
  173. display: flex;
  174. flex-direction: column;
  175. flex-shrink: 0;
  176. overflow: hidden;
  177. }
  178. .sidebar.collapsed { width: 64px; }
  179. .logo {
  180. height: 60px;
  181. display: flex;
  182. align-items: center;
  183. justify-content: center;
  184. gap: 10px;
  185. color: #fff;
  186. font-size: 18px;
  187. font-weight: bold;
  188. background: #263445;
  189. overflow: hidden;
  190. white-space: nowrap;
  191. }
  192. .logo .el-icon { font-size: 22px; flex-shrink: 0; }
  193. .el-menu {
  194. border: none;
  195. flex: 1;
  196. min-height: 0;
  197. overflow-x: hidden;
  198. overflow-y: auto;
  199. }
  200. .el-menu--collapse { width: 64px; }
  201. .el-menu::-webkit-scrollbar { width: 6px; }
  202. .el-menu::-webkit-scrollbar-thumb {
  203. background: rgba(191, 203, 217, .28);
  204. border-radius: 6px;
  205. }
  206. .el-menu::-webkit-scrollbar-track { background: transparent; }
  207. .main { flex: 1; display: flex; flex-direction: column; overflow: hidden; }
  208. .header {
  209. height: 60px;
  210. background: #fff;
  211. box-shadow: 0 1px 4px rgba(0,21,41,.08);
  212. display: flex;
  213. align-items: center;
  214. padding: 0 20px;
  215. gap: 16px;
  216. flex-shrink: 0;
  217. }
  218. .toggle-btn { font-size: 20px; cursor: pointer; color: #606266; }
  219. .toggle-btn:hover { color: #409EFF; }
  220. .breadcrumb { flex: 1; }
  221. .user-info {
  222. display: inline-flex;
  223. align-items: center;
  224. gap: 6px;
  225. color: #606266;
  226. cursor: pointer;
  227. font-size: 14px;
  228. }
  229. .user-info:hover { color: #409EFF; }
  230. .user-info .el-icon { font-size: 16px; }
  231. .content {
  232. flex: 1;
  233. padding: 20px;
  234. background: #f0f2f5;
  235. overflow-y: auto;
  236. }
  237. </style>