如何給你的畢設增長亮點

前言

由於疫情相信最近一段時間不少同窗都在準備線上答辯,博主也是同樣,從答辯前緊張到沒法呼吸,到答辯後一身輕鬆感謝各位老師的指導,整個過程就像坐過山車同樣充滿刺激。再見了個人青春,個人學生時代。在答辯過程當中常常會被問到說:你以爲你的項目有什麼亮點?今天就來給你們分享一下能夠用哪些簡單的技術來增長本身畢設的一個亮點。html

發送郵件

其實Spring已經幫咱們封裝好了郵件發送的功能,只須要直接拿來用就能夠了,在個人項目裏就經過Spring Mail實現了郵件註冊、忘記密碼以及給用戶留言等功能java

首先第一步確定是引入依賴redis

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

接着就是咱們的MailService工具類spring

@Service
public class MailService {

    @Autowired
    private JavaMailSender mailSender;//Spring封裝好的類

    private String from=xxx@163.com;

    /**
    * 發送郵件
    */
    @Async
    public void sendMail(String title, String url, String email) {
        SimpleMailMessage message = new SimpleMailMessage();//也是Spring封裝好的
        message.setFrom(from);//郵件發送者
        message.setSubject(title);//郵件標題
        message.setTo(email);//郵件接收者
        message.setText(url);//郵件內容
        mailSender.send(message);//發送
    }
}

代碼中的JavaMailSender以及SimpleMailMessage都是Spring已經封裝好的類,能夠直接拿來使用。
核心代碼已經寫好了,可是這個時候還不能使用,你須要去獲取受權,這裏以163郵箱爲例
數據庫

勾選後安裝提示會叫你設置受權密碼之類的:記住受權的密碼apache

以後只須要在application.properties文件配置一下就能夠了緩存

#spring-mail
spring.mail.host=smtp.163.com
spring.mail.username=xxx@163.com  //這裏換成本身的郵箱
spring.mail.password=xxxx  //受權密碼
spring.mail.properties.mail.smtp.auth=truehouse
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

接下來就能夠去測試一下數據結構

sendMail("激活郵件", "你好,我是超大隻烏龜!", "13415038974@163.com");

效果以下:app

image.png

能夠看到很是簡單就能夠實現發送郵件的功能,固然這只是簡單的發送郵件功能,在個人系統裏面會要求用戶在15分鐘以內打開連接才能成功激活,不然連接就會失效,那咱們來看下是如何實現的:dom

其實就是經過com.google.common的一個Cache類實現的,具體代碼以下:

import com.google.common.cache.Cache;


//緩存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();

我在Cache裏面放的就是key-email,這個key就是發送給用戶的激活連接所帶的key,好比下面這個就是用戶點擊註冊後會發送到用戶郵箱的內容,後面的sukERsSHbe就是隨機生成的一個key

http://127.0.0.1:8090/accounts/verify?key=sukERsSHbe

經過配置一些API方法去設置一個15分鐘的有效期,當15分鐘後就會去調用RemovalListener監聽器,也就是說會去執行onRemoval方法,在該方法裏面就能夠判斷用戶是否已經激活,若沒有則刪除用戶數據。

上面代碼若是看一遍不懂能夠多看幾遍。

關於這個key如何生成能夠本身定義,我用的是org.apache.commons.lang3中的RandomStringUtils類:

String randomKey = RandomStringUtils.randomAlphabetic(10);

排行榜

上面介紹了發送郵件的功能,接下來看看一個排行榜的功能。

在我係統裏面實現的效果就是能夠根據用戶的點擊量去作一個實時的排行,一開始我是想在數據庫添加一個字段來表示點擊量的,可是以爲這樣頻繁訪問數據庫性能會比較低,所以我使用Redis來實現排行榜的功能。

咱們就是經過Redis中一個叫作Sort Set的數據結構來完成該功能的,因此你最好先了解一下相關知識
菜鳥教程 Redis SortSet
代碼以下:

//對redis有序集合中指定id的分數加上1
redisService.zincrby(HOT_HOUSE_KEY, 1.0D, id + "");
//0表明第一個元素,-1表明最後一個元素,由於要保留熱度最高的10位,因此刪除第1位到倒數第11位的元素,
//剩下10位熱度最高的
redisService.zremrangeByRank(HOT_HOUSE_KEY, 0, -11);

本項目是一個房產交易系統,作的是熱門房產排行,所以當用戶點擊以後就會調用redis的zincrby去給房產ID加分,redis會根據評分作一個排行,下面是封裝好的reids類:

/**
     * 對有序集合中指定成員加分
     */
    public void zincrby(String key, double sorce, String id) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.zincrby(key, sorce, id);
        } finally {
            closePool(jedis);
        }
    }

    /**
     * 移除有序集中,指定排名(rank)區間內的全部成員
     */
    public void zremrangeByRank(String key, long start, long end) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.zremrangeByRank(key, start, end);
        } finally {
            closePool(jedis);
        }
    }

redis中默認是按照從低到高去作一個排行,以後經過zrevrange方法作一個倒序取出數據便可,以下:

Set<String> idSet =redisService.zrevrange(HOT_HOUSE_KEY, 0, -1);


/**
* 返回有序集中,指定區間內的成員。其中成員的位置按分數值遞減(從大到小)來排列
*/
public Set<String> zrevrange(String key, long start, long end) {
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        Set<String> set = jedis.zrevrange(key, start, end);
        return set;
    } finally {
        closePool(jedis);
    }
}

總結

以上兩個功能能夠算是系統的幾個亮點,這兩個功能在不少系統中都很經常使用,但願本篇文章能幫到大家,若是有什麼不對的地方請多多指教!

相關文章
相關標籤/搜索