当前位置: 首页 > news >正文

初级网安作业笔记3

内容:自行搭建前端页面并分析

运行成功界面:

代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content="用户登录页面"><title>用户登录 | 系统名称</title><style>/* 全局样式重置与基础设置 */:root {--primary-color: #1a73e8;--primary-hover: #1557b0;--error-color: #d93025;--text-color: #5f6368;--border-color: #dadce0;--bg-color: #f0f2f5;--transition-time: 0.3s;}* {margin: 0;padding: 0;box-sizing: border-box;}body {font-family: 'Arial', sans-serif;background-color: var(--bg-color);display: flex;justify-content: center;align-items: center;min-height: 100vh;line-height: 1.6;color: var(--text-color);}/* 登录容器样式 */.login-container {background-color: white;padding: 2.5rem;border-radius: 10px;box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);width: 100%;max-width: 420px;margin: 1rem;animation: fadeIn 0.5s ease-out;}@keyframes fadeIn {from { opacity: 0; transform: translateY(20px); }to { opacity: 1; transform: translateY(0); }}/* 标题样式 */.login-title {text-align: center;margin-bottom: 1.8rem;color: var(--primary-color);font-size: 1.8rem;font-weight: 600;}/* 表单组样式 */.form-group {margin-bottom: 1.2rem;position: relative;}label {display: block;margin-bottom: 0.6rem;color: var(--text-color);font-weight: 500;font-size: 0.95rem;}/* 输入框样式 */input {width: 100%;padding: 0.9rem;border: 1px solid var(--border-color);border-radius: 6px;font-size: 1rem;transition: all var(--transition-time) ease;}input:focus {outline: none;border-color: var(--primary-color);box-shadow: 0 0 0 3px rgba(26, 115, 232, 0.15);}/* 密码输入框额外样式 */.password-container {position: relative;}.toggle-password {position: absolute;right: 12px;top: 50%;transform: translateY(-50%);background: none;border: none;color: var(--text-color);cursor: pointer;font-size: 0.9rem;padding: 0.5rem;}/* 按钮样式 */.login-btn {width: 100%;padding: 0.9rem;background-color: var(--primary-color);color: white;border: none;border-radius: 6px;font-size: 1rem;font-weight: 500;cursor: pointer;transition: background-color var(--transition-time);margin-top: 0.5rem;}.login-btn:hover {background-color: var(--primary-hover);}.login-btn:disabled {background-color: #cccccc;cursor: not-allowed;}/* 错误消息样式 */.error-message {color: var(--error-color);font-size: 0.8rem;margin-top: 0.4rem;display: none;animation: shake 0.3s ease;}@keyframes shake {0%, 100% { transform: translateX(0); }20%, 60% { transform: translateX(-3px); }40%, 80% { transform: translateX(3px); }}/* 额外链接样式 */.form-footer {margin-top: 1.5rem;text-align: center;font-size: 0.9rem;}.form-footer a {color: var(--primary-color);text-decoration: none;transition: color var(--transition-time);}.form-footer a:hover {color: var(--primary-hover);text-decoration: underline;}/* 响应式调整 */@media (max-width: 480px) {.login-container {padding: 1.8rem;}.login-title {font-size: 1.5rem;}}</style>
</head>
<body><div class="login-container"><h1 class="login-title">用户登录</h1><form id="loginForm" novalidate><div class="form-group"><label for="username">用户名</label><input type="text" id="username" name="username" requiredautocomplete="username"aria-describedby="usernameError"><div class="error-message" id="usernameError" role="alert">请输入有效的用户名</div></div><div class="form-group"><label for="password">密码</label><div class="password-container"><input type="password" id="password" name="password" requiredautocomplete="current-password"aria-describedby="passwordError"><button type="button" class="toggle-password" aria-label="显示密码">👁️</button></div><div class="error-message" id="passwordError" role="alert">请输入密码</div></div><button type="submit" class="login-btn" id="submitBtn">登录</button><div class="form-footer"><a href="#" id="forgotPassword">忘记密码?</a><span> | </span><a href="#" id="register">注册账号</a></div></form></div><script>document.addEventListener('DOMContentLoaded',  function() {const loginForm = document.getElementById('loginForm'); const usernameInput = document.getElementById('username'); const passwordInput = document.getElementById('password'); const submitBtn = document.getElementById('submitBtn'); const togglePasswordBtn = document.querySelector('.toggle-password'); // 显示/隐藏密码togglePasswordBtn.addEventListener('click',  function() {const type = passwordInput.getAttribute('type')  === 'password' ? 'text' : 'password';passwordInput.setAttribute('type',  type);this.textContent  = type === 'password' ? '👁️' : '👁️‍🗨️';});// 实时验证usernameInput.addEventListener('input',  validateUsername);passwordInput.addEventListener('input',  validatePassword);function validateUsername() {const username = usernameInput.value.trim(); const errorElement = document.getElementById('usernameError'); if (username === '') {showError(usernameInput, errorElement, '请输入用户名');return false;}if (username.length  < 4) {showError(usernameInput, errorElement, '用户名至少需要4个字符');return false;}hideError(usernameInput, errorElement);return true;}function validatePassword() {const password = passwordInput.value.trim(); const errorElement = document.getElementById('passwordError'); if (password === '') {showError(passwordInput, errorElement, '请输入密码');return false;}if (password.length  < 6) {showError(passwordInput, errorElement, '密码至少需要6个字符');return false;}hideError(passwordInput, errorElement);return true;}function showError(inputElement, errorElement, message) {errorElement.textContent  = message;errorElement.style.display  = 'block';inputElement.style.borderColor  = 'var(--error-color)';submitBtn.disabled  = true;}function hideError(inputElement, errorElement) {errorElement.style.display  = 'none';inputElement.style.borderColor  = 'var(--border-color)';// 只有两个验证都通过才启用按钮 if (validateUsername() && validatePassword()) {submitBtn.disabled  = false;}}// 表单提交 loginForm.addEventListener('submit',  async function(e) {e.preventDefault(); // 再次验证const isUsernameValid = validateUsername();const isPasswordValid = validatePassword();if (!isUsernameValid || !isPasswordValid) {return;}// 禁用按钮防止重复提交 submitBtn.disabled  = true;submitBtn.textContent  = '登录中...';try {// 模拟API请求延迟 await new Promise(resolve => setTimeout(resolve, 1500));// 这里应该是实际的API请求 // const response = await fetch('/api/login', {//     method: 'POST',//     headers: {//         'Content-Type': 'application/json'//     },//     body: JSON.stringify({ //         username: usernameInput.value.trim(), //         password: passwordInput.value.trim() //     })// });// if (!response.ok)  {//     throw new Error('登录失败');// }// 模拟成功响应 alert('登录成功!即将跳转到首页...');// window.location.href  = '/dashboard';} catch (error) {const errorElement = document.getElementById('passwordError'); showError(passwordInput, errorElement, '用户名或密码错误');console.error(' 登录错误:', error);} finally {submitBtn.disabled  = false;submitBtn.textContent  = '登录';}});// 忘记密码和注册链接document.getElementById('forgotPassword').addEventListener('click',  function(e) {e.preventDefault(); alert('忘记密码功能即将开放');});document.getElementById('register').addEventListener('click',  function(e) {e.preventDefault(); alert('注册功能即将开放');});});</script>
</body>
</html>

http://www.dtcms.com/a/294549.html

相关文章:

  • opencv学习(视频读取)
  • Spring Data Redis 从入门到精通:原理与实战指南
  • 2025暑期—06神经网络-常见网络
  • JVM、Dalvik、ART区别
  • JS逆向实战案例之———x日头条【a-bogus】分析
  • 解析 Chromium 架构分层下 Windows 与 Linux 链接器行为差异及其影响
  • [深度学习] 大模型学习3下-模型训练与微调
  • 提升ARM Cortex-M系统性能的关键技术:TCM技术解析与实战指南
  • C++11扩展 --- 并发支持库(中)
  • sqlsuger 子表获取主表中的一个字段的写法
  • 第一章:Go语言基础入门之Go语言安装与环境配置
  • 顺丰面试提到的一个算法题
  • OpenAI发布ChatGPT Agent,AI智能体迎来关键变革
  • Git原理及使用
  • android studio打包vue
  • Android Studio中调用USB摄像头
  • 广告业技术范式转移:当AI开始重构整个价值链
  • 硅基纪元:当人类成为文明演化的燃料——论AI终极形态下的存在论重构
  • 【Linux系统】基础IO(上)
  • Neo4j如何修改用户密码?
  • Codeforces Round 973 (Div. 2)
  • uniapp自定义圆形勾选框和全选框
  • 软件开发、项目开发基本步骤
  • MCU芯片AS32S601在卫星光纤放大器(EDFA)中的应用探索
  • NineData新增SQL Server到MySQL复制链路,高效助力异构数据库迁移
  • ubuntulinux快捷键
  • 「iOS」——KVC
  • ubuntu22.04 python升级并安装pip命令
  • 轻量化RTSP视频通路实践:采集即服务、播放即模块的工程解读
  • 第十讲:stack、queue、priority_queue以及deque