一、数据库
'user_id' bigint(20) NOT AUTO_INCREMENT COMMENT '用户主ID',
'nick_name' varchar(50) NOT NULL DEFAULT '' COMMENT '用户昵称',
AUTO_INCREMENT:用来定义主键是自增的,我们只需要将主键设置为null,0或者不设置该字段,数据库就会为我们自动生成一个主键值。而且,自增主键是整数型,单调递增。
COMMENT ‘XXX’:用来加标注。
PRIMARY KEY ('user_id') USING BTREE
PRIMARY设置主键用。
DROP TABLE IF EXISTS `tb_newbee_mall_user_token`;
CREATE TABLE `tb_newbee_mall_user_token`(
`user_id` BIGINT(20) NOT NULL COMMENT '用户主键id',
`token` VARCHAR(32) NOT NULL COMMENT 'token值(32位字符串)',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`expire_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'token过期时间',
PRIMARY KEY (`user_id`),
UNIQUE KEY (`token`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `tb_newbee_mall_user_token` ADD unique(`token`);/*给表中token内增加约束,
被定义的字段中可以为NULL但是不能有重复值,可以定义多个约束
ALTER TABLE `tb_newbee_mall_user_token` ADD unique(`token`,`user_id`);
*/
ALTER TABLE `tb_newbee_mall_user_token` DROP INDEX `token`;
/*删除约束*/
不要总把UNIQUE索引和UNIQUE约束混为一谈
1、primary key = unique + not null(关键就在于这里,primary 定义的约束不能为空,但是unique可以为空,只有这一个区别,其他都大差不差)
2、唯一约束和主键一样都是约束的范畴,而且都可以作为外键的参考,不同的是,一张表只能有一个主键
3、主键和唯一约束的创建需要依靠索引,如果在创建主键或唯一约束的时候没有已经建好的索引可以使用的话,Oracle会自动建立一个唯一的索引。
BTREE是一种树形数据结构,可用于快速查询和排序。
'create_time' datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
DATETIME类型用在你需要同时包含日期和时间信息的值时。MySQL检索并且以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。(“支持”意味着尽管更早的值可能工作,但不能保证他们可以。)
DATE类型用在你仅需要日期值时,没有时间部分。MySQL检索并且以'YYYY-MM-DD'格式显示DATE值,支持的范围是'1000-01-01'到'9999-12-31'。
TIMESTAMP列类型提供一种类型,你可以使用它自动地用当前的日期和时间标记INSERT或UPDATE的操作。
TIME数据类型表示一天中的时间。MySQL检索并且以"HH:MM:SS"格式显示TIME值。支持的范围是'00:00:00'到'23:59:59'。
数据库中引号的作用
单引号:我们在例子中的条件值周围使用的是单引号。SQL 使用单引号来环绕文本值。如果是数值,请不要使用引号。按照别的说法来说就是Varchar类型(也可以说是String、字符串类型)这一些在数据库语句中使用的时候应该使用单引号,而不是直接使用。而对于数值类型的,反而是不能使用单引号。如图所示有正确的和错误的使用方法:
反引号:它是为了区分MYSQL的保留字与普通字符而引入的符号。注意划重点:有MYSQL保留字作为字段的,必须加上反引号来区分!!!所谓的保留字就是select database insert 这一类数据库的sql指令,当我们不得已要拿他们来做表名和字段名的时候 我们必须要加反引号来避免编译器把这部分认为是保留字而产生错误。
最后我们总结一句话来概括sql中三个引号的用法,那就是:
字符串用单引号;
表名,字段名等用反引号;
大小写冲突用双引号。
LOCK TABLE `tb_newbee_mall_user` WRITE;
LOCK TABLES为当前线程锁定表。 UNLOCK TABLES释放被当前线程持有的任何锁。当线程发出另外一个LOCK TABLES时,或当服务器的连接被关闭时,当前线程锁定的所有表会自动被解锁。 如果一个线程获得在一个表上的一个READ锁,该线程和所有其他线程只能从表中读。
如果一个线程获得一个表上的一个WRITE锁,那么只有持锁的线程READ或WRITE表,其他线程被阻止。
实战代码:
DROP TABLE IF EXISTS `tb_newbee_mall_user`;
CREATE TABLE `tb_newbee_mall_user` (
`user_id` bigint(20) NOT NULL auto_increment COMMENT '用户主ID',
`nick_name` varchar(50) NOT NULL DEFAULT '' COMMENT '用户昵称',
`login_name` varchar(11) NOT NULL DEFAULT '' COMMENT '登录名称(默认为手机号)',
`password_md5` varchar(32) NOT NULL DEFAULT '' COMMENT 'MD5加密后的密码',
`introduce_sign` varchar(100) NOT NULL DEFAULT '' COMMENT '个性签名',
`is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '注销标识字段(0-正常 1-已注销)',
`locked_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '锁定标识字段(0-未锁定 1-已锁定)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
LOCK TABLE `tb_newbee_mall_user` WRITE;
UNLOCK TABLE ;
INSERT INTO `tb_newbee_mall_user` (`user_id`,`nick_name`,`login_name`,`password_md5`,`introduce_sign`,`is_deleted`,`locked_flag`,`create_time`)VALUES
(1,'lhc','6568','8656','我不怕',0,0,'2024.1.8'),
(2,'lhc1','65681','86561','我不怕1',0,0,'2024.1.9'),
(3,'lhc2','65682','86562','我不怕2',0,0,'2024.1.10');
DROP TABLE IF EXISTS `tb_newbee_mall_user_token`;
CREATE TABLE `tb_newbee_mall_user_token`(
`user_id` BIGINT(20) NOT NULL COMMENT '用户主键id',
`token` VARCHAR(32) NOT NULL COMMENT 'token值(32位字符串)',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`expire_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'token过期时间',
PRIMARY KEY (`user_id`),
UNIQUE KEY (`token`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `tb_newbee_mall_user_token` ADD unique(`token`);/*给表中token内增加约束,
被定义的字段中可以为NULL但是不能有重复值,可以定义多个约束
ALTER TABLE `tb_newbee_mall_user_token` ADD unique(`token`,`user_id`);
*/
ALTER TABLE `tb_newbee_mall_user_token` DROP INDEX `token`;
/*删除约束*/
二、登录接口的实现
步骤:建立实体类entity(MallUser和MallUserToken)->在dao层(存放数据层接口)建立MallUserMapper和NewBeeMallUserTokenMapper接口->创建Mapper接口的映射文件->业务层(service)的实现->控制层controller
entity:
MallUser:
package ltd.newbee.mall.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class MallUser {
private Long userId;
private String nickName;
private String loginName;
private String passwordMd5;
private String introduceSign;
private Byte isDeleted;
private Byte lockedFlag;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
//@JsonFormat 默认是标准时区的时间,作用:后台的时间 格式化 发送到前台
//@DateTimeFormat 接受前台的时间格式 传到后台的格式
private Date createTime;
}
MallUserToken
package ltd.newbee.mall.entity;
import lombok.Data;
import java.util.Date;
@Data
public class MallUserToken {
private Long userId;
private String token;
private Date updateTime;
private Date expireTime;
}
dao:
MallUserMapper
package ltd.newbee.mall.dao;
import ltd.newbee.mall.entity.MallUser;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface MallUserMapper {
MallUser selectByLoginNameAndPasswd(@Param("loginName") String loginName, @Param("password") String password);
//@Param("XXX")给参数命名,名称为XXX
}
NewBeeMallUserTokenMapper
package ltd.newbee.mall.dao;
import ltd.newbee.mall.entity.MallUserToken;
public interface NewBeeMallUserTokenMapper {
int insertSelective(MallUserToken record);
MallUserToken selectByPrimaryKey(Long userId);
MallUserToken selectByToken(String token);
int updateByPrimaryKeySelective(MallUserToken record);
}
Mapper:用来将实体类、dao层(数据接口)和数据库之间联系起来
MallUserMapper.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="ltd.newbee.mall.dao.MallUserMapper">
<!-- 将MallUserMapper.xml文件与对应的MallUserMapper接口之间的关系进行定义-->
<resultMap id="BaseResultMap" type="ltd.newbee.mall.entity.MallUser">
<!-- column:数据库表中的字段名称 jdbcType:字段类型 property:实体类中定义的对象-->
<id column="user_id" jdbcType="BIGINT" property="userId"/>
<result column="nick_name" jdbcType="VARCHAR" property="nickName"/>
<result column="login_name" jdbcType="VARCHAR" property="loginName"/>
<result column="password_md5" jdbcType="VARCHAR" property="passwordMd5"/>
<result column="introduce_sign" jdbcType="VARCHAR" property="introduceSign"/>
<result column="is_deleted" jdbcType="TINYINT" property="isDeleted"/>
<result column="locked_flag" jdbcType="TINYINT" property="lockedFlag"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
</resultMap>
<sql id="Base_Column_List">
-- MyBatis自动生成的一个基础列名列表,包含了表中的所有列名
user_id, nick_name, login_name, password_md5, introduce_sign, is_deleted,
locked_flag, create_time
</sql>
<select id="selectByLoginNameAndPasswd" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from tb_newbee_mall_user
where login_name = #{loginName} and password_md5 = #{password} and is_deleted=0
</select>
</mapper>
<!-- 关于22行mybatis的resultMap="BaseResultMap"说明-->
<!-- mybatis 非常的智能,如果配置了resultMap,返回值统一使用 resultMap=“BaseResultMap”,mybatis会根据查询到的条目数量自动进行判断,如果是一条就返回对象,如果是多条就返回List对象列表。-->
NewBeeMallUserTokenMapper.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="ltd.newbee.mall.dao.NewBeeMallUserTokenMapper">
<resultMap id="BaseResultMap" type="ltd.newbee.mall.entity.MallUserToken">
<!-- 将MallUserMapper.xml文件与对应的MallUserMapper接口之间的关系进行定义-->
<id column="user_id" jdbcType="BIGINT" property="userId" />
<!-- column:数据库表中的字段名称 jdbcType:字段类型 property:实体类中定义的对象-->
<result column="token" jdbcType="VARCHAR" property="token" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="expire_time" jdbcType="TIMESTAMP" property="expireTime" />
</resultMap>
<sql id="Base_Column_List">
-- MyBatis自动生成的一个基础列名列表,包含了表中的所有列名
user_id, token, update_time, expire_time
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
-- 关于mybatis的resultMap="BaseResultMap"说明
-- mybatis 非常的智能,如果配置了resultMap,返回值统一使用 resultMap=“BaseResultMap”,mybatis会根据查询到的条目数量自动进行判断,如果是一条就返回对象,如果是多条就返回List对象列表。
select
<include refid="Base_Column_List" />
from tb_newbee_mall_user_token
where user_id = #{userId,jdbcType=BIGINT}
</select>
<select id="selectByToken" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from tb_newbee_mall_user_token
where token = #{token,jdbcType=VARCHAR}
</select>
<insert id="insertSelective" parameterType="ltd.newbee.mall.entity.MallUserToken">
insert into tb_newbee_mall_user_token
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="userId != null">
user_id,
</if>
<if test="token != null">
token,
</if>
<if test="updateTime != null">
update_time,
</if>
<if test="expireTime != null">
expire_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="userId != null">
#{userId,jdbcType=BIGINT},
</if>
<if test="token != null">
#{token,jdbcType=VARCHAR},
</if>
<if test="updateTime != null">
#{updateTime,jdbcType=TIMESTAMP},
</if>
<if test="expireTime != null">
#{expireTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="ltd.newbee.mall.entity.MallUserToken">
update tb_newbee_mall_user_token
<set>
<if test="token != null">
token = #{token,jdbcType=VARCHAR},
</if>
<if test="updateTime != null">
update_time = #{updateTime,jdbcType=TIMESTAMP},
</if>
<if test="expireTime != null">
expire_time = #{expireTime,jdbcType=TIMESTAMP},
</if>
</set>
where user_id = #{userId,jdbcType=BIGINT}
</update>
</mapper>
业务层(service)代码的实现(1.ltd/newbee/mall/service/NewBeeMallUserService.java
2.ltd/newbee/mall/service/impl/NewBeeMallUserServiceImpl.java)
NewBeeMallUserService
package ltd.newbee.mall.service;
public interface NewBeeMallUserService {
/*
登录
@param loginName
@param passwordMD5
@return
*/
String login(String loginName, String passwordMD5);
}
NewBeeMallUserServiceImpl
package ltd.newbee.mall.service.impl;
import io.swagger.annotations.Authorization;
import ltd.newbee.mall.common.ServiceResultEnum;
import ltd.newbee.mall.dao.MallUserMapper;
import ltd.newbee.mall.dao.NewBeeMallUserTokenMapper;
import ltd.newbee.mall.entity.MallUser;
import ltd.newbee.mall.entity.MallUserToken;
import ltd.newbee.mall.service.NewBeeMallUserService;
import ltd.newbee.mall.util.NumberUtil;
import ltd.newbee.mall.util.SystemUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service
public class NewBeeMallUserServiceImpl implements NewBeeMallUserService {
@Autowired
private MallUserMapper mallUserMapper;
@Autowired
private NewBeeMallUserTokenMapper newBeeMallUserTokenMapper;
@Override
public String login(String loginName, String passwordMD5) {
MallUser user = mallUserMapper.selectByLoginNameAndPasswd(loginName, passwordMD5);
if (user != null) {
if (user.getLockedFlag() == 1) {
// 现阶段缺失ltd/newbee/mall/common/ServiceResultEnum.java导致下面的ServiceResultEnum爆红,现在加入ltd.newbee.mall.common.ServiceResultEnum
return ServiceResultEnum.LOGIN_USER_LOCKED_ERROR.getResult();
}
//登录后即执行修改token的操作
String token = getNewToken(System.currentTimeMillis() + "", user.getUserId());
MallUserToken mallUserToken = newBeeMallUserTokenMapper.selectByPrimaryKey(user.getUserId());
//当前时间
Date now = new Date();
//过期时间
Date expireTime = new Date(now.getTime() + 2 * 24 * 3600 * 1000);//过期时间 48 小时
if (mallUserToken == null) {
mallUserToken = new MallUserToken();
mallUserToken.setUserId(user.getUserId());
mallUserToken.setToken(token);
mallUserToken.setUpdateTime(now);
mallUserToken.setExpireTime(expireTime);
//新增一条token数据
if (newBeeMallUserTokenMapper.insertSelective(mallUserToken) > 0) {
//新增成功后返回
return token;
}
} else {
mallUserToken.setToken(token);
mallUserToken.setUpdateTime(now);
mallUserToken.setExpireTime(expireTime);
//更新
if (newBeeMallUserTokenMapper.updateByPrimaryKeySelective(mallUserToken) > 0) {
//修改成功后返回
return token;
}
}
}
return ServiceResultEnum.LOGIN_ERROR.getResult();
}
/**
* 获取token值
*
* @param timeStr
* @param userId
* @return
*/
private String getNewToken(String timeStr, Long userId) {
String src = timeStr + userId + NumberUtil.genRandomNum(4);
return SystemUtil.genToken(src);
}
}
在NewBeeMallUserServiceImpl中涉及到两个util.java文件和common.enum文件如下
common(存放相关的常量配置及枚举类)中
ServiceResultEnum
package ltd.newbee.mall.common;
public enum ServiceResultEnum{
LOGIN_USER_LOCKED_ERROR("用户已被禁止登录!"),
LOGIN_ERROR("登录失败!");
private String result;
ServiceResultEnum(String result) {
this.result = result;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
//在这个时候setResult还没用上。
}
util(存放工具类)中
NumberUtil
package ltd.newbee.mall.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NumberUtil {
private NumberUtil() {
}
/**
* 判断是否为11位电话号码
*
* @param phone
* @return
*/
public static boolean isPhone(String phone) {
Pattern pattern = Pattern.compile("^((13[0-9])|(14[5,7])|(15[^4,\\D])|(17[0-8])|(18[0-9]))\\d{8}$");
Matcher matcher = pattern.matcher(phone);
return matcher.matches();
}
/**
* 生成指定长度的随机数
*
* @param length
* @return
*/
public static int genRandomNum(int length) {
int num = 1;
double random = Math.random();
if (random < 0.1) {
random = random + 0.1;
}
for (int i = 0; i < length; i++) {
num = num * 10;
}
return (int) ((random * num));
}
/**
* 生成订单流水号
*
* @return
*/
public static String genOrderNo() {
StringBuffer buffer = new StringBuffer(String.valueOf(System.currentTimeMillis()));
int num = genRandomNum(4);
buffer.append(num);
return buffer.toString();
}
}
SystemUtil
package ltd.newbee.mall.util;
import java.math.BigInteger;
import java.security.MessageDigest;
public class SystemUtil {
private SystemUtil() {
}
/**
* 登录或注册成功后,生成保持用户登录状态会话token值
*
* @param src:为用户最新一次登录时的now()+user.id+random(4)
* @return
*/
public static String genToken(String src) {
if (null == src || "".equals(src)) {
return null;
}
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(src.getBytes());
String result = new BigInteger(1, md.digest()).toString(16);
if (result.length() == 31) {
result = result + "-";
}
System.out.println(result);
return result;
} catch (Exception e) {
return null;
}
}
}
用户登录接口的参数设计
为了让前端向后端传参,用post方法将参数封装成一个对象传递给后端,因此定义一个javabean来接受参数(MallUserLoginParam)
api.param.MallUserLoginParam
package ltd.newbee.mall.api.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/*
Serializable是用于实现Java类的序列化操作而提供的一个语义级别的接口;序列化是将对象状态转换为可保持或传输的格式的过程。
序列化对于面向对象的编程语言来说是非常重要的,因为无论什么编程语言,其底层涉及IO操作的部分还是由操作系统其帮其完成的,
而底层IO操作都是以字节流的方式进行的,所以写操作都涉及将编程语言数据类型转换为字节流,
而读操作则又涉及将字节流转化为编程语言类型的特定数据类型。
什么情况下需要序列化:当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化。
*/
@Data
public class MallUserLoginParam implements Serializable {
@ApiModelProperty("登录名")//@ApiModelProperty是用来额外信息补充的
@NotEmpty(message = "登录名不能为空")//这个要添加依赖,不然用不了。
private String loginName;
@ApiModelProperty("用户密码(需要MD5加密)")
@NotEmpty(message = "密码不能为空")
private String passwordMd5;
}
控制层代码的实现api.NewBeeMallPersonalAPI
package ltd.newbee.mall.api.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/*
Serializable是用于实现Java类的序列化操作而提供的一个语义级别的接口;序列化是将对象状态转换为可保持或传输的格式的过程。
序列化对于面向对象的编程语言来说是非常重要的,因为无论什么编程语言,其底层涉及IO操作的部分还是由操作系统其帮其完成的,
而底层IO操作都是以字节流的方式进行的,所以写操作都涉及将编程语言数据类型转换为字节流,
而读操作则又涉及将字节流转化为编程语言类型的特定数据类型。
什么情况下需要序列化:当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化。
*/
@Data
public class MallUserLoginParam implements Serializable {
@ApiModelProperty("登录名")//@ApiModelProperty是用来额外信息补充的
@NotEmpty(message = "登录名不能为空")//这个要添加依赖,不然用不了。
private String loginName;
@ApiModelProperty("用户密码(需要MD5加密)")
@NotEmpty(message = "密码不能为空")
private String passwordMd5;
}
同时还要有两个util工具类和一个common相关常量配置及枚举类
common:
constants
/**
* 严肃声明:
* 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究!
* 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护!
* 可正常分享和学习源码,不得用于违法犯罪活动,违者必究!
* Copyright (c) 2019-2021 十三 all rights reserved.
* 版权所有,侵权必究!
*/
package ltd.newbee.mall.common;
/**
* @author 13
* @qq交流群 796794009
* @email 2449207463@qq.com
* @link https://github.com/newbee-ltd
* @apiNote 常量配置
*/
public class Constants {
//public final static String FILE_UPLOAD_DIC = "/opt/newbee/upload/";//上传文件的默认url前缀,根据部署设置自行修改
public final static String FILE_UPLOAD_DIC = "F:\\毕业设计\\十三代码\\image\\upload\\upload\\";//上传文件的默认url前缀,根据部署设置自行修改
public final static int INDEX_CAROUSEL_NUMBER = 5;//首页轮播图数量(可根据自身需求修改)
public final static int INDEX_CATEGORY_NUMBER = 10;//首页一级分类的最大数量
public final static int INDEX_GOODS_HOT_NUMBER = 4;//首页热卖商品数量
public final static int INDEX_GOODS_NEW_NUMBER = 5;//首页新品数量
public final static int INDEX_GOODS_RECOMMOND_NUMBER = 10;//首页推荐商品数量
public final static int SHOPPING_CART_ITEM_TOTAL_NUMBER = 20;//购物车中商品的最大数量(可根据自身需求修改)
public final static int SHOPPING_CART_ITEM_LIMIT_NUMBER = 5;//购物车中单个商品的最大购买数量(可根据自身需求修改)
public final static int GOODS_SEARCH_PAGE_LIMIT = 10;//搜索分页的默认条数(每页10条)
public final static int SHOPPING_CART_PAGE_LIMIT = 5;//购物车分页的默认条数(每页5条)
public final static int ORDER_SEARCH_PAGE_LIMIT = 5;//我的订单列表分页的默认条数(每页5条)
public final static int SELL_STATUS_UP = 0;//商品上架状态
public final static int SELL_STATUS_DOWN = 1;//商品下架状态
public final static int TOKEN_LENGTH = 32;//token字段长度
public final static String USER_INTRO = "随新所欲,蜂富多彩";//默认简介
}
util:
Result
package ltd.newbee.mall.util;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
/**
* @author 13
* @qq交流群 796794009
* @email 2449207463@qq.com
* @link https://github.com/newbee-ltd
*/
public class Result<T> implements Serializable {
private static final long serialVersionUID = 1L;
//业务码,比如成功、失败、权限不足等 code,可自行定义
@ApiModelProperty("返回码")
private int resultCode;
//返回信息,后端在进行业务处理后返回给前端一个提示信息,可自行定义
@ApiModelProperty("返回信息")
private String message;
//数据结果,泛型,可以是列表、单个对象、数字、布尔值等
@ApiModelProperty("返回数据")
private T data;
public Result() {
}
public Result(int resultCode, String message) {
this.resultCode = resultCode;
this.message = message;
}
public int getResultCode() {
return resultCode;
}
public void setResultCode(int resultCode) {
this.resultCode = resultCode;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return "Result{" +
"resultCode=" + resultCode +
", message='" + message + '\'' +
", data=" + data +
'}';
}
}
ResultGenerator
/**
* 严肃声明:
* 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究!
* 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护!
* 可正常分享和学习源码,不得用于违法犯罪活动,违者必究!
* Copyright (c) 2019-2021 十三 all rights reserved.
* 版权所有,侵权必究!
*/
package ltd.newbee.mall.common;
/**
* @author 13
* @qq交流群 796794009
* @email 2449207463@qq.com
* @link https://github.com/newbee-ltd
* @apiNote 常量配置
*/
public class Constants {
//public final static String FILE_UPLOAD_DIC = "/opt/newbee/upload/";//上传文件的默认url前缀,根据部署设置自行修改
public final static String FILE_UPLOAD_DIC = "F:\\毕业设计\\十三代码\\image\\upload\\upload\\";//上传文件的默认url前缀,根据部署设置自行修改
public final static int INDEX_CAROUSEL_NUMBER = 5;//首页轮播图数量(可根据自身需求修改)
public final static int INDEX_CATEGORY_NUMBER = 10;//首页一级分类的最大数量
public final static int INDEX_GOODS_HOT_NUMBER = 4;//首页热卖商品数量
public final static int INDEX_GOODS_NEW_NUMBER = 5;//首页新品数量
public final static int INDEX_GOODS_RECOMMOND_NUMBER = 10;//首页推荐商品数量
public final static int SHOPPING_CART_ITEM_TOTAL_NUMBER = 20;//购物车中商品的最大数量(可根据自身需求修改)
public final static int SHOPPING_CART_ITEM_LIMIT_NUMBER = 5;//购物车中单个商品的最大购买数量(可根据自身需求修改)
public final static int GOODS_SEARCH_PAGE_LIMIT = 10;//搜索分页的默认条数(每页10条)
public final static int SHOPPING_CART_PAGE_LIMIT = 5;//购物车分页的默认条数(每页5条)
public final static int ORDER_SEARCH_PAGE_LIMIT = 5;//我的订单列表分页的默认条数(每页5条)
public final static int SELL_STATUS_UP = 0;//商品上架状态
public final static int SELL_STATUS_DOWN = 1;//商品下架状态
public final static int TOKEN_LENGTH = 32;//token字段长度
public final static String USER_INTRO = "随新所欲,蜂富多彩";//默认简介
}