知識庫 / Spring RSS 訂閱

Reddit應用中的用户檔案

REST,Spring
HongKong
12
04:00 AM · Dec 06 ,2025

1. 概述

在本文中,我們將構建一個用於 Reddit 應用用户的個人資料——以便他們可以配置用户特定的偏好。

目標很簡單——而不是每次安排新帖子時讓用户填寫相同的數據,他們可以一次設置——在個人資料的偏好中。當然,用户始終可以針對每個帖子調整這些設置——但想法是他們不需要這樣做。

2. 偏好實體

總體而言,現在可以配置在應用程序中的大多數內容都將成為全局配置,並存儲在用户配置文件中。

首先,我們來介紹一個 偏好 實體:

@Entity
public class Preference {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String email;

    private String subreddit;

    private boolean sendReplies;

    // for post re-submission
    private int noOfAttempts;
    private int timeInterval;
    private int minScoreRequired;
    private int minUpvoteRatio;
    private boolean keepIfHasComments;
    private boolean deleteAfterLastAttempt;
}

那麼,我們現在可以配置什麼呢? 簡單來説,就是應用程序中幾乎所有設置的默認值

我們還存儲了用户的電子郵件,以便他們可以收到關於其帖子狀態的通知。

現在,讓我們將偏好設置與用户關聯

@Entity
public class User {
    ...
    
    @OneToOne
    @JoinColumn(name = "preference_id")
    private Preference preference;
}

如你所見,UserPreference 之間存在簡單的一對一關係。

3. 簡單個人資料頁

首先,讓我們創建一個簡單的個人資料頁:

<form >
    <input type="hidden" name="id" />
    <input name="email" type="email"/>
    <input name="subreddit"/>
    ...
   <button onclick="editPref()" >Save Changes</button>
</form>
<script>
$(function() {
    $.get("user/preference", function (data){
        $.each(data, function(key, value) {
            $('*[name="'+key+'"]').val(value);
        });
    });
});
function editPref(){
    var data = {};
	$('form').serializeArray().map(function(x){data[x.name] = x.value;});
	$.ajax({
        url: "user/preference/"+$('input[name="id"]').val(),
        data: JSON.stringify(data),
        type: 'PUT',
        contentType:'application/json'
    }).done(function() { window.location.href = "./"; })
      .fail(function(error) { alert(error.responseText); }); 
}
</script>

這裏沒有任何複雜的內容 – 只是純粹的 HTML 和 JavaScript。

我們還添加一個快速鏈接到新個人資料:

<h1>Welcome, <a href="profile" sec:authentication="principal.username">username</a></h1>

4. API

以下是控制器,用於創建和編輯用户偏好設置:

@Controller
@RequestMapping(value = "/user/preference")
public class UserPreferenceController {

    @Autowired
    private PreferenceRepository preferenceReopsitory;

    @RequestMapping(method = RequestMethod.GET)
    @ResponseBody
    public Preference getCurrentUserPreference() {
        return getCurrentUser().getPreference();
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    @ResponseStatus(HttpStatus.OK)
    public void updateUserPreference(@RequestBody Preference pref) {
        preferenceReopsitory.save(pref);
        getCurrentUser().setPreference(pref);
    }
}

最後,我們需要確保在創建用户時,其偏好也被初始化。

public void loadAuthentication(String name, OAuth2AccessToken token) {
    ...
    Preference pref = new Preference();
    preferenceReopsitory.save(pref);
    user.setPreference(pref);
    userReopsitory.save(user);
    ...   
}

5. 加載/使用偏好設置

現在,讓我們看看如何使用這些偏好設置並在需要時進行填寫。

我們將從主 發佈計劃 頁面開始——在這裏,我們將加載用户的偏好設置。

$(function() {
    $.get("user/preference", function (data){
        $.each(data, function(key, value) {
            $('*[name="'+key+'"]').val(value);
        });
    });
});

6. 測試與結論

我們已經接近尾聲——我們只需要為新引入的 Profile 實體實施一些基本的集成測試。

大部分情況下,我們將簡單地擴展現有的基本持久性測試,並繼承來自該測試的眾多測試用例。

最後,我們可以完成新用户配置文件功能——用户現在可以設置自己的偏好。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.