mmall用户模块

article/2025/10/31 5:00:25

mmall用户模块

  • user数据表设计
  • 用户模块接口文档
  • 服务端响应对象(ServerResponse< T>)
    • 响应对象封装以下3个属性
    • 判断响应是否成功
    • 私有化构造函数,对外暴露静态方法返回所需要的响应对象,例如:
      • 响应成功
      • 响应失败
    • ResponseCode
  • 本地缓存TokenCache
    • Token 验证的优势
      • 无状态,可扩展和解耦
  • 登录、注册、修改信息、查看、检验、退出登录
    • UserController
    • IUserService实现类UserServiceImpl
    • UserMapper
    • UserMapper.xml
  • 测试门户_用户接口

user数据表设计

CREATE TABLE `mmall_user` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户表id',`username` varchar(50) NOT NULL COMMENT '用户名',`password` varchar(50) NOT NULL COMMENT '用户密码,MD5加密',`email` varchar(50) DEFAULT NULL,`phone` varchar(20) DEFAULT NULL,`question` varchar(100) DEFAULT NULL COMMENT '找回密码问题',`answer` varchar(100) DEFAULT NULL COMMENT '找回密码答案',`role` int(4) NOT NULL COMMENT '角色0-管理员,1-普通用户',`create_time` datetime NOT NULL COMMENT '创建时间',`update_time` datetime NOT NULL COMMENT '最后一次更新时间',PRIMARY KEY (`id`),UNIQUE KEY `user_name_unique` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8

用户模块接口文档

门户_用户接口

服务端响应对象(ServerResponse< T>)

响应对象封装以下3个属性

	private int status;private String msg;private T date;

判断响应是否成功

	@JsonIgnore//添加此注解,isSuccess()序列化之后不会显示在Json中public boolean isSuccess(){return this.status == ResponseCode.SUCCESS.getCode();}

私有化构造函数,对外暴露静态方法返回所需要的响应对象,例如:

	private ServerResponse(int status, T date) {this.status = status;this.date = date;}private ServerResponse(int status, String msg) {this.status = status;this.msg = msg;}        

响应成功

	public static <T> ServerResponse<T> createBySuccess(T data){return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), data);}public static <T> ServerResponse<T> createBySuccessMessage(String msg){return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(), msg);}

响应失败

	public static <T> ServerResponse<T> createByErrorMessage(String errorMessage){return new ServerResponse<T>(ResponseCode.ERROR.getCode(), errorMessage);}

ResponseCode

public enum ResponseCode {SUCCESS(0, "SUCCESSS"),ERROR(1, "ERROR"),NEED_LOGIN(10, "NEED_LOGIN"),ILLEGAL_ARGUMENT(2, "ILLEGAL_ARGUMENT");private final int code;private final String desc;ResponseCode(int code, String desc) {this.code = code;this.desc = desc;}public int getCode() {return code;}public String getDesc() {return desc;}
}

本地缓存TokenCache

public class TokenCache {private static Logger logger = LoggerFactory.getLogger(TokenCache.class);public static final String TOKEN_PREFIX = "token_";//Guava缓存private static LoadingCache<String, String> localCache = CacheBuilder.newBuilder().initialCapacity(1000).maximumSize(10000).expireAfterAccess(12, TimeUnit.HOURS).build(new CacheLoader<String, String>() {//默认的数据加载实现,当调用get取值的时候,如果key没有对应的值,就调用这个方法进行加载@Overridepublic String load(String s) throws Exception {return "null";}});public static void setKey(String key, String value) {localCache.put(key, value);}public static String getKey(String key) {String value = null;try {value = localCache.get(key);if ("null".equals(value)) {return null;}return value;} catch (ExecutionException e) {logger.error("localCache get error", e);}return null;}
}

Token 验证的优势

无状态,可扩展和解耦

使用 token 而不是 cookie 的最大优点应该就是无状态,后端不需要保持对 token 的记录,每个 token 都是独立的

例如:用户忘记密码显示提示问题,在输入提示答案的时候校验正确,UUID随机生成的forgetToken(为了token复杂度可以+userID+时间戳),存入到TokenCache中

	@Overridepublic ServerResponse<String> checkAnswer(String username, String question, String answer) {int resultCount = userMapper.checkAnswer(username, question, answer);if (resultCount > 0) {//说明问题及问题答案是这个用户的,并且是正确的String forgetToken = UUID.randomUUID().toString();TokenCache.setKey(TokenCache.TOKEN_PREFIX + username, forgetToken);return ServerResponse.createBySuccess(forgetToken);}return ServerResponse.createByErrorMessage("问题的答案错误");}

紧接着,忘记密码状态下重置密码,需要传递token

	@Overridepublic ServerResponse<String> forgetResetPassword(String username, String passwordNew, String forgetToken) {if (StringUtils.isBlank(forgetToken)) {return ServerResponse.createByErrorMessage("参数错误,token需要传递");}ServerResponse validResponse = this.checkValid(username, Const.USERNAME);if(validResponse.isSuccess()) {//用户不存在return ServerResponse.createByErrorMessage("用户不存在");}String token = TokenCache.getKey(TokenCache.TOKEN_PREFIX + username);if (StringUtils.isBlank(token)) {return ServerResponse.createByErrorMessage("token无效或者过期");}if (StringUtils.equals(forgetToken,token)) {String md5Password = MD5Util.MD5EncodeUtf8(passwordNew);int rowCount = userMapper.updatePasswordByUsername(username, md5Password);if (rowCount > 0) {return ServerResponse.createBySuccessMessage("修改密码成功");}} else {return ServerResponse.createByErrorMessage("token错误,请重新获取重置密码的token");}return ServerResponse.createByErrorMessage("修改密码失败");}

总结:为了用户信息的安全性,忘记密码重置密码的情况下,需要客户端传递token进行验证

登录、注册、修改信息、查看、检验、退出登录

以更新用户信息为例:

UserController

	@RequestMapping(value = "update_information.do", method = RequestMethod.POST)@ResponseBodypublic ServerResponse<User> updateInformation(HttpSession session, User user) {User currentUser = (User) session.getAttribute(Const.CURRENT_USER);if (currentUser == null) {return ServerResponse.createByErrorMessage("用户未登陆");}user.setId(currentUser.getId());user.setUsername(currentUser.getUsername());ServerResponse<User> response = iUserService.updateInformation(user);if (response.isSuccess()) {session.setAttribute(Const.CURRENT_USER, response.getDate());}return response;}

IUserService实现类UserServiceImpl

	@Overridepublic ServerResponse<User> updateInformation(User user) {//username是不能被更新的//email校验:校验新的email是不是已经存在,如果存在的话,必须得是当前用户的int resultCount = userMapper.checkEmailByUserId(user.getEmail(), user.getId());if (resultCount > 0) {return ServerResponse.createByErrorMessage("email已经存在,请更换email再尝试更新");}User updateUser = new User();updateUser.setId(user.getId());updateUser.setEmail(user.getEmail());updateUser.setPhone(user.getPhone());updateUser.setQuestion(user.getQuestion());updateUser.setAnswer(user.getAnswer());int updateCount = userMapper.updateByPrimaryKeySelective(updateUser);if (updateCount > 0) {return ServerResponse.createBySuccess("更新个人信息成功", updateUser);}return ServerResponse.createByErrorMessage("更新个人信息失败");}

UserMapper

int updateByPrimaryKeySelective(User record);

UserMapper.xml

<update id="updateByPrimaryKeySelective" parameterType="com.mmall.pojo.User" >update mmall_user<set ><if test="username != null" >username = #{username,jdbcType=VARCHAR},</if><if test="password != null" >password = #{password,jdbcType=VARCHAR},</if><if test="email != null" >email = #{email,jdbcType=VARCHAR},</if><if test="phone != null" >phone = #{phone,jdbcType=VARCHAR},</if><if test="question != null" >question = #{question,jdbcType=VARCHAR},</if><if test="answer != null" >answer = #{answer,jdbcType=VARCHAR},</if><if test="role != null" >role = #{role,jdbcType=INTEGER},</if><if test="createTime != null" >create_time = #{createTime,jdbcType=TIMESTAMP},</if><if test="updateTime != null" >update_time = now(),</if></set>where id = #{id,jdbcType=INTEGER}</update>

测试门户_用户接口

在这里插入图片描述


http://chatgpt.dhexx.cn/article/913Jfj2G.shtml

相关文章

自学实践前后端项目4 MMall商城 7

一。地址管理 1.前端改为 userAddress 2. OrderController增加两个需要的元素 3.接口 服务也加上去 4. 在OrderServiceImpl实现层判断是否为新地址再进行保存 //先判断新老地址 if (orders.getUserAddress().equals("newAddress")){//存入数据库UserAddress use…

自学实前后端践项目4 MMall商城 1

一.开发环境 1.JDK8以上Spring Boot 2.3.0ThymeleafMyBatis Plus3.3.1MySQL8.0 2.部署&#xff1a;Linux,&#xff0c;&#xff08;阿里云 腾讯云&#xff09;JDK8&#xff0c;MySQL8.0 3.部署方式&#xff1a;jar包部署&#xff0c;不需要Tomcat 二.新建工程 1&#xff0…

mmall电商项目学习笔记之mybatis三剑客

一.Mybatis plugin IDEA 2017.3版本下Mybatis plugin 3.53安装使用 插件下载地址 http://www.awei.org/download/iMybatis-3.21.jar 二.MyBatis-Generate 反向生成 【转】mybatis自动生成实体代码的插件 【method2】逆向生成 2.1 在pom.xml中做两处配置 2.1.1配置depen…

自学实践前后端项目4 MMall商城 4

一。实现商品详情展示 1.测试获取后台当个商品的信息 2.实现通过点击商品名称和商品图片进入商品详情页面 1&#xff09;查找出商品信息 2&#xff09;在前端进行映射 3&#xff09;设置库存选择限制 判断逻辑 $(function(){//给type绑定点击事件$(".type").click…

mmall 项目实战(一)项目初始化

1.创建 数据库 及 表 数据脚本&#xff1a; /* Navicat Premium Data Transfer Source Server : 182.92.82.103 Source Server Type : MySQL Source Server Version : 50173 Source Host : 182.92.82.103 Source Database : mmall Target Se…

B2C购物商城---MMALL商城概览

注意&#xff1a; 商品小图原图缺失后续上传到图片服务器。不影响使用支付宝二维码是支付宝沙箱开发环境生成&#xff0c;不会产生真实交易&#xff0c;若需体验&#xff0c;请下载支付宝沙箱版扫描体验项目仍需优化 本项目的完成参考了慕课网happymmall的设计 项目源码在&…

MMall项目完整分析总结

Linux服务器 线上环境&#xff1a; 1.jdk 2.vsftpd 3.nginx 4.mysql 5.tomcat 6.git 7.maven 8.Redis 项目采用Tomcat集群方式: 在此架构图中&#xff0c;nginx使用的是轮询的负载均衡策略。session不交给tomcat自己管理&#xff0c;已经交由左侧的redis分布式…

python flask-sqlalchemy flask-marshmallow基本使用

首先安装 pip install marshmallow-sqlalchemy pip install flask-sqlalchemy pip install flask-marshmallow 参考 sqlalchemy query 官网 app.py文件内容 from flask import Flask,jsonify import config from flask_sqlalchemy import SQLAlchemy from flask_marshmallow i…

Flask_使用flask_marshmallow序列化数据

代码如下&#xff1a; from flask import Flask from flask_marshmallow import Marshmallow from flask_sqlalchemy import SQLAlchemy from marshmallow import fieldsapp Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] "mysqlpymysql://root:12…

【Python】Marshmallow:Python中的“棉花糖”

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 文章目录 一、Marshmallow简介1.1、基础概念 二、序列化2.1、User类2.2、UserSchema类2.3、Serializing(序列化)2.4、运行2.5、过滤输出 三、反序列化四、验证数据4.1、V…

marshmallow——简介

一、marshmallow简介 在marshmallow诞生之前,已经有很多优秀的模块来用于数据的格式化和数据校验中。 因此书写mashmallow这个库的作者受这些库的启发,例如Django REST Framework, Flask-RESTful, 和colander这些。他同样从这些库中大量借用了设计和实现序列化、反序列化以及…

flask---》Marshmallow介绍及基础使用

0. Marshmallow背景介绍 介绍 Marshmallow&#xff0c;中文译作&#xff1a;棉花糖。是一个轻量级的数据格式转换的模块&#xff0c;也叫序列化和反序列化模块&#xff0c;常用于将复杂的orm模型对象与python原生数据类型之间相互转换。一般用于flaskmarshmallow提供了丰富的…

YApi接口平台-接口挡板

YApi是一个开源的平台&#xff0c;官方平台链接&#xff0c;如下https://hellosean1025.github.io/yapi/index.html,目前很多大公司在使用&#xff0c;主要优势我认为有2个&#xff0c;第一该平台开源&#xff0c;搭建方便&#xff1b;第二该平台解决了前后端分离开发的痛点&am…

open source HTML 5移动应用 -Exlive 人员定位客户端(BlackBerry 10, Android, iPhone)

下图是exlive人员定位系统的宣传页&#xff0c;其官方主站在这里 www.exlive.cn 下图是BlackBerry OS 7.0上面的运行效果&#xff0c;更多截图见这里 http://blog.csdn.net/berryreload/article/details/8099674 Update: Remove BlackBerry OS 7.0支持 升级到PhoneGap 3.0&…

My BlackBerry

什么是黑莓 RIM公司成立于1984年。 黑莓手机&#xff08;Blackberry&#xff09;&#xff0c;是指由加拿大Reserach In Motion&#xff08;RIM&#xff09;公司推出的一种无线手持邮件解决终端设备&#xff0c;也就是我们平时称的手机。 2013年1月30日&#xff0c;RIM公司今…

解决联网下载服务端返回405问题

最近遇到了一个问题&#xff0c;在项目中有一个启动页广告图片下载的功能&#xff0c;之前能够正常下载&#xff0c;由于这个版本遇到了运营商DNS劫持的问题&#xff0c;服务端要调整图片的下载路径&#xff0c;也就是改变了图片的链接地址。修改地址之后下载就出现异常了&…

IIS 405 Method Not Allowed

今天将项目发布到IIS上后&#xff0c;发现Delete方法用不了&#xff0c;可进行如下设置&#xff1a; 打开处理程序映射 找到WebDAV点击请求限制&#xff0c;勾选全部谓词 这个方法如果无效的话 方法二&#xff1a;因为是WebDAVModule限制的请求&#xff0c;所以直接将WebDAV…

前端请求接口时报405错误

他说方法不存在 他的问题所在就是没有找到后端对应的接口 意思就是说没有找到我后端put这个对应的接口 我记得写了不知道为啥没了纳闷

IIS put请求 报HTTP Error 405 - Method Not Allowed

在新的服务器上部署了一个.net core的项目&#xff0c;部分请求地址使用了put、delete方式&#xff0c;导致无法正常请求&#xff0c;报Error 405 - Method Not Allowed。 由于配置IIS时把“WebDAV 发布”给勾选了&#xff0c;所以会导致拦截。 服务器和IIS 10配置如下图&…