博客
关于我
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/

你可能感兴趣的文章
Objective-C实现TernarySearch三分查找算法(附完整源码)
查看>>
Objective-C实现The Game of Life 生命游戏算法(附完整源码)
查看>>
Objective-C实现tim sort排序算法(附完整源码)
查看>>
Objective-C实现Timsort算法(附完整源码)
查看>>
Objective-C实现TOPK算法(附完整源码)
查看>>
Objective-C实现topological sort拓扑排序算法(附完整源码)
查看>>
Objective-C实现topologicalSort拓扑排序算法(附完整源码)
查看>>
Objective-C实现tower of hanoi河内塔算法(附完整源码)
查看>>
Objective-C实现trapezoidal rule梯形法则算法(附完整源码)
查看>>
Objective-C实现Trapping Rain Water捕获雨水问题算法(附完整源码)
查看>>
Objective-C实现Travelling Salesman算法(附完整源码)
查看>>
Objective-C实现tree sort树排序算法(附完整源码)
查看>>
Objective-C实现trial Division试除法算法(附完整源码)
查看>>
Objective-C实现Tribonacci Number特里波纳契数算法(附完整源码)
查看>>
Objective-C实现Trie段树算法(附完整源码)
查看>>
Objective-C实现UDP传输系统源码(附完整源码)
查看>>
Objective-C实现UDP内网穿透(附完整源码)
查看>>
Objective-C实现ugly numbers丑数算法(附完整源码)
查看>>
Objective-C实现unet模型(附完整源码)
查看>>
Objective-C实现wc函数功能(附完整源码)
查看>>