styles.css 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. /* 全局样式 */
  2. body {
  3. background-color: #f8f9fa;
  4. font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  5. }
  6. /* 导航栏样式 */
  7. .navbar-brand {
  8. font-weight: 600;
  9. }
  10. .navbar-brand i {
  11. margin-right: 8px;
  12. }
  13. /* 页面内容 */
  14. .page-content {
  15. min-height: calc(100vh - 100px);
  16. }
  17. /* 统计卡片 */
  18. .stat-card {
  19. border: none;
  20. border-radius: 12px;
  21. box-shadow: 0 2px 10px rgba(0,0,0,0.1);
  22. transition: transform 0.2s ease;
  23. }
  24. .stat-card:hover {
  25. transform: translateY(-2px);
  26. }
  27. .stat-icon {
  28. font-size: 2rem;
  29. opacity: 0.7;
  30. }
  31. /* 卡片样式 */
  32. .card {
  33. border: none;
  34. border-radius: 12px;
  35. box-shadow: 0 2px 10px rgba(0,0,0,0.1);
  36. margin-bottom: 20px;
  37. }
  38. .card-header {
  39. background-color: #fff;
  40. border-bottom: 1px solid #e9ecef;
  41. border-radius: 12px 12px 0 0 !important;
  42. font-weight: 600;
  43. }
  44. /* 节点列表样式 */
  45. .node-item {
  46. border: 1px solid #e9ecef;
  47. border-radius: 8px;
  48. padding: 15px;
  49. margin-bottom: 10px;
  50. background: white;
  51. transition: all 0.2s ease;
  52. }
  53. .node-item:hover {
  54. box-shadow: 0 4px 12px rgba(0,0,0,0.1);
  55. transform: translateY(-1px);
  56. }
  57. .node-header {
  58. display: flex;
  59. justify-content: between;
  60. align-items: center;
  61. margin-bottom: 10px;
  62. }
  63. .node-name {
  64. font-weight: 600;
  65. color: #333;
  66. }
  67. .node-status {
  68. padding: 4px 8px;
  69. border-radius: 12px;
  70. font-size: 0.8rem;
  71. font-weight: 500;
  72. }
  73. .node-status.online {
  74. background-color: #d4edda;
  75. color: #155724;
  76. }
  77. .node-status.offline {
  78. background-color: #f8d7da;
  79. color: #721c24;
  80. }
  81. .node-info {
  82. display: grid;
  83. grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  84. gap: 10px;
  85. font-size: 0.9rem;
  86. color: #666;
  87. }
  88. .node-info-item {
  89. display: flex;
  90. align-items: center;
  91. }
  92. .node-info-item i {
  93. margin-right: 5px;
  94. width: 16px;
  95. }
  96. /* 测速结果样式 */
  97. .result-item {
  98. border: 1px solid #e9ecef;
  99. border-radius: 8px;
  100. padding: 15px;
  101. margin-bottom: 10px;
  102. background: white;
  103. }
  104. .result-success {
  105. border-left: 4px solid #28a745;
  106. }
  107. .result-failure {
  108. border-left: 4px solid #dc3545;
  109. }
  110. .result-header {
  111. display: flex;
  112. justify-content: between;
  113. align-items: center;
  114. margin-bottom: 10px;
  115. }
  116. .result-node {
  117. font-weight: 600;
  118. color: #333;
  119. }
  120. .result-time {
  121. color: #666;
  122. font-size: 0.9rem;
  123. }
  124. .result-details {
  125. display: grid;
  126. grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  127. gap: 10px;
  128. font-size: 0.9rem;
  129. }
  130. .result-detail {
  131. display: flex;
  132. align-items: center;
  133. }
  134. .result-detail i {
  135. margin-right: 5px;
  136. width: 16px;
  137. }
  138. /* 通知样式 */
  139. .notification-item {
  140. border: 1px solid #e9ecef;
  141. border-radius: 8px;
  142. padding: 15px;
  143. margin-bottom: 10px;
  144. background: white;
  145. }
  146. .notification-sent {
  147. border-left: 4px solid #28a745;
  148. }
  149. .notification-pending {
  150. border-left: 4px solid #ffc107;
  151. }
  152. .notification-failed {
  153. border-left: 4px solid #dc3545;
  154. }
  155. /* 按钮样式 */
  156. .btn {
  157. border-radius: 8px;
  158. font-weight: 500;
  159. transition: all 0.2s ease;
  160. }
  161. .btn:hover {
  162. transform: translateY(-1px);
  163. }
  164. .btn-primary {
  165. background-color: #0d6efd;
  166. border-color: #0d6efd;
  167. }
  168. .btn-success {
  169. background-color: #198754;
  170. border-color: #198754;
  171. }
  172. .btn-info {
  173. background-color: #0dcaf0;
  174. border-color: #0dcaf0;
  175. }
  176. .btn-warning {
  177. background-color: #ffc107;
  178. border-color: #ffc107;
  179. color: #000;
  180. }
  181. .btn-danger {
  182. background-color: #dc3545;
  183. border-color: #dc3545;
  184. }
  185. /* 表单样式 */
  186. .form-control, .form-select {
  187. border-radius: 8px;
  188. border: 1px solid #ced4da;
  189. transition: border-color 0.2s ease;
  190. }
  191. .form-control:focus, .form-select:focus {
  192. border-color: #0d6efd;
  193. box-shadow: 0 0 0 0.2rem rgba(13, 110, 253, 0.25);
  194. }
  195. /* 分页样式 */
  196. .pagination {
  197. justify-content: center;
  198. margin-top: 20px;
  199. }
  200. .page-link {
  201. border-radius: 6px;
  202. margin: 0 2px;
  203. border: 1px solid #dee2e6;
  204. }
  205. .page-link:hover {
  206. background-color: #e9ecef;
  207. }
  208. .page-item.active .page-link {
  209. background-color: #0d6efd;
  210. border-color: #0d6efd;
  211. }
  212. /* 加载覆盖层 */
  213. .loading-overlay {
  214. position: fixed;
  215. top: 0;
  216. left: 0;
  217. width: 100%;
  218. height: 100%;
  219. background-color: rgba(0, 0, 0, 0.5);
  220. display: flex;
  221. justify-content: center;
  222. align-items: center;
  223. z-index: 9999;
  224. }
  225. .loading-spinner {
  226. text-align: center;
  227. color: white;
  228. }
  229. /* 响应式设计 */
  230. @media (max-width: 768px) {
  231. .node-info {
  232. grid-template-columns: 1fr;
  233. }
  234. .result-details {
  235. grid-template-columns: 1fr;
  236. }
  237. .stat-card {
  238. margin-bottom: 15px;
  239. }
  240. }
  241. /* 动画效果 */
  242. @keyframes fadeIn {
  243. from {
  244. opacity: 0;
  245. transform: translateY(20px);
  246. }
  247. to {
  248. opacity: 1;
  249. transform: translateY(0);
  250. }
  251. }
  252. .fade-in {
  253. animation: fadeIn 0.3s ease;
  254. }
  255. /* 状态指示器 */
  256. .status-indicator {
  257. display: inline-flex;
  258. align-items: center;
  259. gap: 5px;
  260. }
  261. .status-indicator i {
  262. font-size: 0.8rem;
  263. }
  264. /* 工具提示 */
  265. .tooltip {
  266. font-size: 0.8rem;
  267. }
  268. /* 徽章样式 */
  269. .badge {
  270. border-radius: 12px;
  271. font-weight: 500;
  272. }
  273. /* 进度条样式 */
  274. .progress {
  275. border-radius: 10px;
  276. height: 8px;
  277. }
  278. .progress-bar {
  279. border-radius: 10px;
  280. }
  281. /* 表格样式 */
  282. .table {
  283. border-radius: 8px;
  284. overflow: hidden;
  285. }
  286. .table th {
  287. background-color: #f8f9fa;
  288. border-bottom: 2px solid #dee2e6;
  289. font-weight: 600;
  290. }
  291. .table td {
  292. vertical-align: middle;
  293. }
  294. /* 模态框样式 */
  295. .modal-content {
  296. border-radius: 12px;
  297. border: none;
  298. box-shadow: 0 10px 30px rgba(0,0,0,0.3);
  299. }
  300. .modal-header {
  301. border-bottom: 1px solid #e9ecef;
  302. border-radius: 12px 12px 0 0;
  303. }
  304. .modal-footer {
  305. border-top: 1px solid #e9ecef;
  306. border-radius: 0 0 12px 12px;
  307. }
  308. /* 自定义滚动条 */
  309. ::-webkit-scrollbar {
  310. width: 8px;
  311. }
  312. ::-webkit-scrollbar-track {
  313. background: #f1f1f1;
  314. border-radius: 4px;
  315. }
  316. ::-webkit-scrollbar-thumb {
  317. background: #c1c1c1;
  318. border-radius: 4px;
  319. }
  320. ::-webkit-scrollbar-thumb:hover {
  321. background: #a8a8a8;
  322. }