layout.html 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. {% extends "base/base.html" %} {% block head %}
  2. <link rel="stylesheet" href="{{ url_for('static', filename='layout.css') }}" />
  3. {% block page_head %}{% endblock %} {% endblock %} {% block content %}
  4. <nav class="navbar navbar-expand-lg navbar-dark">
  5. <div class="container-fluid">
  6. <a class="navbar-brand" href="#">IWB</a>
  7. <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
  8. <span class="navbar-toggler-icon"></span>
  9. </button>
  10. <div class="collapse navbar-collapse" id="navbarNav">
  11. <ul class="navbar-nav me-auto mb-2 mb-lg-0">
  12. <li class="nav-item">
  13. <a class="nav-link active" aria-current="page" href="#">首页</a>
  14. </li>
  15. </ul>
  16. <div class="d-flex align-items-center">
  17. <div class="dropdown">
  18. <a href="#" class="d-flex align-items-center text-white text-decoration-none dropdown-toggle" id="userDropdown" data-bs-toggle="dropdown" aria-expanded="false">
  19. <div class="rounded-circle me-2 d-flex align-items-center justify-content-center bg-primary text-white" style="width: 32px; height: 32px">{{ current_user.name[0].upper() if current_user and current_user.is_authenticated and current_user.name else '?' }}</div>
  20. <span>{{ current_user.name if current_user and current_user.is_authenticated and current_user.name else '未登录' }}</span>
  21. </a>
  22. <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userDropdown">
  23. <li><a class="dropdown-item" href="#" data-bs-toggle="modal" data-bs-target="#changePasswordModal">修改密码</a></li>
  24. <li><hr class="dropdown-divider" /></li>
  25. <li><a class="dropdown-item" href="#" onclick="logout()">注销登录</a></li>
  26. </ul>
  27. </div>
  28. </div>
  29. </div>
  30. </div>
  31. </nav>
  32. <div class="container-fluid py-4">{% block page_content %}{% endblock %}</div>
  33. <footer class="footer mt-auto py-3">
  34. <div class="container text-center">
  35. <span>© 2024 IWB. All rights reserved.</span>
  36. </div>
  37. </footer>
  38. <!-- 修改密码模态框 -->
  39. <div class="modal fade" id="changePasswordModal" tabindex="-1" aria-labelledby="changePasswordModalLabel" aria-hidden="true">
  40. <div class="modal-dialog">
  41. <div class="modal-content">
  42. <div class="modal-header">
  43. <h5 class="modal-title" id="changePasswordModalLabel">修改密码</h5>
  44. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  45. </div>
  46. <div class="modal-body">
  47. <form id="changePasswordForm">
  48. <div class="mb-3">
  49. <label for="oldPassword" class="form-label">当前密码</label>
  50. <input type="password" class="form-control" id="oldPassword" required />
  51. </div>
  52. <div class="mb-3">
  53. <label for="newPassword" class="form-label">新密码</label>
  54. <input type="password" class="form-control" id="newPassword" required />
  55. </div>
  56. <div class="mb-3">
  57. <label for="confirmPassword" class="form-label">确认新密码</label>
  58. <input type="password" class="form-control" id="confirmPassword" required />
  59. </div>
  60. </form>
  61. </div>
  62. <div class="modal-footer">
  63. <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
  64. <button type="button" class="btn btn-primary" onclick="changePassword()">保存</button>
  65. </div>
  66. </div>
  67. </div>
  68. </div>
  69. {% endblock %} {% block scripts %}
  70. <script>
  71. function changePassword() {
  72. const oldPassword = document.getElementById('oldPassword').value
  73. const newPassword = document.getElementById('newPassword').value
  74. const confirmPassword = document.getElementById('confirmPassword').value
  75. if (newPassword !== confirmPassword) {
  76. alert('新密码与确认密码不匹配')
  77. return
  78. }
  79. fetch('/api/user/change-password', {
  80. method: 'POST',
  81. headers: {
  82. 'Content-Type': 'application/json',
  83. },
  84. body: JSON.stringify({
  85. old_password: oldPassword,
  86. new_password: newPassword,
  87. }),
  88. })
  89. .then((response) => response.json())
  90. .then((data) => {
  91. if (data.success) {
  92. alert('密码修改成功')
  93. $('#changePasswordModal').modal('hide')
  94. document.getElementById('changePasswordForm').reset()
  95. } else {
  96. alert(data.message || '密码修改失败')
  97. }
  98. })
  99. .catch((error) => {
  100. console.error('Error:', error)
  101. alert('发生错误,请稍后重试')
  102. })
  103. }
  104. function logout() {
  105. fetch('/api/auth/logout', {
  106. method: 'POST',
  107. headers: {
  108. 'Content-Type': 'application/json',
  109. },
  110. })
  111. .then((response) => response.json())
  112. .then((data) => {
  113. if (data.success) {
  114. window.location.href = '/login'
  115. } else {
  116. alert(data.message || '注销登录失败')
  117. }
  118. })
  119. .catch((error)=> {
  120. console.error('Error:', error)
  121. alert('发生错误,请稍后重试')
  122. })
  123. }
  124. </script>
  125. {% endblock %}