WebApp <meta>函数

本文详细介绍了如何通过使用meta标签来实现移动端Web页面的适配与优化,包括设置viewport以确保页面能在不同设备上正确显示,利用特定的meta标签隐藏工具栏、菜单栏以及改变状态栏样式,同时提供了如何禁止设备将页面中的数字识别为电话号码的方法。

viewpor: 可是区域             

    width: viewport 的宽度 (范围从 200 到 10,000 ,默认为 980 像素 )

    height: viewport 的高度 (范围从 223 到 10,000 )

    initial-scale: 初始的缩放比例 (范围从>0到 10 )

    minimum-scale: 允许用户缩放到的最小比例

    maximum-scale: 允许用户缩放到的最大比例

    user-scalable: 用户是否可以手动缩放

    设置全屏:<meta name=”viewport” content=”width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;” />

name: 属性

    <meta name="Generator" contect="Microsoft FrontPage 4.0">        用以说明生成工具(Microsoft FrontPage 4.0)等;

    <meta name="keywords" contect="关键字">                                         向搜索引擎说明你的网页的关键词;

    <meta name="Description" contect="关键内容">                                  告诉搜索引擎你的站点的主要内容;

    <meta name="Author" contect="姓名">                                                  告诉搜索引擎你的站点的制作的作者;

    <meta name="Robots" contect="all | none | index | noindex | follow | nofollow">

                                              设定为all:文件将被检索,且页面上的链接可以被查询;

                                              设定为none:文件将不被检索,且页面上的链接不可以被查询;

                                              设定为index:文件将被检索;

                                              设定为follow:页面上的链接可以被查询;

                                              设定为noindex:文件将不被检索,但页面上的链接可以被查询;

                                              设定为nofollow:文件将不被检索,页面上的链接可以被查询

用法

    <meta name="apple-touch-fullscreen" content="yes"> 

               添加到主屏幕后,全屏显示。

    <meta name="apple-mobile-web-app-capable" content="yes" />

               这meta的作用就是删除默认的苹果工具栏和菜单栏。content有两

               个值”yes”和”no”,当我们需要显示工具栏和菜单栏时,这个行meta就不用加了,默认就是显示。

    <meta name=”apple-mobile-web-app-status-bar-style” content=black” />

               默认值为default(白色),可以定为black(黑色)和black-translucent(灰色半透明)。

               注意: 若值为“black-translucent”将会占据页面px位置,浮在页面上方 (20-40)px

    <meta name="apple-mobile-web-app-capable" content="yes">

    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">

               在iOS中有两个meta值,apple-mobile-web-app-capable和apple-mobile-web-app-status-bar-style,这两个会让网页内容以应用

               程序风格显示,并使状态栏透明。

    <link rel="apple-touch-icon-precomposed" href="http://spion.blog.163.com/blog/iphone_milanoo.png" />

               说明: 这个link就是设置web app的放置主屏幕上icon文件路径。

               图片尺寸可以设定为57*57(px)或者Retina可以定为114*114(px),ipad尺寸为72*72(px)

    <meta content="telephone=no" name="format-detection" />

               告诉设备忽略将页面中的数字识别为电话号码

    <meta content="email=no" name="format-detection" /> 

              将不识别邮箱

    <link rel="apple-touch-icon" href="/static/images/identity/HTML5_Badge_64.png" />

    <link rel="apple-touch-icon-precomposed" href="/static/images/identity/HTML5_Badge_64.png" />

   iOS用rel="apple-touch-icon",android 用rel="apple-touch-icon-precomposed"

             这样就能在用户把网页存为书签时,在手机HOME界面创建应用程序样式的图标。

   <meta name="sharecontent" data-msg-img="缩略图地址" data-msg-title="标题" data-msg-content="

    简介" datamsgcallBack="" dataline-img="缩略图地址" data-line-title="标题" data-line-callBack=""/>  

             微信分享页面设置




以下是按照你的要求逐步完成该动态网页工程的详细步骤: 1. 打开Eclipse并新建动态网页工程 打开Eclipse,选择 File  ->  New  ->  Dynamic Web Project ,在 Project name 处输入“学生姓名拼音缩写+Pro” ,例如“ZhanSanPro”,然后按照向导完成项目创建,注意选择合适的目标运行时环境(如Tomcat)以及项目的配置选项。 2. 创建实体类 在 src 目录下创建一个包,例如 com.example.entity ,然后在该包下创建 User 类:   package com.example.entity; import java.io.Serializable; public class User implements Serializable { private String account; private String name; private String password; private String identity; private String email; // 无参构造函数 public User() { } // 有参构造函数 public User(String account, String name, String password, String identity, String email) { this.account = account; this.name = name; this.password = password; this.identity = identity; this.email = email; } // Getter和Setter方法 public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getIdentity() { return identity; } public void setIdentity(String identity) { this.identity = identity; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "account='" + account + '\'' + ", name='" + name + '\'' + ", password='" + password + '\'' + ", identity='" + identity + '\'' + ", email='" + email + '\'' + '}'; } }   03. 创建业务逻辑层接口及其实现类 业务逻辑层接口  UserService  在 src 目录下创建 com.example.service 包,在该包下创建 UserService 接口:   package com.example.service; import com.example.entity.User; public interface UserService { User login(String account, String password); }   业务逻辑层接口实现类  UserServiceImpl  在 com.example.service.impl 包下创建 UserServiceImpl 类:   package com.example.service.impl; import com.example.entity.User; import com.example.service.UserService; import java.util.ArrayList; import java.util.List; public class UserServiceImpl implements UserService { // 模拟数据库中的用户列表 private static final List<User> users = new ArrayList<>(); static { users.add(new User("zhangsan", "张三", "123456", "学生", "zhangsan@example.com")); } @Override public User login(String account, String password) { for (User user : users) { if (user.getAccount().equals(account) && user.getPassword().equals(password)) { return user; } } return null; } }   04. 创建表现层控制器类 在 com.example.controller 包下创建 UserController 类:   package com.example.controller; import com.example.entity.User; import com.example.service.UserService; import com.example.service.impl.UserServiceImpl; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; @WebServlet("/UserController") public class UserController extends HttpServlet { private UserService userService = new UserServiceImpl(); @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String account = request.getParameter("account"); String password = request.getParameter("password"); User user = userService.login(account, password); HttpSession session = request.getSession(); if (user != null) { session.setAttribute("user", user); response.sendRedirect("main.jsp"); } else { request.setAttribute("error", "用户名或密码错误"); request.getRequestDispatcher("login.jsp").forward(request, response); } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if ("logout".equals(action)) { HttpSession session = request.getSession(false); if (session != null) { session.invalidate(); } response.sendRedirect("login.jsp"); } } }   5. 创建拦截器类 在 com.example.interceptor 包下创建 LoginInterceptor 类:   package com.example.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String uri = request.getRequestURI(); if (uri.contains("login.jsp") || uri.contains("UserController") || uri.contains("action=logout")) { return true; } HttpSession session = request.getSession(false); if (session != null && session.getAttribute("user") != null) { return true; } request.setAttribute("error", "未登录,请先登录"); request.getRequestDispatcher("login.jsp").forward(request, response); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }   6. 创建登录页面  login.jsp  在 WebContent 目录下创建 login.jsp 文件:   <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>用户登录</title> <style> body { font-family: Arial, sans-serif; background-color: #f4f4f4; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; } .login-container { background-color: #fff; padding: 20px; border-radius: 5px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); width: 300px; } .login-container h2 { text-align: center; margin-bottom: 20px; } .login-container input[type="text"], .login-container input[type="password"] { width: 100%; padding: 10px; margin-bottom: 15px; border: 1px solid #ccc; border-radius: 3px; } .login-container input[type="submit"] { width: 100%; padding: 10px; background-color: # 007BFF; color: #fff; border: none; border-radius: 3px; cursor: pointer; } .login-container input[type="submit"]:hover { background-color: # 0056b3; } .error-message { color: red; text-align: center; margin-bottom: 10px; } </style> </head> <body> <div class="login-container"> <h2>用户登录</h2> <% if (request.getAttribute("error") != null) { %> <p class="error-message"><%= request.getAttribute("error") %></p> <% } %> <form action="UserController" method="post"> <input type="text" name="account" placeholder="账号" required> <input type="password" name="password" placeholder="密码" required> <input type="submit" value="登录"> </form> </div> </body> </html>   07. 创建“智慧校园”主页面  main.jsp  在 WebContent 目录下创建 main.jsp 文件:   <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page session="true" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>智慧校园 - 主页面</title> <style> body { font-family: Arial, sans-serif; margin: 0; padding: 0; display: flex; flex-direction: column; height: 100vh; } header { background-color: # 0333; color: white; padding: 10px 20px; display: flex; justify-content: space-between; align-items: center; } nav { width: 200px; background-color: #f4f4f4; padding: 20px; } nav a { display: block; margin-bottom: 10px; text-decoration: none; color: # 0333; } nav a:hover { color: # 007BFF; } section { flex: 1; padding: 20px; } </style> </head> <body> <header> <% com.example.entity.User user = (com.example.entity.User) session.getAttribute("user"); if (user != null) { %> <span>欢迎,<%= user.getName() %></span> <a href="UserController?action=logout">退出登录</a> <% } %> </header> <div style="display: flex; flex: 1;"> <nav> <a href="#">智慧教室</a> <a href="#">智慧图书</a> <a href="#">智慧食堂</a> </nav> <section> <h2>欢迎来到智慧校园</h2> <p>请选择左侧导航栏的功能进行操作。</p> </section> </div> </body> </html>   8. 创建配置文件实现框架整合  spring-config.xml  在 src 目录下创建 spring-config.xml 文件:   <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 自动扫描包 --> <context:component-scan base-package="com.example"/> <!-- 配置Spring MVC的注解驱动 --> <mvc:annotation-driven/> <!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.example.interceptor.LoginInterceptor"/> </mvc:interceptor> </mvc:interceptors> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> </beans>    mybatis-config.xml  在 src 目录下创建 mybatis-config.xml 文件(这里只是简单示例,实际项目可根据需求扩展):   <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 配置环境 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/your_database"/> <property name="username" value="your_username"/> <property name="password" value="your_password"/> </dataSource> </environment> </environments> <!-- 映射器 --> <mappers> <!-- 可以添加具体的映射文件 --> </mappers> </configuration>    web.xml  在 WebContent/WEB-INF 目录下的 web.xml 文件中添加以下配置:   <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <display-name>ZhanSanPro</display-name> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> <!-- 配置Spring的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-config.xml</param-value> </context-param> <!-- 配置Spring MVC的前端控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>   9. 启动Tomcat并部署应用 在Eclipse中配置好Tomcat服务器,将项目添加到服务器中并启动Tomcat。启动成功后,在浏览器中访问 http://localhost:8080/ZhanSanPro/login.jsp ,应该能看到登录页面。输入正确的账号和密码进行登录,登录成功后会跳转到主页面。 010. 提交文档 将项目文件整理打包,按照“学号+姓名”的命名要求提交文档,文档中除了项目文件外,还可以附上数据库表的设计(如果有数据库操作的话)、项目的说明文档、测试用例等内容,方便后续的评审和交流。 注意事项 上述代码中的数据库连接部分是模拟实现,在实际项目中需要根据实际情况配置数据库连接信息。 要确保项目中引入了Spring、Spring MVC、MyBatis等相关的依赖库,可以通过Maven或者手动添加JAR包的方式引入。 对于前端页面的样式,可以根据自己的审美和需求进一步优化和调整。
06-13
package com.qf.controller; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.qf.service.UserChangePasswordService; import com.qf.service.UserService; import com.qf.util.Response; import com.qf.util.Response1; import com.qf.util.*; // 推荐 // 或 import com.qf.util.Response; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; import java.sql.SQLException; import java.util.Map; // src/main/java/com/qf/controller/ChangePasswordServlet.java // ✅ ChangePasswordServlet最终改进版 @WebServlet("/api/student/changePassword") public class ChangePasswordServlet extends HttpServlet { private UserChangePasswordService userChangePasswordService = new UserChangePasswordService(); private ObjectMapper objectMapper = new ObjectMapper(); protected void doPut(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("application/json;charset=UTF-8"); PrintWriter out = response.getWriter(); try { HttpSession session = request.getSession(false); if (session == null || session.getAttribute("userId") == null) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); out.write(objectMapper.writeValueAsString(Response1.error("未登录"))); return; } JsonNode jsonNode = objectMapper.readTree(request.getInputStream()); String oldPassword = jsonNode.get("oldPassword").asText(); String newPassword = jsonNode.get("newPassword").asText(); boolean result = userChangePasswordService.changePassword( (Long) session.getAttribute("userId"), oldPassword, newPassword ); if (result) { session.invalidate(); // 修改密码后强制登出 out.write(objectMapper.writeValueAsString(Response1.success("密码修改成功"))); } else { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); out.write(objectMapper.writeValueAsString(Response1.error("旧密码错误"))); } } catch (SQLException e) { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); out.write(objectMapper.writeValueAsString(Response1.error("系统错误"))); } finally { out.close(); } } } package com.qf.dao; import com.qf.entity.User; import com.qf.util.DatabaseUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class UserDao { public User findByUsername(String username) throws SQLException { String sql = "SELECT * FROM sys_user WHERE username = ?"; try (Connection connection = DatabaseUtil.getConnection(); PreparedStatement ps = connection.prepareStatement(sql)) { ps.setString(1, username); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { User user = new User(); user.setUserId(rs.getLong("user_id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); user.setSalt(rs.getString("salt")); user.setRole(rs.getInt("role")); user.setStatus(rs.getInt("status")); return user; } } } return null; } // 更新用户密码和盐值 public boolean updatePassword(Long userId, String hashedPassword, String salt) throws SQLException { String sql = "UPDATE sys_user SET password = ?, salt = ? WHERE user_id = ?"; try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, hashedPassword); ps.setString(2, salt); ps.setLong(3, userId); return ps.executeUpdate() > 0; } } // 获取用户密码(用于验证旧密码) public String getPasswordByUserId(Long userId) throws SQLException { String sql = "SELECT password FROM sys_user WHERE user_id = ?"; try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setLong(1, userId); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { return rs.getString("password"); } } } return null; } public User getUserWithPassword(Long userId) throws SQLException { String sql = "SELECT password, salt FROM sys_user WHERE user_id = ?"; try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setLong(1, userId); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { User user = new User(); user.setPassword(rs.getString("password")); user.setSalt(rs.getString("salt")); return user; } } } return null; } } package com.qf.service; import com.qf.dao.UserDao; import com.qf.entity.User; import com.qf.util.PasswordUtil1; import java.sql.SQLException; public class UserChangePasswordService { private UserDao userDao = new UserDao(); // 修改密码的方法 public boolean changePassword(Long userId, String oldPassword, String newPassword) throws SQLException { // 1. 获取用户密码和盐值 User user = userDao.getUserWithPassword(userId); if (user == null) return false; String storedPassword = user.getPassword(); String salt = user.getSalt(); // 2. 使用盐值验证旧密码 if (!storedPassword.equals(PasswordUtil1.hashPassword(oldPassword + salt))) { return false; } // 3. 生成新盐值和加密密码 String newSalt = PasswordUtil1.generateSalt(); String hashedNewPassword = PasswordUtil1.hashPassword(newPassword + newSalt); // 4. 更新数据库 return userDao.updatePassword(userId, hashedNewPassword, newSalt); } } package com.qf.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.UUID; public class PasswordUtil1 { public static String generateSalt() { return UUID.randomUUID().toString(); } // ✅ 加密方法保持一致性 public static String hashPassword(String input) { try { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] hash = md.digest(input.getBytes()); StringBuilder hexString = new StringBuilder(); for (byte b : hash) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) hexString.append('0'); hexString.append(hex); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } } package com.qf.util; // ✅ src/main/java/com/qf/util/Response.java public class Response1 { private String status; private String message; public static Response1 success(String message) { return new Response1("success", message); } public static Response1 error(String message) { return new Response1("error", message); } private Response1(String status, String message) { this.status = status; this.message = message; } // Getters public String getStatus() { return status; } public String getMessage() { return message; } } <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>学生后台管理</title> <link rel="stylesheet" href="css/student.css"> </head> <body> <div class="container"> <h1>学生后台管理</h1> <div class="menu"> <button id="viewProfile">查看个人信息</button> <button id="selectCourse">选课</button> <button id="viewGrades">查看成绩/课表</button> <button id="changePassword">修改密码</button> </div> <div id="content"></div> </div> <script src="js/jquery-2.1.0.min.js"></script> <script> $(document).ready(function() { // 查看个人信息 $('#viewProfile').click(function() { $.ajax({ url: '/api/student/profile', type: 'GET', dataType:"json", success: function(data) { console.log(data) let content = `<h2>个人信息</h2> <p>姓名: ${data.name}</p> <p>学号: ${data.stuNumber}</p> <p>班级: ${data.classId}</p> <p>性别: ${data.gender === 1 ? '男' : '女'}</p> <p>电话: ${data.phone}</p> <p>邮箱: ${data.email}</p>`; $('#content').html(content); }, error: function() { $('#content').html('<p>加载个人信息失败</p>'); } }); }); // 选课 $('#selectCourse').click(function() { $.ajax({ url: '/api/student/courses', type: 'GET', success: function(data) { let content = `<h2>选课</h2> <form id="selectCourseForm"> <label for="courseId">课程ID</label> <input type="text" id="courseId" name="courseId" required> <button type="submit">选课</button> </form>`; $('#content').html(content); // 提交选课表单 $('#selectCourseForm').on('submit', function(event) { event.preventDefault(); let courseId = $('#courseId').val(); $.ajax({ url: '/api/student/selectCourse', type: 'POST', data: { courseId: courseId }, success: function(response) { alert(response.message); }, error: function() { alert('选课失败'); } }); }); }, error: function() { $('#content').html('<p>加载选课信息失败</p>'); } }); }); // 查看成绩/课表 $('#viewGrades').click(function() { $.ajax({ url: '/api/student/grades', type: 'GET', success: function(data) { let content = `<h2>成绩/课表</h2> <table> <thead> <tr> <th>课程ID</th> <th>课程名称</th> <th>成绩</th> </tr> </thead> <tbody>`; data.forEach(function(grade) { content += `<tr> <td>${grade.courseId}</td> <td>${grade.courseName}</td> <td>${grade.grade}</td> </tr>`; }); content += `</tbody></table>`; $('#content').html(content); }, error: function() { $('#content').html('<p>加载成绩/课表失败</p>'); } }); }); // 修改密码 // src/main/webapp/dashboard.html 修改密码部分 // ✅ 完整表单生成代码 $('#changePassword').click(function() { let content = `<h2>修改密码</h2> <form id="changePasswordForm" class="password-form"> <div class="form-group"> <label for="oldPassword">旧密码</label> <input type="password" id="oldPassword" name="oldPassword" required> </div> <div class="form-group"> <label for="newPassword">新密码</label> <input type="password" id="newPassword" name="newPassword" required> </div> <div class="form-group"> <label for="confirmPassword">确认密码</label> <input type="password" id="confirmPassword" name="confirmPassword" required> </div> <button type="submit">修改密码</button> </form>`; $('#content').html(content); }); // ✅ 使用事件委托绑定动态表单 $('#content').on('submit', '#changePasswordForm', function(event) { event.preventDefault(); // 表单验证逻辑 let oldPassword = $('#oldPassword').val().trim(); let newPassword = $('#newPassword').val().trim(); let confirmPassword = $('#confirmPassword').val().trim(); // 密码一致性校验 if (!oldPassword || !newPassword || !confirmPassword) { alert("所有字段都不能为空"); return; } if (newPassword !== confirmPassword) { alert("两次输入的新密码不一致"); return; } if (newPassword.length < 6) { alert("新密码长度不能少于6位"); return; } // 发送AJAX请求 $.ajax({ url: '/api/student/changePassword', type: 'PUT', contentType: 'application/json', data: JSON.stringify({ oldPassword: oldPassword, newPassword: newPassword }), success: function(response) { alert(response.message); if (response.code === 200) { $('#changePasswordForm')[0].reset(); // 清空表单 window.location.href = '/login.html'; // 强制重新登录 } }, error: function(xhr) { alert(`修改失败: ${xhr.responseJSON?.message || "网络异常"}`); } }); }); }); </script> </body> </html> 为什么修改密码时 原密码一直错误
06-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值