safe.ejs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <% include ./sub_menu.ejs %>
  2. <div class="panel-content" id="app">
  3. <div class="panel-title">
  4. <div class="title-main">
  5. <h2>账号安全</h2>
  6. </div>
  7. </div>
  8. <div class="content-wrap">
  9. <div class="c-body">
  10. <div class="sjs-height-0">
  11. <div class="row m-0">
  12. <div class="col-6 my-3">
  13. <!--账号安全-->
  14. <form action="/profile/password" method="post" id="password-form">
  15. <% if(accountData.password !== 'SSO password') { %>
  16. <input-text label="旧密码" password="true" name="password"></input-text>
  17. <input-text label="新密码" password="true" name="new_password" id="new_password"></input-text>
  18. <input-text label="确认新密码" password="true" name="confirm_password"></input-text>
  19. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>">
  20. <button type="submit" class="btn btn-primary btn-sm" id="modify-password">修改密码</button>
  21. <% } else { %>
  22. <p>SSO用户请到<a href="#">此处</a>修改密码</p>
  23. <% } %>
  24. </form>
  25. <!-- 访问日志 -->
  26. <div class="col-12 mt-5">
  27. <h4>访问日志</h4>
  28. <table class="table table-hover">
  29. <thead>
  30. <tr>
  31. <th></th>
  32. <th>系统</th>
  33. <th>浏览器</th>
  34. <th>登录时间</th>
  35. <th>登录地址</th>
  36. </tr>
  37. </thead>
  38. <tbody>
  39. <% loginLogging.forEach((item, idx) => { %>
  40. <tr>
  41. <td><%- idx + 1 %></td>
  42. <td><%- item.os %></td>
  43. <td><%- item.browser %></td>
  44. <td><%- ctx.helper.formatFullDate(item.create_time) %></td>
  45. <td><%- item.address %></td>
  46. </tr>
  47. <% }) %>
  48. </tbody>
  49. </table>
  50. </div>
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. <script>
  58. $(document).ready(function() {
  59. $.validator.addMethod("isSafe", function(value, element) {
  60. const safe = /^(?![0-9]+$)(?![a-zA-Z]+$).{6,16}$/;
  61. // var safe = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>,.\/]).{6,16}$/;
  62. // var safe = /^(?=.*[a-zA-Z])(?=.*\d).{6,16}$/;
  63. return this.optional(element) || safe.test(value);
  64. }, "请设置至少包含数字和字母的密码");
  65. const options = {
  66. rules: '',
  67. messages: {},
  68. errorPlacement: function(error, element) {
  69. $(element).addClass('is-invalid');
  70. $(element).after(error);
  71. },
  72. errorClass: "invalid-feedback",
  73. errorElement: "div",
  74. highlight: false,
  75. success: function(element) {
  76. $(element).siblings('input').removeClass('is-invalid');
  77. $(element).remove();
  78. },
  79. };
  80. options.rules = {
  81. password: {
  82. required: true,
  83. minlength: 6,
  84. },
  85. new_password: {
  86. required: true,
  87. minlength: 6,
  88. maxlength: 16,
  89. isSafe: true,
  90. },
  91. confirm_password : {
  92. required: true,
  93. minlength: 6,
  94. maxlength: 16,
  95. equalTo: '#new_password',
  96. },
  97. };
  98. $("#password-form").validate(options);
  99. });
  100. </script>
  101. <script src="/public/js/validate.extend.js"></script>
  102. <script type="text/javascript">
  103. new Vue({
  104. el: '#app',
  105. });
  106. const csrf = '<%= ctx.csrf %>';
  107. </script>
  108. <script type="text/javascript" src="/public/js/profile.js"></script>