前言
宠物乐园这个项目是为xxx公司开发o2o模式一个项目。它是以宠物为中心,提供宠物领养,寻主的基本功能,还提供了宠物服务,相关物品购买,宠物相关知识学习等功能一个综合性平台。它主要有组织机构,用户,服务,宠物,订单, 支付等模块。它是使用前后端分离开发模式,前端使用的是vue技术栈,后台使用的是springboot+ssm+docker。
一、人员组成
共11人 周期:半年
项目经理:管人管项目 1
架构师: 负责项目架构+技术选型+疑难问题解决+培训 1
UI: 设计界面 1
H5: 前端开发工程师 2
后台: 后台开发工程师 4
测试: 测试人员 1
运维人员: 搭建开发公共环境,线上环境 1。
二、负责模块
1.用户模块
1.1注册
用户注册分为邮箱注册和手机号注册,由于逻辑都是一样的,只是激活方式不一样,所以这里只以手机号为例
1.1.1基本流程
手机号注册:
1)输入手机号
2)获取验证码并且输入
3)输入密码和确认密码
4)完成注册
手机发送短信验证码流程
1.1.2 表的设计
(1) 1张用户信息表t_user
注意:
1.如果是手机号注册,用户的默认状态就是激活状态。如果是邮箱注册,需要给用户发送邮件,让用户登录邮件进行激活。目的是防止用户随便写一个不可用的邮箱注册账号。但是目前大多数新项目都不用了,都用手机号。
2.前台用户注册的密码不能是明文的形式存储在数据库,需要进行加密处理,防止用户信息泄露。
(2)1张登录信息表t_logininfo
表里面有一列栏位type,用于区分是后台工作人员登录还是前台用户登录. 因为我的设计就算你是管理员,你想消费,你也要注册用户,意味着员工表和用户表中分别有记录。 也就会造成logininfo有相同电话或用户名或email等两个记录,通过type进行区分。
1.1.3 技术准备
(1)工具类StrUtils,生成随机字符串,作为验证码
public static String getComplexRandomString(int length) {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(62);
sb.append(str.charAt(number));
}
return sb.toString();
}
(2)md5不可逆加密,用来加密用户登录密码
盐值salt:同一种加密算法,由于不同的盐值,加密出来就不一样。
1)整个系统使用同一个盐值,多个用户共用-定义一个常量
每个用户都有自己盐值,就算是相同的密码,两个用用户加密出来也不一样
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
/**
* 加密
* @param context
*/
public static String encrypByMd5(String context) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(context.getBytes());//update处理
byte [] encryContext = md.digest();//调用该方法完成计算
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < encryContext.length; offset++) {
//做相应的转化(十六进制)
i = encryContext[offset];
if (i < 0) i += 256;
if (i < 16) buf.append("0");
buf.append(Integer.toHexString(i));
}
return buf.toString();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
(3)引入redis数据库
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
(4)短信发送接口
找三大运营,或者中间商,我们项目中使用网建短信通
链接: http://sms.webchinese.com.cn/Rates.shtml
导包,并准备发送短信的工具类
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
1.1.4 后端
短信发送:
@Override
public AjaxResult sendSmsCode(Map<String, String> param) {
String phone = param.get("phone");
if(!StringUtils.hasLength(phone)) {
return AjaxResult.result().setMessage("请输入手机号");
}
User user = userMapper.loadByPhone(phone);
if(user != null){
return AjaxResult.result().setMessage("该手机号已被注册");
}
String key = "registerCode" + phone;
String value =(String)redisTemplate.opsForValue().get(key);
String code = "";
//如果value为null,说明是第一次或者过期了,则生成随机验证码,并且下面会存放到redis里面去
if(!StringUtils.hasLength(value)){
code = StrUtils.getComplexRandomString(4);
}else {
//如果value不为空,说明存在验证码,判断是否过了重发事件,还是用同一个验证码
String time = value.split(":")[1];
if(System.currentTimeMillis()-Long.parseLong(time) < 1*60*1000){
return AjaxResult.result().setMessage("请不要频繁发送");
}
code = value.split(":")[0];
}
//存放到redis,有效时间3分钟.设置value的格式为 验证码:存入时间
int expireTime = 3;
redisTemplate.