Layout.vue 8.0 KB

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