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; }
Как вы можете видеть, у нас есть простое отношение один на один между Пользователь и предпочтение.
3. Простая страница профиля
Во-первых, давайте создадим нашу простую страницу профиля:
Ничего необычного здесь – просто некоторые простые HTML и JavaScript.
Давайте также добавим быструю ссылку на новый профиль:
Welcome, username
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); } }
Наконец, мы должны убедиться, что, когда пользователь создан, его предпочтения также inintialized:
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. Тестирование и заключение
Мы почти закончили – нам просто нужно реализовать некоторые базовые интеграционные тесты для новой сущности профиля, которую мы только что представили.
По большей части, мы просто собираемся расширить существующий тест на сохранение базы и унаследовать батарею тестов от этого.
Наконец – мы можем завершить новую функциональность профиля пользователя – пользователи теперь могут настроить свои собственные предпочтения.