项目一:第八天 1、前台系统导入 实现客户注册 发验证码,邮件 springdata-redis存储数据 3、实现客户登陆

1 前台系统客户注册功能

页面:signup.html

1.1 验证手机号是否注册(邮箱同样)

1、 使用Jquery-validate插件进行相关校验,使用校验规则

<input type="text" id="telephone" value="" name="telephone" class="fn-tinput" placeholder="手机号" required data-rule-mobile="true" data-rule-remote="customerAction_validateTel.action" data-msg-required="请输入手机号" data-msg-mobile="请输入正确格式" data-msg-remote="手机号已经被注册!" />

1、 CRM中扩展手机号是否存在方法

 

2、 重新生成代码,将生成接口拷贝到前台项目中

3、 搭建前台系统中CXF客户端环境,在spring配置文件中产生代理对象

 

4、 在前台客户action中注入远程调用代理对象,调用服务器端方法

 

客户注册页面验证码60秒倒计时效果实现并发送请求

校验手机号是否合法:

 

1.1 调用阿里云通信发送短信验证码

bosutil项目中提供发送短信工具类

 

public class AliSMSUtil {

 

/**

 * SMS_127167078 , ${username}

 * SMS_119087143, ${code}

 */

public static boolean sendMessge(String tel, String templateCode, Map<String, Object> tempalteParams){

    try {

//设置超时时间-可自行调整

System.setProperty("sun.net.client.defaultConnectTimeout", "10000");

System.setProperty("sun.net.client.defaultReadTimeout", "10000");

// 初始化ascClient需要的几个参数

final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)

final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)

//TODO 替换成你的AK

final String accessKeyId = "LTAIbzuUhxVW8GDT";//你的accessKeyId,参考本文档步骤2

final String accessKeySecret = "SXEYEjZTnSa2uo2Pf77llrXt2XhvjC";//你的accessKeySecret,参考本文档步骤2

//初始化ascClient,暂时不支持多region(请勿修改)

IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,

accessKeySecret);

DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);

IAcsClient acsClient = new DefaultAcsClient(profile);

 //组装请求对象

 SendSmsRequest request = new SendSmsRequest();

 //使用post提交

 request.setMethod(MethodType.POST);

 //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式

 request.setPhoneNumbers(tel);

 //TODO 必填:短信签名-可在短信控制台中找到

 request.setSignName("速运");

 //TODO 必填:短信模板-可在短信控制台中找到

 request.setTemplateCode(templateCode);

 //可选:模板中的变量替换JSON,如模板内容为"亲爱的${name},您的验证码为${code}",此处的值为

 //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败

//     request.setTemplateParam("{\"name\":\"Tom\", \"code\":\"123\"}");

//     String randomNumeric = RandomStringUtils.randomNumeric(4);

//     HashMap<String, Object> map = new HashMap<>();

//     map.put("code", randomNumeric);

 String templateParam = JSONObject.fromObject(tempalteParams).toString();

 request.setTemplateParam(templateParam);

 

 //可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)

 //request.setSmsUpExtendCode("90997");

 //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者

 request.setOutId("yourOutId");

//请求失败这里会抛ClientException异常

SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);

System.out.println(sendSmsResponse.getMessage());

if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {

//请求成功

return true;

}

} catch (Exception e) {

e.printStackTrace();

}

    return false;

}

}

 

1.2 客户注册页面调整并提交表单

修改注册表单formaction地址。

 

 

改为异步方式提交:

//将表单中所有输入项(必须有name) 转为json对象形式  {"inputname","inputvalue"}

$.fn.serializeJson=function(){  

            var serializeObj={};  

            var array=this.serializeArray();  

            var str=this.serialize();  

            $(array).each(function(){  

                if(serializeObj[this.name]){  

                    if($.isArray(serializeObj[this.name])){  

                        serializeObj[this.name].push(this.value);  

                    }else{  

                        serializeObj[this.name]=[serializeObj[this.name],this.value];  

                    }  

                }else{  

                    serializeObj[this.name]=this.value;   

                }  

            });  

            return serializeObj;  

        };

 

表单调用方法:

 

 

服务器端:

 

/**

  * @Description: 调用CRM注册客户信息

  * @return 0:注册失败   1:注册成功    2:验证码不正确

  * @throws Exception

  *  

 */

@Action("customerAction_regist")

public String regist() throws Exception {

try {

//获取正确验证码

String realChecode = (String) ServletActionContext.getRequest().getSession().getAttribute(model.getTelephone());

if(StringUtils.isNotBlank(realChecode)){

if(realChecode.equals(checkcode)){

//调用CRM完成注册

customerPRoxy.regist(model);

//TODO 发送短信

//生成激活码-将来手机号跟激活码一一对应

String activeCode = UUID.randomUUID().toString()+UUID.randomUUID().toString();

String content =  "欢迎您注册速运快递,为了提供更好的服务,请您在24小时内激活账户!!</br>"

+ "<a href='"+MailUtils.activeUrl+"?telephone="+model.getTelephone()+"&activeCode="+activeCode +"'>点击激活账户</a>";

//TODO 给用户发送激活账户邮件

MailUtils.sendMail("欢迎注册快递", content, model.getEmail());

//将激活码存储--redis内存数据库中

redisTemplate.opsForValue().set(model.getTelephone(), activeCode, 24, TimeUnit.HOURS);

//Session中验证码移除

ServletActionContext.getRequest().getSession().removeAttribute(model.getTelephone());

ServletActionContext.getResponse().getWriter().write("1");

}else{

//验证码不正确

ServletActionContext.getResponse().getWriter().write("2");

}

}

} catch (Exception e) {

e.printStackTrace();

ServletActionContext.getResponse().getWriter().write("0");

}

return NONE;

}

1.1 CRM服务中提供客户注册方法

需要重新发布服务,生成本地调用代码。将生成本地调用代码(接口跟Customer实体类)拷贝到前台系统中。

 

 

将复制接口,配置spring配置文件:配置访问CRM系统的代理对象。

测试注意:现有客户表中已经数据,第一条记录查询序列值为1,跟现有数据id冲突,违反唯一约束。

在客户action中调用CRM完成客户保存:

@Autowired

private CustomerService customerProxy; //注入远程调用CRM服务代理对象

 

//接收页面提交验证码

private String checkcode;

public void setCheckcode(String checkcode) {

this.checkcode = checkcode;

}

 

/**

  * @Description: 远程调用CRM保存客户记录

 */

@Action("customerAction_regist")

public String regist() throws Exception {

if(StringUtils.isNotBlank(checkcode)){

//判断验证码是否正确

//获取正确的验证码

String realCheckcode = (String) ServletActionContext.getRequest().getSession().getAttribute(model.getTelephone());

if(checkcode.equals(realCheckcode)){

//对用户密码进行加密

model.setPassword(Md5Util.encode(model.getPassword()));

customerProxy.save(model);

//发送短信通知用户:及时登录注册邮箱完成账户激活

//发送激活账户邮件

//session中验证码清除

ServletActionContext.getRequest().getSession().removeAttribute(model.getTelephone());

return "signSuccess";

}

}

return "signError";

}

1 发送激活账户邮件

1 发送激活账户邮件

SMTP协议:Simple Mail Transfer Protocol 简单邮件传输协议----发送邮件协议

POP协议:Post Office Protocol:邮局协议 接收邮件 v:pop3

 

1.1 Javamail发送邮件

导入工具类:

 

1.2 使用javamail发送激活账户邮件

 

String content = "欢迎您注册速运快递,为了提供更好的服务,请您在24小时内激活账户!!</br>"

+ "<a href='"+MailUtils.activeUrl+"?telephone="+model.getTelephone()+"&activeCode="+activeCode+"'>点击激活账户</a>";

MailUtils.sendMail("欢迎注册速运快递员", content, model.getEmail());

2 spring-data-redis使用

1.1 spring-data-redis操作数据库

 

Springdataredis通过配置连接池实现高效率操作数据库,提供模板redisTemplate简化操作数据库

1、 引入依赖

<dependency>

<groupId>org.springframework.data</groupId>

<artifactId>spring-data-redis</artifactId>

<version>${springdataredis.version}</version>

</dependency>

2、 spring配置文件中进行相关配置

<!-- jedis 连接池配置 -->

 <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  

        <property name="maxIdle" value="300" />        

        <property name="maxWaitMillis" value="3000" />  

        <!-- 从连接池中获取连接,先进行测试看连接是否可用,如果不能使用重新获取连接 -->

        <property name="testOnBorrow" value="true" />  

    </bean>  

 

<!-- jedis 连接工厂 -->

<bean id="redisConnectionFactory"  

        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">

        <property name="hostName" value="localhost"/>

        <property name="port" value="6379"/>

        <property name="poolConfig" ref="poolConfig"/>

    </bean>  

        

    <!-- spring data 提供 redis模板  -->

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">

        <property name="connectionFactory" ref="redisConnectionFactory" /> 

        <property name="keySerializer">

            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />

        </property>

        <property name="valueSerializer">

        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"> 

        </bean>

        </property> 

    </bean>  

3、 在项目中通过redisTemplate对象操作redis数据库

 

1.2 使用redisTemplate存储账户激活码

1、 在前台系统CustomerAction注入redisTemplate

2、 通过末班对象操作redis数据库

 

1 完成账户邮箱激活

 

账户激活功能:验证在注册使用录入邮箱是否正确;

目的:前台系统远程调用CRM将数据库客户表中type值改为“1”;

1.1.1 CRM中扩展方法

1、 查询客户账户状态:根据手机号查询账户状态(返回客户对象)

2、 根据客户Id更新type字段的值

Service:

 

Dao:

 

重新启动项目,生成前台系统调用的代码:

1.1.2 在前台系统中调用CRM方法

1、 注册用户会接收激活邮箱邮件,在邮件中有激活地址,点击

 

//激活链接中提交  url提交激活码

private String activeCode;

public void setActiveCode(String activeCode) {

this.activeCode = activeCode;

}

 

/**

  * @Description: 激活邮件-确保邮箱是客户

 */

@Action("customerAction_activeMail")

public String activeMail() throws Exception {

ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");

//1、查询客户激活状态

if(StringUtils.isNotBlank(model.getTelephone())&&StringUtils.isNotBlank(activeCode)){

Customer customer = customerPRoxy.findByType(model.getTelephone());

if(customer!=null){

if(customer.getType()==null){

//未激活状态

//2、判断激活码是否正确

String realActiveCode = redisTemplate.opsForValue().get(model.getTelephone());

if(StringUtils.isNotBlank(realActiveCode)){

if(activeCode.equals(realActiveCode)){

//3、调用CRM激活账户

customerPRoxy.activeAccount(customer.getId());

//清除redis数据库中激活码

redisTemplate.delete(model.getTelephone());

ServletActionContext.getResponse().getWriter().write("激活码成功,祝您使用愉快!");

}else{

//激活码错误

ServletActionContext.getResponse().getWriter().write("激活码错误");

}

}else{

//激活码失效

ServletActionContext.getResponse().getWriter().write("激活码失效");

}

}else{

//账户已经激活

ServletActionContext.getResponse().getWriter().write("账户已经激活");

}

}else{

//手机号不存在

ServletActionContext.getResponse().getWriter().write("手机号不存在");

}

}else{

//激活码或者手机为空

ServletActionContext.getResponse().getWriter().write("激活码或者手机为空");

}

return NONE;

}

 

1 MD5加密函数

2 实现前台系统登录功能

2.1 前台系统页面调整

1、将以下代码拷贝登陆form表单中,去后台管理系统中拷贝页面:validatecode.jsp

<div class="form-group">

<label for="inputvalidate" class="col-sm-3 control-label">验证码</label>

<div class="col-sm-4">

<input type="text" name=checkCode  class="form-control" id="inputaccount" placeholder="请输入验证码">

</div>

<div class="col-sm-4">

<img id="loginform:vCode" src="validatecode.jsp"  onclick="javascript:document.getElementById('loginform:vCode'). src='validatecode.jsp?'+Math.random();" />

</div>

</div>

1、 提交表单:使用工具方法将表单中的输入项序列化为json

//将表单中输入项序列为json对象

$.fn.serializeJson=function(){  

            var serializeObj={};  

            var array=this.serializeArray();  

            var str=this.serialize();  

            $(array).each(function(){  

                if(serializeObj[this.name]){  

                    if($.isArray(serializeObj[this.name])){  

                        serializeObj[this.name].push(this.value);  

                    }else{  

                        serializeObj[this.name]=[serializeObj[this.name],this.value];  

                    }  

                }else{  

                    serializeObj[this.name]=this.value;   

                }  

            });  

            return serializeObj;  

        };

注意:发送的是ajax请求。

 

Name:将来可能邮箱,可以是账户名

1、 customerAction中添加方法

1.1 CRM中扩展登陆方法

Service

 

Dao:

 

重新发布服务,生成本地调用代码:

1.1 前台实现登陆

 

//登陆:name可能是手机号可能是邮箱或者是账户名

private String name;

public void setName(String name) {

this.name = name;

}

/**

  * @Description: 登陆

  * @return

  * @throws Exception

  *  

 */

@Action("customerAction_login")

public String login() throws Exception {

//获取真实验证码

String realCode = (String) ServletActionContext.getRequest().getSession().getAttribute("key");

if(checkCode.equals(realCode)){

//调用CRM判断提交数据是否正确

Customer customer = crmProxy.login(name, model.getPassword());

if(customer!=null){

ServletActionContext.getResponse().getWriter().write("1");

ServletActionContext.getRequest().getSession().setAttribute("loginUser", customer);

return NONE;

}else{

//创建 json对象 设置消息具体信息

ServletActionContext.getResponse().getWriter().write("0");

return NONE;

}

}

return NONE;

}

 

在页面中判断回调的值,跳转页面

猜你喜欢

转载自www.cnblogs.com/shan1393/p/9250594.html