一个综合的分布式项目之功能代码

用户注册登录流程与实现
本文详细介绍了一个基于Python的用户注册与登录流程,包括前后端交互、消息队列使用、缓存与数据库操作等关键步骤。

    看过第一篇博客的应该都知道流程,虽然并不是一模一样,但大体是一样的,现在来确认具体方案。

    注册:

            1、用户录入信息提交到上游后台

            2、上游后台接受信息,构建mq消息,发送消息,返回到tip页面

            3、tip页面等待1秒执行验证,验证是否添加成功,若成功将注册的用户数据放入到redis缓存,并返回到登录页

            4、下游后台接收mq消息,将数据持久化到mysql,并触发同步消息队列,发送同步数据到同步消息队列后结束线程

            5、下游同步消息队列监听到消息,开始同步数据到mongo

    登录:

            1、用户录入信息提交到上游后台

            2、拿着信息到redis查询是否有登录缓存,若有直接返回到main页面,若无调用下游服务接口

            3、下游服务接口接收到调用,带参到mongo查询数据并返回结果集

            4、验证结果集是否存在数据,若存在返回main页面,若不存在跳转到注册页面

    以下贴上整个流程的代码

    上游controller

@RequestMapping("UserController")
@Controller
public class UserController {
    @Resource
    private IUserService userService;

    @RequestMapping("toRegist.do")
    public ModelAndView toRegist(User user, Model model) {
        model.addAttribute("registUser", user);
        return new ModelAndView("regist");
    }

    @RequestMapping("login.do")
    public ModelAndView login(User user, Model model) {
        User loginUser = this.userService.login(user);
        if (null != loginUser) {
            model.addAttribute("message", "登录成功");
            model.addAttribute("registUser", loginUser);
            return new ModelAndView("main");
        } else {
            return new ModelAndView("login");
        }
    }

    @RequestMapping("regist.do")
    public ModelAndView regist(User user, Model model) {
        this.userService.regist(user);
        model.addAttribute("message", "正在注册,请稍等……");
        model.addAttribute("registUser", user);
        return new ModelAndView("tip");
    }

    @RequestMapping("toLogin.do")
    public ModelAndView toLogin(User user, Model model) {
        model.addAttribute("registUser", user);
        return new ModelAndView("login");
    }

    @RequestMapping("validateRegist.do")
    @ResponseBody
    public AjaxRetuen validateRegist(User user) {

        if (this.userService.validateRegist(user)) {
            return new AjaxRetuen("注册成功,即将返回登录页", "y");
        }
        return new AjaxRetuen("注册失败,请重新注册", "n");
    }
}

上游service

@Repository
public class UserServiceImpl implements IUserService {
    @Resource
    private QueueMessageProducer<User> registQueueMessageProducer;
    @Reference
    private DUserService dUserService;

    
    @Override
    public void regist(User user) {
        PhoneNoticeInfo noticeInfo = new PhoneNoticeInfo();
        noticeInfo.setNoticeContent("Hello Word");
        noticeInfo.setNoticeTitle("hello Word");
        noticeInfo.setReceiver("hello");
        noticeInfo.setReceiverPhone("1111111");
        this.registQueueMessageProducer.sendQueue(user);
    }

   
    @Override
    public boolean validateRegist(User user) {
        user = this.dUserService.validateRegist(user);
        if (user == null) {
            return false;
        }
        ICache cache = SccUtilFactory.instanceCache();
        cache.addCacheData("login:" + user, new CacheData(user));
        return true;
    }

   
    @Override
    public User login(User user) {
        ICache cache = SccUtilFactory.instanceCache();
        if (cache.hasCacheData("login:" + user)) {
            return (User) cache.getCacheData("login:" + user);
        } else {
            user = this.dUserService.validateRegist(user);
            if (null != user) {
                cache.addCacheData("login:" + user, new CacheData(user));
                return user;
            }
        }
        return null;
    }

}

服务接口

public interface DUserService {
    User addUser(User user);
    User validateRegist(User user);
}

下游服务接口实现

@Service
public class DUserServiceImpl implements DUserService {
    @Resource
    private IUserdao userdao;
    @Resource
    private MongoTemplate mongoTemplate;

    
    @Override
    public User addUser(User user) {
        this.userdao.insertUser(user);
        return user;
    }

    
    @Override
    public User validateRegist(User user) {
        List<User> users = this.mongoTemplate.find(
                new Query(Criteria.where("uname").is(user.getUname()).and("password").is(user.getPassword())),
                User.class);
        if (null != users && users.size() > 0) {
            return users.get(0);
        }
        return null;
    }

}

注册消息处理类

public class RegistDeal extends DealJmsMessage {
    @Resource
    private DUserService userService;
    @Resource
    private QueueMessageProducer<User> syncUserQueueMessageProducer;

    
    @Override
    public void dealMessage(ObjectMessage objectMessage, MessageConverter messageConverter)
            throws MessageConversionException, JMSException {
        User user = (User) messageConverter.fromMessage(objectMessage);
        user = this.userService.addUser(user);
        this.syncUserQueueMessageProducer.sendQueue(user);
     }
}

同步消息处理类

public class SyncUserDealJmsMessage extends DealJmsMessage {
    @Resource
    private MongoTemplate mongoTemplate;

    @Override
    public void dealMessage(ObjectMessage objectMessage, MessageConverter messageConverter)
            throws MessageConversionException, JMSException {
        User user = (User) messageConverter.fromMessage(objectMessage);
        this.mongoTemplate.save(user);
    }
}

dao接口

public interface IUserdao {
    Integer insertUser(User user);

    User findUserByUnameAndPass(User user);
}

dao mapper

<mapper namespace="sustainable.service.dao.IUserdao">	
	<insert id="insertUser" parameterType="sustainable.common.po.User"  useGeneratedKeys="true" keyProperty="uid">
		INSERT INTO tab_user (uname, password) VALUES (#{uname}, #{password});
	</insert>
</mapper>

详细项目代码请看github托管,自己fork下来看

转载于:https://my.oschina.net/shyloveliyi/blog/609852

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值