| Version 8 (modified by , 3 days ago) ( diff ) |
|---|
Финална имплементација на случаи на употреба
На следната табела се прикажани финалните кориснички сценарија:
| ID | Use Case Scenario | Actor |
| 14 | Најава преку OAuth2 (Google, Microsoft, GitHub) | Корисник |
| 15 | Поставување на предлог теми за проект | Ментор |
| 16 | Доделување теми на студент | Ментор |
| 17 | Контакт со ментор (променет) | Студент |
И дополнително се имплементирани E-mail нотификации, поврзани со inbox на самиот сајт.
Корисник
Најава преку OAuth2
Кога прв пат ќе ја отвори страната, корисникот е редиректиран кон страната за најава. Долу, има дополнителни три копчиња за најава со Google, Microsoft и GitHub.
Да го земеме како пример Google. Корисникот ја одбира опцијата за најава со Google и е редиректиран кон најавата поставена од Google:
Откако ќе го одбере својот Google профил и успешно помине најавата, тогаш корисникот може да продолжи со регистрација. Тука се пополуваат полињата како име, презиме и мејл:
Сега што останува е корисникот да пополни биографија, предмети, интереси, доколку е студент тогаш индекс, година, семестар, итн. Но тие се опционални, и регистрацијата преку Google е завршена.
Сега, секогаш кога корисникот сака да се најави на Најди Ментор, може преку својот Google профил.
var googleId = System.Configuration.ConfigurationManager.AppSettings["GoogleClientId"];
var googleSecret = System.Configuration.ConfigurationManager.AppSettings["GoogleClientSecret"];
if (!string.IsNullOrWhiteSpace(googleId) && !string.IsNullOrWhiteSpace(googleSecret))
{
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions
{
ClientId = googleId,
ClientSecret = googleSecret,
CallbackPath = new PathString("/signin-google"),
CookieManager = cookieManager
});
}
// POST: /Account/ExternalLogin
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl)
{
// Request a redirect to the external login provider
var redirectUrl = Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl });
return new ChallengeResult(provider, redirectUrl);
}
// POST: /Account/ExternalLoginConfirmation
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ExternalLoginConfirmation(WebApplication1.Models.ExternalLoginConfirmationViewModel model, string returnUrl)
{
if (User.Identity.IsAuthenticated)
{
return RedirectToAction("Index", "Manage");
}
if (!ModelState.IsValid)
{
return View(model);
}
// Obtain external login info again
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
if (info == null)
{
ModelState.AddModelError("", "Не можам да ги вчитам информации за надворешната најава.");
return View(model);
}
ApplicationUser user;
if (model.UserType == "Student")
{
user = new Student
{
UserName = model.Email,
Email = model.Email,
Name = model.Name,
Surname = model.Surname,
Biography = model.Biography,
Index = model.Index,
Major = model.Major,
Cycle = model.Cycle,
Semester = model.Semester
};
}
else // Mentor
{
user = new Mentor
{
UserName = model.Email,
Email = model.Email,
Name = model.Name,
Surname = model.Surname,
Biography = model.Biography,
Timeslots = model.Timeslots,
TypesOfProject = model.TypesOfProject,
Available = model.Available,
ImageURL = null
};
}
// Create user
var result = await UserManager.CreateAsync(user);
if (!result.Succeeded)
{
AddErrors(result);
return View(model);
}
// Add the external login
result = await UserManager.AddLoginAsync(user.Id, info.Login);
if (!result.Succeeded)
{
AddErrors(result);
return View(model);
}
if (model.UserType == "Student")
{
var student = db.Users
.OfType<Student>()
.Include(s => s.Subjects)
.Include(s => s.Topics)
.SingleOrDefault(u => u.Id == user.Id);
if (student != null)
{
// clear any placeholder (should be empty for a brand new user) and add incoming items
student.Subjects.Clear();
student.Topics.Clear();
foreach (var subjName in model.Subjects ?? Enumerable.Empty<string>())
student.Subjects.Add(new Subject { Name = subjName, UserId = student.Id });
foreach (var topicName in model.Topics ?? Enumerable.Empty<string>())
student.Topics.Add(new Topic { Name = topicName, UserId = student.Id });
db.SaveChanges();
}
}
else // Mentor
{
var mentor = db.Users
.OfType<Mentor>()
.Include(m => m.Subjects)
.Include(m => m.Topics)
.SingleOrDefault(u => u.Id == user.Id);
if (mentor != null)
{
mentor.Subjects.Clear();
mentor.Topics.Clear();
foreach (var subjName in model.Subjects ?? Enumerable.Empty<string>())
mentor.Subjects.Add(new Subject { Name = subjName, UserId = mentor.Id });
foreach (var topicName in model.Topics ?? Enumerable.Empty<string>())
mentor.Topics.Add(new Topic { Name = topicName, UserId = mentor.Id });
db.SaveChanges();
}
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LinkLogin(string provider)
{
// Request redirect to external login provider to link to current user
return new ChallengeResult(provider, Url.Action("LinkLoginCallback", "Account"), User.Identity.GetUserId());
}
[AllowAnonymous]
public async Task<ActionResult> LinkLoginCallback()
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId());
if (loginInfo == null)
{
return RedirectToAction("Manage", new { Message = ManageMessageId.Error });
}
var result = await UserManager.AddLoginAsync(User.Identity.GetUserId(), loginInfo.Login);
if (result.Succeeded)
{
return RedirectToAction("Manage", new { Message = ManageMessageId.AddLoginSuccess });
}
return RedirectToAction("Manage", new { Message = ManageMessageId.Error });
}
Ментор
Поставување на предлог теми за проект
Менторот може да постави предлог теми за проект на својот профил. Најпрво треба да го отвори прозорецот за уредување на својот профил и да го најде следното поле:
Откако ќе додаде тема, ќе може да ја уреди, избрише или додели на некој студент, притоа студентот мора да стапил во контакт со менторот претходно на самата страна и да има договор помеѓу студентот и менторот за таа тема. Доколку темата е доделена, менторот може да ја одземе.
Доделување теми на студент
Менторот може да додели тема на студент преку dropdown кое е пополнето со сите студенти кои го контактирале менторот:
Секој корисник може да ги види предлог темите на менторот на неговиот профил. Може да види наслов, опис, доколку се доделени или не. Ако е менторот, или пак студентот на кој е доделена темата, тогаш има посебно поле „Доделена на студент:“
Студент
Контакт со ментор (променет)
Контактирање на ментор од страна на студент останува исто, само е додадено поле за избор на предлог тема, која студентот може да ја избере но е опционална.
Студентот стиска на копчето за контакт кај профилот на менторот и се отвара следниот прозорец:
По испраќање на контакт барање на менторот, менторот добива нотификација како и претходно, само што сега е излистана и темата која ја одбрал студентот. Ова е со цел да знае професорот на кого да ја додели темата понатаму, но тоа мора да го направи преку својот профил, во случај да има повеќе заинтересирани студенти.
Нотификации преку E-mail
Воведени се нотификација преку E-mail. освен што стигаат во постоечкиот Inbox, сега сите нотификации стигаат и преку E-mail на корисникот.
Пример:
Attachments (11)
- најава.png (31.4 KB ) - added by 3 days ago.
- најава2.png (26.6 KB ) - added by 3 days ago.
- најава3.png (30.8 KB ) - added by 3 days ago.
- теми.png (53.5 KB ) - added by 3 days ago.
- доделитема.png (15.2 KB ) - added by 3 days ago.
- темипрофил.png (34.3 KB ) - added by 3 days ago.
- темипрофил2.png (46.1 KB ) - added by 3 days ago.
- нотиф.png (52.5 KB ) - added by 3 days ago.
- нотиф2.png (53.3 KB ) - added by 3 days ago.
- контакт.png (32.5 KB ) - added by 3 days ago.
- контактнотиф.png (38.9 KB ) - added by 3 days ago.
Download all attachments as: .zip











