Java単体からマイクロサービスまで不動産販売プラットフォームを構築
概要
最近、ある授業の
Spring Mailアクティブリンク送信
機能実現:ユーザー登録時に
導入
設定
Nginxエージェント
前提:ユーザーが画像をアップロードする時、私達はデータベースで相対アドレスを保存して、それから画像をローカルに保存して、ブラウザが画像を展示する必要がある時私達は相対経路を取り出した後に接頭辞の経路をつなぎ合わせて、ここで私達はnginxを使って私達の画像の保存の位置を代理します
設定
設定
このように構成すると、nginxが
Redisストレージホットスポットデータ
部屋の情報を展示する時私達はホットスポットの部屋の源を表示する必要があって、ここで私達は
最近、ある授業の
《Java 》
を勉強しています.Spring Mailアクティブリンク送信
機能実現:ユーザー登録時に
spring mail
を通じてユーザーにアクティブリンクを送信し、有効期間内にユーザーがリンクをクリックした後、ユーザー状態をアクティブ状態に更新する.導入
spring-mail
依存
org.springframework.boot
spring-boot-starter-mail
設定
appliacation.properties
ファイル#
domain.name=127.0.0.1:8090
#spring-mail
spring.mail.host=smtp.163.com #163
[email protected]
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 registerCache =
CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(15, TimeUnit.MINUTES)
.removalListener(new RemovalListener() {
@Override
public void onRemoval(RemovalNotification notification) {
String email = notification.getValue();
User user = new User();
user.setEmail(email);
List 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:userimagesディレクトリに代理して画像を探す.Redisストレージホットスポットデータ
部屋の情報を展示する時私達はホットスポットの部屋の源を表示する必要があって、ここで私達は
redis
の秩序ある集合を使ってホットスポットの部屋の源の記憶を実現して、ユーザーは部屋の源の詳細を見てredisで熱に対して1をプラスしますRedis Zincrby
コマンドは、順序セット内の指定したメンバーのスコアに増分incrementRedis Zremrangebyrank
コマンドを加えて、順序セットを削除し、ランキング区間内のすべてのメンバーを指定します.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);
}
}
// id
public List getHot() {
try {
Jedis jedis = new Jedis("127.0.0.1");
jedis.auth("123");
// z + reverse + range
Set idSet = jedis.zrevrange(HOT_HOUSE_KEY, 0, -1);
jedis.close();
//Set List
List ids = idSet.stream().map(Long::parseLong).collect(Collectors.toList());
return ids;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return Lists.newArrayList();
}
}
/**
*
*/
public List getHotHouse(Integer size) {//size
House query = new House();
// id
List list = getHot();
list = list.subList(0, Math.min(list.size(), size));
if (list.isEmpty()) {
return Lists.newArrayList();
}
query.setIds(list);
final List order = list;
// id
List houses = houseService.queryAndSetImg(query, PageParams.build(size, 1));
// , Ordering houses order id
Ordering houseSort = Ordering.natural().onResultOf(hs -> order.indexOf(hs.getId()));
return houseSort.sortedCopy(houses);
}