博客
关于我
Project(3)——用户登录&修改密码
阅读量:197 次
发布时间:2019-02-28

本文共 8786 字,大约阅读时间需要 29 分钟。

项目文档:用户管理系统功能开发

一、项目分析

在开发一个项目时,首先需要明确需要处理的数据类型。以用户管理系统为例,常见的数据类型包括:

  • 用户
  • 商品类别
  • 商品
  • 收藏
  • 订单
  • 购物车
  • 收货地址

数据处理的顺序应遵循基础数据优先的原则。通常情况下,数据处理顺序如下:用户 > 收货地址 > 商品类别 > 商品 > 收藏 > 购物车 > 订单

二、用户功能分析

以“用户”数据为例,常见的用户功能包括:

  • 注册
  • 登录
  • 修改密码
  • 修改资料
  • 上传头像

功能开发顺序通常遵循“增 > 查 > 删 > 改”的逻辑:注册 > 登录 > 修改密码 > 修改资料 > 上传头像

每个功能的开发流程包括:创建数据表 > 创建实体类 > 持久层开发 > 业务层开发 > 控制器层开发 > 前端页面开发

三、用户注册功能开发

1. 数据库设计

创建用户表:

CREATE TABLE t_user (    uid NUMBER PRIMARY KEY,    username VARCHAR(50) NOT NULL UNIQUE,    password VARCHAR(255) NOT NULL,    salt VARCHAR(255) NOT NULL,    is_delete NUMBER DEFAULT 0)

2. 实体类设计

@Entity@Table(name = "t_user")public class User extends BaseEntity {    private String username;    private String password;    private String salt;    private Integer isDelete;    // setter和getter方法}

3. 持久层开发

(a) SQL语句规划

插入用户信息的SQL语句:

INSERT INTO t_user (username, password, salt) VALUES (?, ?, ?)

(b) 接口与抽象方法

public interface UserMapper {    void insertUser(User user);}

(c) 配置映射

INSERT INTO t_user (username, password, salt) VALUES (?, ?, ?)

4. 业务层开发

(a) 异常规划

  • 用户名重复:UsernameDuplicateException
  • 用户不存在:UserNotFoundException
  • 密码错误:PasswordNotMatchException

(b) 接口与抽象方法

public interface UserService {    void register(User user) throws UsernameDuplicateException, UserNotFoundException;}

(c) 实现类与重写方法

public class UserServiceImpl implements UserService {    @Override    public void register(User user) throws UsernameDuplicateException, UserNotFoundException {        // 按照业务规则进行用户注册    }}

5. 控制器层开发

(a) 异常处理

public abstract class BaseController {    @ExceptionHandler(ServiceException.class)    public JsonResult handleException(Throwable e) {        // 处理不同类型的异常并返回相应的状态码    }}

(b) 请求设计

请求路径:/users/register请求参数:username, password, email, phone请求方式:POST响应数据:JsonResult

(c) 请求处理

@RequestMapping("register")public JsonResult register(    @RequestParam("username") String username,    @RequestParam("password") String password,    @RequestParam("email") String email,    @RequestParam("phone") String phone,    HttpSession session) {    UserService service = new UserServiceImpl();    User user = new User();    user.setUsername(username);    user.setPassword(password);    service.register(user);    session.setAttribute("uid", user.getUid());    session.setAttribute("username", user.getUsername());    return new JsonResult(SUCCESS);}

6. 前端页面开发

$(document).ready(function() {    $("#btn-register").click(function() {        $.ajax({            url: "/users/register",            data: $("#form-register").serialize(),            type: "POST",            dataType: "json",            success: function(json) {                if (json.state == 2000) {                    alert("注册成功!");                } else {                    alert(json.message);                }            }        });    });});

四、用户登录功能开发

1. 数据库设计

SELECT uid, username, password, salt, is_delete FROM t_user WHERE username=?

2. 实体类设计

public class User extends BaseEntity {    private String username;    private String password;    private String salt;    private Integer isDelete;    // setter和getter方法}

3. 持久层开发

(a) SQL语句规划

SELECT uid, username, password, salt, is_delete AS isDelete FROM t_user WHERE username=?

(b) 接口与抽象方法

public interface UserMapper {    User findByUsername(String username);}

(c) 配置映射

4. 业务层开发

(a) 异常规划

  • 用户名不存在:UserNotFoundException
  • 密码错误:PasswordNotMatchException

(b) 接口与抽象方法

public interface UserService {    User login(String username, String password) throws UserNotFoundException, PasswordNotMatchException;}

(c) 实现类与重写方法

public class UserServiceImpl implements UserService {    @Override    public User login(String username, String password) throws UserNotFoundException, PasswordNotMatchException {        User user = userMapper.findByUsername(username);        if (user == null) {            throw new UserNotFoundException("登录失败!用户名不存在!");        }        if (user.getIsDelete() == 1) {            throw new UserNotFoundException("登录失败!用户名不存在!");        }        String salt = user.getSalt();        String md5Password = getMd5Password(password, salt);        if (!user.getPassword().equals(md5Password)) {            throw new PasswordNotMatchException("登录失败!密码错误!");        }        user.setPassword(null);        user.setSalt(null);        user.setIsDelete(null);        return user;    }}

5. 控制器层开发

(a) 异常处理

public abstract class BaseController {    @ExceptionHandler(ServiceException.class)    public JsonResult handleException(Throwable e) {        // 处理不同类型的异常并返回相应的状态码    }}

(b) 请求设计

请求路径:/users/login请求参数:username, password请求方式:POST响应数据:JsonResult

(c) 请求处理

@RequestMapping("login")public JsonResult login(    @RequestParam("username") String username,    @RequestParam("password") String password,    HttpSession session) {    UserService service = new UserServiceImpl();    User user = service.login(username, password);    session.setAttribute("uid", user.getUid());    session.setAttribute("username", user.getUsername());    return new JsonResult(SUCCESS, user);}

6. 前端页面开发

$(document).ready(function() {    $("#btn-login").click(function() {        $.ajax({            url: "/users/login",            data: $("#form-login").serialize(),            type: "POST",            dataType: "json",            success: function(json) {                if (json.state == 2000) {                    alert("登录成功!");                } else {                    alert(json.message);                }            }        });    });});

五、用户修改密码功能开发

1. 数据库设计

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

2. 实体类设计

public class User extends BaseEntity {    private String username;    private String password;    private String salt;    private Integer isDelete;    // setter和getter方法}

3. 持久层开发

(a) SQL语句规划

SELECT is_delete, password, salt FROM t_user WHERE uid=?

(b) 接口与抽象方法

public interface UserMapper {    Integer updatePassword(Integer uid, String password, String modifiedUser, Date modifiedTime);    User findByUid(Integer uid);}

(c) 配置映射

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

4. 业务层开发

(a) 异常规划

  • 用户不存在:UserNotFoundException
  • 密码错误:PasswordNotMatchException
  • 更新失败:UpdateException

(b) 接口与抽象方法

public interface UserService {    void changePassword(Integer uid, String username, String oldPassword, String newPassword) throws UserNotFoundException, PasswordNotMatchException, UpdateException;}

(c) 实现类与重写方法

public class UserServiceImpl implements UserService {    @Override    public void changePassword(Integer uid, String username, String oldPassword, String newPassword) throws UserNotFoundException, PasswordNotMatchException, UpdateException {        User user = userMapper.findByUid(uid);        if (user == null) {            throw new UserNotFoundException("修改密码失败!用户不存在!");        }        if (user.getIsDelete() == 1) {            throw new UserNotFoundException("修改密码失败!用户不存在!");        }        String salt = user.getSalt();        String md5Password = getMd5Password(oldPassword, salt);        if (!user.getPassword().equals(md5Password)) {            throw new PasswordNotMatchException("修改密码失败!原密码错误!");        }        String newMd5Password = getMd5Password(newPassword, salt);        Date now = new Date();        Integer rows = userMapper.updatePassword(uid, newMd5Password, username, now);        if (rows != 1) {            throw new UpdateException("修改密码失败!出现未知错误!");        }    }}

5. 控制器层开发

(a) 异常处理

public abstract class BaseController {    @ExceptionHandler(ServiceException.class)    public JsonResult handleException(Throwable e) {        // 处理不同类型的异常并返回相应的状态码    }}

(b) 请求设计

请求路径:/users/change_password请求参数:oldPassword, newPassword请求方式:POST响应数据:JsonResult

(c) 请求处理

@RequestMapping("change_password")public JsonResult changePassword(    @RequestParam("old_password") String oldPassword,    @RequestParam("new_password") String newPassword,    HttpSession session) {    UserService service = new UserServiceImpl();    Integer uid = Integer.valueOf(session.getAttribute("uid").toString());    String username = session.getAttribute("username").toString();    service.changePassword(uid, username, oldPassword, newPassword);    return new JsonResult(SUCCESS);}

6. 前端页面开发

$(document).ready(function() {    $("#btn-change-password").click(function() {        $.ajax({            url: "/users/change_password",            data: $("#form-change-password").serialize(),            type: "POST",            dataType: "json",            success: function(json) {                if (json.state == 2000) {                    alert("修改成功!");                } else {                    alert(json.message);                }            }        });    });});

转载地址:http://arzs.baihongyu.com/

你可能感兴趣的文章
OpenCV与AI深度学习 | 五分钟快速搭建一个实时人脸口罩检测系统(OpenCV+PaddleHub 含源码)
查看>>
OpenCV与AI深度学习 | 什么是 COCO 数据集?
查看>>
OpenCV与AI深度学习 | 低对比度缺陷检测应用实例--LCD屏幕脏污检测
查看>>
OpenCV与AI深度学习 | 使用 MoveNet Lightning 和 OpenCV 实现实时姿势检测
查看>>
OpenCV与AI深度学习 | 使用 OpenCV 创建自定义图像滤镜
查看>>
OpenCV与AI深度学习 | 使用 SAM 和 Grounding DINO 分割卫星图像
查看>>
OpenCV与AI深度学习 | 使用OpenCV图像修复技术去除眩光
查看>>
OpenCV与AI深度学习 | 使用OpenCV检测并计算直线角度
查看>>
OpenCV与AI深度学习 | 使用OpenCV轮廓检测提取图像前景
查看>>
OpenCV与AI深度学习 | 使用Python和OpenCV实现火焰检测(附源码)
查看>>
OpenCV与AI深度学习 | 使用PyTorch进行小样本学习的图像分类
查看>>
OpenCV与AI深度学习 | 使用YOLO11实现区域内目标跟踪
查看>>
OpenCV与AI深度学习 | 使用YOLOv8做目标检测、实例分割和图像分类(包含实例操作代码)
查看>>
OpenCV与AI深度学习 | 使用单相机对已知物体进行3D位置估计
查看>>
OpenCV与AI深度学习 | 初学者指南 -- 什么是迁移学习?
查看>>
OpenCV与AI深度学习 | 十分钟掌握Pytorch搭建神经网络的流程
查看>>
OpenCV与AI深度学习 | 基于GAN的零缺陷样本产品表面缺陷检测
查看>>
OpenCV与AI深度学习 | 基于OpenCV和深度学习预测年龄和性别
查看>>
OpenCV与AI深度学习 | 基于OpenCV实现模糊检测 / 自动对焦
查看>>
OpenCV与AI深度学习 | 基于Python和OpenCV将图像转为ASCII艺术效果
查看>>