Java从单体到微服务打造房产销售平台
时间:2019-11-08
本文章向大家介绍Java从单体到微服务打造房产销售平台,主要包括Java从单体到微服务打造房产销售平台使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Spring Mail发送激活链接
功能实现:在注册用户时通过spring mail
发送激活链接到用户的邮箱,在有效期内用户点击链接后更新用户状态为激活状态。
引入spring-mail
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置appliacation.properties
文件
#用来发送邮件
domain.name=127.0.0.1:8090
#spring-mail
spring.mail.host=smtp.163.com #163邮箱
spring.mail.username=chenwuguii@163.com
spring.mail.password=czy123456 #163邮箱授权码
spring.mail.properties.mail.smtp.auth=truehouse
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
MailService
类
@Service
public class MailService {
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
@Value("${domain.name}")
private String domainName;
@Autowired
private UserMapper userMapper;
//缓存key-email键值对,当超过15分钟有效期后,若用户还未激活则从数据库删除用户信息
private final Cache<String, String> registerCache =
CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(15, TimeUnit.MINUTES)
.removalListener(new RemovalListener<String, String>() {
@Override
public void onRemoval(RemovalNotification<String, String> notification) {
String email = notification.getValue();
User user = new User();
user.setEmail(email);
List<User> targetUser = userMapper.selectUsersByQuery(user);
if (!targetUser.isEmpty() && Objects.equal(targetUser.get(0).getEnable(), 0)) {
userMapper.delete(email);// 代码优化: 在删除前首先判断用户是否已经被激活,对于未激活的用户进行移除操作
}
}
}).build();
/**
* 发送邮件
*/
@Async
public void sendMail(String title, String url, String email) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);//发送方邮箱
message.setSubject(title);//标题
message.setTo(email);//接收方邮箱
message.setText(url);//内容
mailSender.send(message);
}
/**
* 1.缓存key-email的关系
* 2.借助spring mail 发送邮件
* 3.借助异步框架进行异步操作
*
* @param email
*/
@Async
public void registerNotify(String email) {
String randomKey = RandomStringUtils.randomAlphabetic(10);
registerCache.put(randomKey, email);
String url = "http://" + domainName + "/accounts/verify?key=" + randomKey;
//发送邮件
sendMail("房产平台激活邮件", url, email);
}
}
Nginx代理
前提:当用户上传图片时,我们在数据库存放的是相对地址,然后保存图片到本地,在浏览器需要展示图片时我们取出相对路径后拼接上前缀路径,这里我们使用nginx代理我们图片的存放位置
配置application.properties
文件
#本地存放的文件路径,对应nginx.conf里alias对应目录(D:\user\images)
file.path=/user/images/
#静态资源地址前缀(若本地安装了nginx服务器,开启如下配置)
file.prefix=http://127.0.0.1:8081/images
配置nginx.conf
文件
server {
listen 8081;//监听8081端口
server_name localhost;
charset utf-8;
//代理
location /images {
alias /user/images/;
expires 1d;
}
这样配置的话,当nginx监听到http://localhost:8081/images
的路径时,会代理到http://lcoalhost:8081/user/images
下,也就是D:\user\images目录下去寻找图片。
Redis存储热点数据
在展示房源信息时我们需要显示热点房源,这里我们使用redis
的有序集合实现热门房源的存储,用户查看房源详情在redis对热度加1
Redis Zincrby
命令对有序集合中指定成员的分数加上增量 incrementRedis Zremrangebyrank
命令用于移除有序集中,指定排名(rank)区间内的所有成员。Redis Zrevrange
命令返回有序集中,指定区间内的成员。其中成员的位置按分数值递减(从大到小)来排列
RecommendService
类
@Service
public class RecommendService {
private static final String HOT_HOUSE_KEY = "hot_house";
@Autowired
private HouseService houseService;
/**
* 房产热度+1
* 原理:在redis创建有序集合存放热点房产id
*/
public void increase(Long id) {
try {
Jedis jedis = new Jedis("127.0.0.1");
jedis.auth("123");
//对redis有序集合中指定id的分数加上1
jedis.zincrby(HOT_HOUSE_KEY, 1.0D, id + "");
//0代表第一个元素,-1代表最后一个元素,因为要保留热度最高的10位,所以删除第1位到倒数第11位的元素,剩下10位热度最高的
jedis.zremrangeByRank(HOT_HOUSE_KEY, 0, -11);
jedis.close();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
原文地址:https://www.cnblogs.com/itpy/p/11821170.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Thinkphp5框架ajax接口实现方法分析
- android MediaRecorder实现录屏时带录音功能
- php根据地址获取百度地图经纬度的实例方法
- Android 代码一键实现银行卡绑定功能
- Android 通过cmake的方式接入opencv的方法步骤
- Yii框架响应组件用法实例分析
- Android开发学习实现简单计算器
- Android Studio finish()方法的使用与解决app点击“返回”(直接退出)
- Android 8.1隐藏状态栏图标的实例代码
- Android制作登录页面并且记住账号密码功能的实现代码
- Yii框架分页技术实例分析
- PHP命名空间与自动加载机制的基础介绍
- Flutter下Android Studio配置gradle的方法
- Flutter 实现整个App变为灰色的方法示例
- Android studio开发小型对话机器人app(实例代码)