最近在學習某課的《Java從單體到微服務打造房產銷售平臺》
,也算是我學習的第一門微服務課程,在此開貼記錄一下知識點,若有不當請多指教!nginx
功能實現:在註冊用戶時經過spring mail
發送激活連接到用戶的郵箱,在有效期內用戶點擊連接後更新用戶狀態爲激活狀態。redis
引入spring-mail
依賴spring
<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代理咱們圖片的存放位置緩存
配置application.properties
文件服務器
#本地存放的文件路徑,對應nginx.conf裏alias對應目錄(D:\user\images) file.path=/user/images/ #靜態資源地址前綴(若本地安裝了nginx服務器,開啓以下配置) file.prefix=http://127.0.0.1:8081/images
配置nginx.conf
文件app
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對熱度加1dom
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); } } //返回熱點房產id public List<Long> getHot() { try { Jedis jedis = new Jedis("127.0.0.1"); jedis.auth("123"); //按從高到低排序取出全部元素 z + reverse + range Set<String> idSet = jedis.zrevrange(HOT_HOUSE_KEY, 0, -1); jedis.close(); //Set<String>轉換成List<Long> List<Long> ids = idSet.stream().map(Long::parseLong).collect(Collectors.toList()); return ids; } catch (Exception e) { logger.error(e.getMessage(), e); return Lists.newArrayList(); } } /** * 獲取熱點房產 */ public List<House> getHotHouse(Integer size) {//size爲須要顯示的熱點房產數 House query = new House(); //獲取熱點房產id集合 List<Long> list = getHot(); list = list.subList(0, Math.min(list.size(), size)); if (list.isEmpty()) { return Lists.newArrayList(); } query.setIds(list); final List<Long> order = list; //根據id集合查詢房產集合 List<House> houses = houseService.queryAndSetImg(query, PageParams.build(size, 1)); //由於上面會打亂順序,因此使用Ordering類讓houses根據在order中的id順序從新進行排序 Ordering<House> houseSort = Ordering.natural().onResultOf(hs -> order.indexOf(hs.getId())); return houseSort.sortedCopy(houses); }