1. 概述
在本文中,我們將構建用於 Reddit 應用程序用户的個人資料——以便他們可以配置用户特定的偏好。
目標很簡單——而不是讓用户每次安排新帖子時都填寫相同的數據,他們可以一次設置——在個人資料的偏好中。當然,用户始終可以針對每個帖子調整這些設置——但想法是他們不必這樣做。
2. 偏好實體
總的來説,現在可以配置在應用程序中的大多數內容都將成為用户配置文件中的全局配置。首先,讓我們從一個 偏好 實體開始:
@Entity
public class Preference {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String email;
private String subreddit;
private boolean sendReplies;
// 用於帖子重新提交
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;
}
正如您所看到的,我們有一個用户和 偏好 之間的一對一關係。
3. 簡單的個人資料頁面
首先,讓我們創建一個簡單的個人資料頁面:
<form >
<input type="hidden" name="id" />
<input name="email" type="email"/>
<input name="subreddit"/>
...
<button onclick="editPref()" >保存更改</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>歡迎,<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 實體實施一些基本的集成測試。
在大多數情況下,我們將簡單地擴展現有的基本持久性測試並繼承來自該測試的電池級測試。
最後——我們可以完成新用户配置文件功能——用户現在可以設置自己的偏好。