Maison >Java >javaDidacticiel >Comment modifier les données utilisateur Springboot

Comment modifier les données utilisateur Springboot

王林
王林avant
2023-05-19 17:16:571724parcourir

    Changer le mot de passe

    1 Couche de persistance du mot de passe de changement d'utilisateur

    1.1 Planifier les instructions SQL qui doivent être exécutées

    Les instructions SQL qui doivent être exécutées lorsque l'utilisateur modifie le mot de passe sont à peu près :

    UPDATE t_user SET password=?, modified_user=?, modified_time=? WHERE uid=?

    Avant d'exécuter le changement de mot de passe, vous devez également vérifier si les données utilisateur existent, vérifier si les données utilisateur sont marquées comme « supprimées » et vérifier si le mot de passe d'origine est correct. Ces vérifications peuvent être facilitées en interrogeant les données utilisateur :

    SELECT * FROM t_user WHERE uid=?
    .
    1.2 Interfaces et méthodes abstraites

    dans L'interface UserMapper ajoute la méthode abstraite updatePasswordByUid(Integer uid, String password, String approvedUser, Date approvedTime).

    Lors de l'utilisation d'annotations pour simplifier la configuration XML, l'annotation @Param est utilisée pour nommer les paramètres. Une fois les paramètres nommés, les valeurs des paramètres peuvent être obtenues en fonction des noms et les paramètres peuvent être correctement transmis au fichier. instruction SQL. Le nom du paramètre dans l'annotation @Param("parameter name") doit être cohérent avec le nom du paramètre #{parameter name} dans l'instruction SQL.

    /**
     * 根据uid更新用户的密码
     * @param uid 用户的id
     * @param password 新密码
     * @param modifiedUser 最后修改执行人
     * @param modifiedTime 最后修改时间
     * @return 受影响的行数
     */
    Integer updatePasswordByUid(
    		@Param("uid") Integer uid, 
    		@Param("password") String password, 
    		@Param("modifiedUser") String modifiedUser, 
    		@Param("modifiedTime") Date modifiedTime);
    
    /**
     * 根据用户id查询用户数据
     * @param uid 用户id
     * @return 匹配的用户数据,如果没有匹配的用户数据,则返回null
     */
    User findByUid(Integer uid);
    1.3 Configurer le mappage SQL

    1. Configurez le mappage des méthodes abstraites updatePasswordByUid() et findByUid() dans UserMapper.xml.

    <!-- 根据uid更新用户的密码:
    	 Integer updatePasswordByUid(
    		@Param("uid") Integer uid, 
    		@Param("password") String password, 
    		@Param("modifiedUser") String modifiedUser, 
    		@Param("modifiedTime") Date modifiedTime) -->
    <update id="updatePasswordByUid">
    	UPDATE
    		t_user 
    	SET
    		password = #{password},
    		modified_user = #{modifiedUser},
    		modified_time = #{modifiedTime} 
    	WHERE
    		uid = #{uid}
    </update>
    
    <!-- 根据用户id查询用户数据:User findByUid(Integer uid) -->
    <select id="findByUid" resultMap="UserEntityMap">
    	SELECT
    		*
    	FROM
    		t_user
    	WHERE
    		uid = #{uid}
    </select>

    2. Écrivez et exécutez des tests unitaires dans UserMapperTests.

    @Test
    public void updatePasswordByUid() {
    	Integer uid = 7;
    	String password = "123456";
    	String modifiedUser = "超级管理员";
    	Date modifiedTime = new Date();
    	Integer rows = userMapper.updatePasswordByUid(uid, password, modifiedUser, modifiedTime);
    	System.out.println("rows=" + rows);
    }
    
    @Test
    public void findByUid() {
    	Integer uid = 7;
    	User result = userMapper.findByUid(uid);
    	System.out.println(result);
    }

    2 User-Change Password-Business Layer

    2.1 Exception de planification

    Avant de modifier le mot de passe, vous devez d'abord vérifier si les données utilisateur existent et ne sont pas marquées comme "supprimées". Une exception UserNotFoundException doit être levée si la vérification échoue.

    2. Lorsque l'utilisateur modifie le mot de passe, la modification peut échouer car le mot de passe d'origine saisi est incorrect et une exception PasswordNotMatchException doit être levée.

    Si le nombre de lignes affectées est différent de la valeur attendue lors de la modification du mot de passe, une UpdateException doit être levée.

    4. Créez la classe d'exception com.cy.store.service.ex.UpdateException, qui hérite de la classe ServiceException.

    /** 更新数据的异常 */
    public class UpdateException extends ServiceException {
    	// Override Methods...
    }
    2.2 Interface et méthode abstraite

    Ajoutez la méthode abstraite changePassword (Integer uid, String username, String oldPassword, String newPassword) dans IUserService.

    /**
     * 修改密码
     * @param uid 当前登录的用户id
     * @param username 用户名
     * @param oldPassword 原密码
     * @param newPassword 新密码
     */
    public void changePassword(Integer uid, String username, String oldPassword, String newPassword);
    2.3 Implémenter la méthode abstraite

    1. Implémentez la méthode abstraite changePassword() dans la classe UserServiceImpl.

    public void changePassword(Integer uid, String username, String oldPassword, String newPassword) {
    	// 调用userMapper的findByUid()方法,根据参数uid查询用户数据
    	// 检查查询结果是否为null
    	// 是:抛出UserNotFoundException异常
    
    	// 检查查询结果中的isDelete是否为1
    	// 是:抛出UserNotFoundException异常
    
    	// 从查询结果中取出盐值
    	// 将参数oldPassword结合盐值加密,得到oldMd5Password
    	// 判断查询结果中的password与oldMd5Password是否不一致
    	// 是:抛出PasswordNotMatchException异常
    
    	// 将参数newPassword结合盐值加密,得到newMd5Password
    	// 创建当前时间对象
    	// 调用userMapper的updatePasswordByUid()更新密码,并获取返回值
    	// 判断以上返回的受影响行数是否不为1
    	// 是:抛了UpdateException异常
    }

    2. Le code spécifique de la méthode changePassword().

    Les méthodes equals et contentEquals dans String peuvent être utilisées pour comparer si le contenu des objets String est le même.

    @Override
    public void changePassword(Integer uid, String username, String oldPassword, String newPassword) {
    	// 调用userMapper的findByUid()方法,根据参数uid查询用户数据
    	User result = userMapper.findByUid(uid);
    	// 检查查询结果是否为null
    	if (result == null) {
    		// 是:抛出UserNotFoundException异常
    		throw new UserNotFoundException("用户数据不存在");
    	}
    	
    	// 检查查询结果中的isDelete是否为1
    	if (result.getIsDelete().equals(1)) {
    		// 是:抛出UserNotFoundException异常
    		throw new UserNotFoundException("用户数据不存在");
    	}
    	
    	// 从查询结果中取出盐值
    	String salt = result.getSalt();
    	// 将参数oldPassword结合盐值加密,得到oldMd5Password
    	String oldMd5Password = getMd5Password(oldPassword, salt);
    	// 判断查询结果中的password与oldMd5Password是否不一致
    	if (!result.getPassword().contentEquals(oldMd5Password)) {
    		// 是:抛出PasswordNotMatchException异常
    		throw new PasswordNotMatchException("原密码错误");
    	}
    	
    	// 将参数newPassword结合盐值加密,得到newMd5Password
    	String newMd5Password = getMd5Password(newPassword, salt);
    	// 创建当前时间对象
    	Date now = new Date();
    	// 调用userMapper的updatePasswordByUid()更新密码,并获取返回值
    	Integer rows = userMapper.updatePasswordByUid(uid, newMd5Password, username, now);
    	// 判断以上返回的受影响行数是否不为1
    	if (rows != 1) {
    		// 是:抛出UpdateException异常
    		throw new UpdateException("更新用户数据时出现未知错误,请联系系统管理员");
    	}
    }

    3. Écrivez et exécutez des tests unitaires dans UserServiceTests.

    @Test
    public void changePassword() {
        try {
            Integer uid = 5;
            String username = "lower";
            String oldPassword = "123456";
            String newPassword = "888888";
            userService.changePassword(uid, username, oldPassword, newPassword);
            System.out.println("密码修改成功!");
        } catch (ServiceException e) {
            System.out.println("密码修改失败!" + e.getClass().getSimpleName());
            System.out.println(e.getMessage());
        }
    }

    3 Contrôleur de mot de passe de changement d'utilisateur

    3.1 Gestion des exceptions

    Une nouvelle exception UpdateException a été lancée dans le cadre du changement de mot de passe par l'utilisateur, qui doit être gérée dans la classe BaseController.

    @ExceptionHandler(ServiceException.class)
    public JsonResult<Void> handleException(Throwable e) {
    	JsonResult<Void> result = new JsonResult<Void>(e);
    	if (e instanceof UsernameDuplicateException) {
    		result.setState(4000);
    	} else if (e instanceof UserNotFoundException) {
    		result.setState(4001);
    	} else if (e instanceof PasswordNotMatchException) {
    		result.setState(4002);
    	} else if (e instanceof InsertException) {
    		result.setState(5000);
    	} else if (e instanceof UpdateException) {
    		result.setState(5001);
    	}
    	return result;
    }
    3.2 Demande de conception

    Concevez la demande soumise par l'utilisateur et concevez la manière d'y répondre.

    Chemin de la requête :/users/change_password
    Paramètres de la requête : String oldPassword, String newPassword, HttpSession session
    Type de requête : POST
    Résultat de la réponse : JsonResult903bf37051cf83cbd9686768ac0189ae

    3.3 Traitement des requêtes

    1. classe La méthode changePassword(String oldPassword, String newPassword, HttpSession session) qui gère la requête.

    @RequestMapping("change_password")
    public JsonResult<Void> changePassword(String oldPassword, String newPassword, HttpSession session) {
    	// 调用session.getAttribute("")获取uid和username
    	// 调用业务对象执行修改密码
    	// 返回成功
    	
    	return null;
    }

    2. Implémentez le code pour changer la méthode de mot de passe dans le contrôleur UserController.

    @RequestMapping("change_password")
    public JsonResult<Void> changePassword(String oldPassword, String newPassword, HttpSession session) {
    	// 调用session.getAttribute("")获取uid和username
    	Integer uid = getUidFromSession(session);
    	String username = getUsernameFromSession(session);
    	// 调用业务对象执行修改密码
    	iUserService.changePassword(uid, username, oldPassword, newPassword);
    	// 返回成功
    	return new JsonResult<Void>(OK);
    }

    3. Connectez-vous d'abord pour démarrer le projet, puis visitez http://localhost:8080/users/change_password?oldPassword=xx&newPassword=xx pour les tests.

    4 Page de modification du mot de passe par l'utilisateur

    1. À la fin de la balise body dans la page password.html, ajoutez une balise de script pour écrire des programmes JavaScript.

    <script type="text/javascript">
        $("#btn-change-password").click(function() {
            $.ajax({
                url: "/users/change_password",
                type: "POST",
                data: $("#form-change-password").serialize(),
                dataType: "json",
                success: function(json) {
                    if (json.state == 200) {
                        alert("修改成功!");
                    } else {
                        alert("修改失败!" + json.message);
                    }
                }
            });
    	});
    </script>

    2. Connectez-vous d'abord pour démarrer le projet, puis visitez la page http://localhost:8080/web/password.html et modifiez le mot de passe.

    Question : Si les données ne peuvent pas être transférées normalement en arrière-plan, redémarrez le système et les outils de développement IDEA, et vous pourrez modifier le mot de passe après vous être connecté.

    3. Problème : lors de l'utilisation de la page frontale, l'utilisateur accède à la page de changement de mot de passe et reste longtemps sur la page actuelle sans effectuer aucune opération, ce qui entraînera l'expiration des informations de connexion. Lorsque vous cliquez sur le bouton Modifier à ce moment, une demande sera toujours envoyée à /users/change_password et sera redirigée vers la page de connexion par l'intercepteur. Étant donné que l'ensemble du processus est géré de manière asynchrone par la fonction $.ajax(), la redirection est également complétée par une tâche asynchrone. S'il n'y a aucune performance sur la page, "Rien ne se produit lorsque vous cliquez sur le bouton après l'expiration des informations de connexion de l'utilisateur". apparaîtra.

    Solution : Vous pouvez ajouter la configuration de l'attribut error dans $.ajax() de la page password.html La valeur de cet attribut est une fonction de rappel. Cette fonction sera appelée lorsque le serveur renvoie un code d'état qui ne répond pas normalement, comme 302, 400, 404, 405, 500, etc.

    error: function (xhr) {
        alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + xhr.status);
        location.href = "login.html";
    }

    Données personnelles

    1 Couche de persistance des données personnelles de l'utilisateur

    1.1 Planifiez les instructions SQL qui doivent être exécutées

    1 Exécutez l'instruction SQL pour modifier grossièrement les données personnelles de l'utilisateur :

    UPDATE t_user SET phone=?, email=?, gender=?, modified_user=?, modified_time=? WHERE uid=?

    Ouvrez la page. où l'utilisateur modifie les données Auparavant, les informations de l'utilisateur actuellement connecté devaient être affichées sur la page pour vérification avant d'effectuer des opérations de modification des données. Les informations utilisateur peuvent être affichées via :

    SELECT * FROM t_user WHERE uid=?

    Instructions :

    1. Cette fonction de requête a été implémentée et n'a pas besoin d'être développée à nouveau ;

    在进行用户资料修改前,还需要进行检查,判断用户数据是否存在、是否被标记为“已删除”,以上查询也可以用来实现这一操作。

    1.2 接口与抽象方法

    在UserMapper接口中添加updateInfoByUid(User user)方法。

    /**
     * 根据uid更新用户资料
     * @param user 封装了用户id和新个人资料的对象
     * @return 受影响的行数
     */
    Integer updateInfoByUid(User user);
    1.3 配置SQL映射

    1.在UserMapper.xml中配置Integer updateInfoByUid(User user)抽象方法的映射。

    <!-- 根据uid更新用户个人资料:Integer updateInfoByUid(User user) -->
    <update id="updateInfoByUid">
    	UPDATE
    		t_user 
    	SET
    		<if test="phone != null">phone = #{phone},</if>
    		<if test="email != null">email = #{email},</if>
    		<if test="gender != null">gender = #{gender},</if>
    		modified_user = #{modifiedUser},
    		modified_time = #{modifiedTime}
    	WHERE
    		uid = #{uid}
    </update>

    2.在UserMapperTests中编写并执行单元测试。

    @Test
    public void updateInfoByUid() {
        User user = new User();
        user.setUid(20);
        user.setPhone("17858802222");
        user.setEmail("admin@cy.com");
        user.setGender(1);
        user.setModifiedUser("系统管理员");
        user.setModifiedTime(new Date());
        Integer rows = userMapper.updateInfoByUid(user);
        System.out.println("rows=" + rows);
    }

    2 用户-个人资料-业务层

    2.1 规划异常

    1.关于用户修改个人资料是由两个功能组成的。

    • 打开页面时显示当前登录的用户的信息;

    • 点击修改按钮时更新用户的信息。

    2.关于打开页面时显示当前登录的用户的信息,可能会因为用户数据不存在、用户被标记为“已删除”而无法正确的显示页面,则抛出UserNotFoundException异常。

    3.关于点击修改按钮时更新用户的信息,在执行修改资料之前仍需再次检查用户数据是否存在、用户是否被标记为“已删除”,则可能抛出UserNotFoundException异常。在修改资料时,可能会发生UpdateException异常。

    2.2 接口与抽象方法

    在IUserService接口中添加两个抽象方法,分别对应以上两个功能。

    /**
     * 获取当前登录的用户的信息
     * @param uid 当前登录的用户的id
     * @return 当前登录的用户的信息
     */
    User getByUid(Integer uid);
    
    /**
     * 修改用户资料
     * @param uid 当前登录的用户的id
     * @param username 当前登录的用户名
     * @param user 用户的新的数据
     */
    void changeInfo(Integer uid, String username, User user);
    2.3 实现抽象方法

    1.在UserServiceImpl实现类中实现getByUid(Integer uid)和changeInfo(Integer uid, String username, User user)以上两个抽象方法。

    @Override
    public User getByUid(Integer uid) {
    	// 调用userMapper的findByUid()方法,根据参数uid查询用户数据
    	// 判断查询结果是否为null
    	// 是:抛出UserNotFoundException异常
    
    	// 判断查询结果中的isDelete是否为1
    	// 是:抛出UserNotFoundException异常
    
    	// 创建新的User对象
    	// 将以上查询结果中的username/phone/email/gender封装到新User对象中
    
    	// 返回新的User对象
    	return null;
    }
    
    @Override
    public void changeInfo(Integer uid, String username, User user) {
    	// 调用userMapper的findByUid()方法,根据参数uid查询用户数据
    	// 判断查询结果是否为null
    	// 是:抛出UserNotFoundException异常
    
    	// 判断查询结果中的isDelete是否为1
    	// 是:抛出UserNotFoundException异常
    
    	// 向参数user中补全数据:uid
    	// 向参数user中补全数据:modifiedUser(username)
    	// 向参数user中补全数据:modifiedTime(new Date())
    	// 调用userMapper的updateInfoByUid(User user)方法执行修改,并获取返回值
    	// 判断以上返回的受影响行数是否不为1
    	// 是:抛出UpdateException异常
    	
    }

    2.getByUid(Integer uid)和changeInfo(Integer uid, String username, User user)方法的具体代码实现。

    @Override
    public User getByUid(Integer uid) {
    	// 调用userMapper的findByUid()方法,根据参数uid查询用户数据
    	User result = userMapper.findByUid(uid);
    	// 判断查询结果是否为null
    	if (result == null) {
    		// 是:抛出UserNotFoundException异常
    		throw new UserNotFoundException("用户数据不存在");
    	}
     
    	// 判断查询结果中的isDelete是否为1
    	if (result.getIsDelete().equals(1)) {
    		// 是:抛出UserNotFoundException异常
    		throw new UserNotFoundException("用户数据不存在");
    	}
    
    	// 创建新的User对象
    	User user = new User();
    	// 将以上查询结果中的username/phone/email/gender封装到新User对象中
    	user.setUsername(result.getUsername());
    	user.setPhone(result.getPhone());
    	user.setEmail(result.getEmail());
    	user.setGender(result.getGender());
    	
    	// 返回新的User对象
    	return user;
    }
    
    @Override
    public void changeInfo(Integer uid, String username, User user) {
    	// 调用userMapper的findByUid()方法,根据参数uid查询用户数据
    	User result = userMapper.findByUid(uid);
    	// 判断查询结果是否为null
    	if (result == null) {
    		// 是:抛出UserNotFoundException异常
    		throw new UserNotFoundException("用户数据不存在");
    	}
    
    	// 判断查询结果中的isDelete是否为1
    	if (result.getIsDelete().equals(1)) {
    		// 是:抛出UserNotFoundException异常
    		throw new UserNotFoundException("用户数据不存在");
    	}
    
    	// 向参数user中补全数据:uid
    	user.setUid(uid);
    	// 向参数user中补全数据:modifiedUser(username)
    	user.setModifiedUser(username);
    	// 向参数user中补全数据:modifiedTime(new Date())
    	user.setModifiedTime(new Date());
    	// 调用userMapper的updateInfoByUid(User user)方法执行修改,并获取返回值
    	Integer rows = userMapper.updateInfoByUid(user);
    	// 判断以上返回的受影响行数是否不为1
    	if (rows != 1) {
    		// 是:抛出UpdateException异常
    		throw new UpdateException("更新用户数据时出现未知错误,请联系系统管理员");
    	}
    }

    3.在UserServiceTests类中进行单元测试。

    @Test
    public void getByUid() {
        try {
            Integer uid = 20;
            User user = iUserService.getByUid(uid);
            System.out.println(user);
        } catch (ServiceException e) {
            System.out.println(e.getClass().getSimpleName());
            System.out.println(e.getMessage());
        }
    }
    
    @Test
    public void changeInfo() {
        try {
            Integer uid = 20;
            String username = "数据管理员";
            User user = new User();
            user.setPhone("15512328888");
            user.setEmail("admin03@cy.cn");
            user.setGender(2);
            iUserService.changeInfo(uid, username, user);
            System.out.println("OK.");
        } catch (ServiceException e) {
            System.out.println(e.getClass().getSimpleName());
            System.out.println(e.getMessage());
        }
    }

    3 用户-个人资料-控制器

    3.1 处理异常

    说明:无需再次开发。

    3.2 设计请求

    1.设计用户提交显示当前登录的用户信息的请求,并设计响应的方式。

    请求路径:/users/get_by_uid
    请求参数:HttpSession session
    请求类型:GET
    响应结果:JsonResult4c8e0c17c3bd7e0081bb17cc795e1984

    2.设计用户提交执行修改用户信息的请求,并设计响应的方式。

    请求路径:/users/change_info
    请求参数:User user, HttpSession session
    请求类型:POST
    响应结果:JsonResult903bf37051cf83cbd9686768ac0189ae

    3.3 处理请求

    1.处理获取用户信息请求

    1.在UserController类中添加处理请求的getByUid()方法,并导入org.springframework.web.bind.annotation.GetMapping包。

    @GetMapping("get_by_uid")
    public JsonResult<User> getByUid(HttpSession session) {
    	// 从HttpSession对象中获取uid
    	// 调用业务对象执行获取数据
    	// 响应成功和数据
    	return null;
    }

    2.getByUid(HttpSession session)方法中具体代码实现为。

    @GetMapping("get_by_uid")
    public JsonResult<User> getByUid(HttpSession session) {
        // 从HttpSession对象中获取uid
        Integer uid = getUidFromSession(session);
        // 调用业务对象执行获取数据
        User data = userService.getByUid(uid);
        // 响应成功和数据
        return new JsonResult<User>(OK, data);
    }

    3.完成后启动项目,打开浏览器先登录,再访问http://localhost:8080/users/get_by_uid请求进行测试。

    2.处理修改用户个人信息请求

    1.在UserController类中添加处理请求的changeInfo(User user, HttpSession session)方法。

    @RequestMapping("change_info")
    public JsonResult<Void> changeInfo(User user, HttpSession session) {
    	// 从HttpSession对象中获取uid和username
    	// 调用业务对象执行修改用户资料
    	// 响应成功
    	return null;
    }

    2.changeInfo(User user, HttpSession session)方法中具体代码实现为。

    @RequestMapping("change_info")
    public JsonResult<Void> changeInfo(User user, HttpSession session) {
    	// 从HttpSession对象中获取uid和username
    	Integer uid = getUidFromSession(session);
    	String username = getUsernameFromSession(session);
    	// 调用业务对象执行修改用户资料
    	userService.changeInfo(uid, username, user);
    	// 响应成功
    	return new JsonResult<Void>(OK);
    }

    3.完成后启动项目,打开浏览器先登录,再访问http://localhost:8080/users/change_info?phone=17858800000&email=admin07@cy.com&gender=1进行测试。

    4 用户-个人资料-前端页面

    1.在userdata.html页面中body标签内部的最后,添加script标签用于编写JavaScript程序。

    <script type="text/javascript">
        $(document).ready(function() {
            $.ajax({
                url: "/users/get_by_uid",
                type: "GET",
                dataType: "json",
                success: function(json) {
                    if (json.state == 200) {
                        console.log("username=" + json.data.username);
                        console.log("phone=" + json.data.phone);
                        console.log("email=" + json.data.email);
                        console.log("gender=" + json.data.gender);
    
                        $("#username").val(json.data.username);
                        $("#phone").val(json.data.phone);
                        $("#email").val(json.data.email);
    
                        let radio = json.data.gender == 0 ? $("#gender-female") : $("#gender-male");
                        radio.prop("checked", "checked");
                    } else {
                        alert("获取用户信息失败!" + json.message);
                    }
                }
            });
    	});
    
        $("#btn-change-info").click(function() {
            $.ajax({
                url: "/users/change_info",
                type: "POST",
                data: $("#form-change-info").serialize(),
                dataType: "json",
                success: function(json) {
                    if (json.state == 200) {
                        alert("修改成功!");
                        location.href = "login.html";
                    } else {
                        alert("修改失败!" + json.message);
                    }
                },
                error: function(xhr) {
                    alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + xhr.status);
                    location.href = "login.html";
                }
            });
        });
    </script>

    2.完成后启动项目,打开浏览器先登录,再访问http://localhost:8080/web/userdata.html页面并进行用户个人资料的修改测试。

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer