This commit is contained in:
mmrbnjd
2024-04-29 07:58:41 +03:30
parent fd13de3e1d
commit 7b8127dc72
23 changed files with 526 additions and 39 deletions

View File

@@ -1,4 +1,10 @@
@inherits LayoutComponentBase
@using Front.Services
@using Shared.DTOs
@inject ILocalStorageService Storage;
@inject UserAuthenticationDTO userinfo
@inject HttpClient _hc
@inject NavigationManager nav
<HeadContent>
<link rel="canonical" href="#">
<!-- Favicon -->
@@ -116,33 +122,42 @@
<ul class="navbar-nav flex-row align-items-center mr-auto f-ir">
<!-- Place this tag where you want the button to render. -->
<li class="nav-item lh-1 me-3 f-ir">
<span class="fw-semibold d-block">جان دو</span>
<span class="fw-semibold d-block">@userinfo.Company.Name</span>
</li>
<!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown">
<a class="nav-link dropdown-toggle hide-arrow" href="javascript:void(0);" data-bs-toggle="dropdown">
<div class="avatar avatar-online">
<img src="assets/img/avatars/1.png" alt class="w-px-40 h-auto rounded-circle">
@{
string _src = "assets/img/avatars/1.png";
if (userinfo.Company.Logo != null)
_src = "data:image/jpeg;base64," + @userinfo.Company.Logo;
}
<img src=@_src alt class="w-px-40 h-auto rounded-circle">
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end new-style-13">
<li>
<a class="dropdown-item" href="#">
<NavLink class="dropdown-item" href="Profile">
<i class="bx bx-user me-2"></i>
<span class="align-middle">پروفایل من</span>
</a>
</NavLink>
</li>
<li>
<div class="dropdown-divider"></div>
</li>
<li>
<a class="dropdown-item" href="auth-login-basic.html">
<li> <a class="dropdown-item">
<i class="bx bx-power-off me-2"></i>
<span class="align-middle">خروج</span>
</a>
<NavLink style="cursor:pointer" onclick="@Logout">
<span style="color:red;">خروج</span>
</NavLink>
</a>
</li>
</ul>
</li>
@@ -165,14 +180,11 @@
<div class="mb-2 mb-md-0">
<span>کپی رایت با <a href="#">مهدی</a> 2023</span>
</div>
@* <div>
<a href="#" class="footer-link me-4">مجوز</a>
<a href="#" class="footer-link me-4">تم های بیشتر</a>
<a href="#" class="footer-link me-4">مستندات</a>
<a href="#" class="footer-link me-4">پشتیبانی</a>
</div> *@
<div>
<NavLink style="cursor:pointer" onclick="@Logout">
<span style="color:red;">خروج</span>
</NavLink>
</div>
</div>
</footer>
<!-- / Footer -->
@@ -187,3 +199,12 @@
</div>
@functions {
private async Task Logout()
{
_hc.DefaultRequestHeaders.Clear();
await Storage.RemoveItem("token");
userinfo.Token = "";
nav.NavigateTo("/");
}
}

View File

@@ -34,27 +34,34 @@
<!-- Misc -->
<li class="menu-header small text-uppercase"><span class="menu-header-text">متفرقه</span></li>
<li class="menu-item @cssActionItem[4]" @onclick="() => onClickcssActionItem(4)">
<NavLink class="dropdown-item" href="Profile">
<i class="bx bx-user me-2"></i>
<span class="align-middle">پروفایل</span>
</NavLink>
</li>
<li class="menu-item @cssActionItem[5]" @onclick="() => onClickcssActionItem(5)">
<NavLink href="#" target="_blank" class="menu-link">
<i class="menu-icon tf-icons bx bx-support"></i>
<div>پشتیبانی</div>
</NavLink>
</li>
<li class="menu-item @cssActionItem[5]" @onclick="() => onClickcssActionItem(5)">
<li class="menu-item @cssActionItem[6]" @onclick="() => onClickcssActionItem(6)">
<NavLink href="#" target="_blank" class="menu-link">
<i class="menu-icon tf-icons bx bx-copy"></i>
<div >سفارشات</div>
</NavLink>
</li>
<li class="menu-item @cssActionItem[6]" @onclick="() => onClickcssActionItem(6)">
<li class="menu-item @cssActionItem[7]" @onclick="() => onClickcssActionItem(7)">
<NavLink href="#" target="_blank" class="menu-link">
<i class="menu-icon tf-icons bx bx-file"></i>
<div>تنظیمات</div>
</NavLink>
</li>
</ul>
@code{
string[] cssActionItem = { "active", "", "", "", "", "", "" };
string[] cssActionItem = { "active", "", "", "", "", "", "", "" };
}
@functions{

View File

@@ -58,7 +58,7 @@
<div class="postbox__comment-input mb-30">
<InputText @bind-Value="Model.Username" id="Username" type="text" class="inputText" required="" />
<span class="floating-label">نام کاربری</span>
<span class="floating-label">نام کاربری(موبایل)</span>
</div>
</div>
<div class="col-12">
@@ -104,7 +104,7 @@
</div>
<div class="col-6">
<div class="postbox__forget text-end">
<a href="#">رمز عبور را فراموش کرده اید؟</a>
<a onclick="@ForgetPass">رمز عبور را فراموش کرده اید؟</a>
</div>
</div>
</div>
@@ -150,10 +150,23 @@
string alertMessage = "";
protected override async Task OnParametersSetAsync()
{
if (from == "Verification")
if (from == "VerificationRegister")
{
ShowSuccessAlert("ثبت نام شما با موفقیت انجام شد");
}
else if (from == "VerificationFrogetPass")
{
ShowSuccessAlert("تغییر کلمه عبور با موفقیت انجام شد");
}
else if (from == "unon")
{
ShowSuccessAlert("برای استفاده از برنامه لطفا مجدد وارد شود");
}
else if (from == "changePass")
{
ShowSuccessAlert("کلمه عبور با موفقیت تغییر کرد");
}
await base.OnParametersSetAsync();
}
protected override async Task OnInitializedAsync()
@@ -184,7 +197,36 @@
alertMessage = msg;
}
private async Task EndForm() => nav.NavigateTo("/");
private async Task ForgetPass()
{
if (string.IsNullOrEmpty(Model.Username))
{
ShowDangerAlert("لطفا نام کابری(موبایل) خود را وارد نمایید");
}
else if (string.IsNullOrEmpty(Model.Password))
{
ShowDangerAlert("لطفا کلمه عبور جدید را وارد نمایید");
}
else
{
var request = await _hc.PostAsJsonAsync("Base/ForgetPassWord", new ForgetPasswordItem
{
Username = Model.Username,
PassWord = Model.Password
});
if (request.IsSuccessStatusCode)
{
var VerificationID = await request.Content.ReadFromJsonAsync<int>();
nav.NavigateTo($"Verification/{VerificationID}");
}
else
{
var error = await request.Content.ReadFromJsonAsync<List<string>>();
ShowDangerAlert(error[0]);
}
}
}
private async Task OnLoginClick()
{
@@ -207,7 +249,7 @@
userinfo.Photo = userinfomodel.Photo;
userinfo.exitDate = userinfomodel.exitDate;
userinfo.enterDate = userinfomodel.enterDate;
userinfo.UserName = userinfomodel.UserName;
nav.NavigateTo("/Panel");
}

View File

@@ -0,0 +1,200 @@
@page "/Profile"
@using Front.Services
@using Shared.DTOs
@layout PanelLayout
@inject UserAuthenticationDTO userinfo
@inject HttpClientController _hc
@inject ILocalStorageService Storage;
<div class="container-xxl flex-grow-1 container-p-y">
<h4 class="fw-bold py-3 mb-4">
<span class="text-muted fw-light">متفرقه /</span> پروفایل
</h4>
<div class="row">
<Alert hidden="@Hidealert" Color="@alertColor" Dismissable="false">
<Icon Name="@alertIconName" class="me-2"></Icon>
@alertMessage
</Alert>
</div>
<div class="row">
<div class="col-md-12">
<div class="card mb-4">
<h5 class="card-header">تغییر عکس</h5>
<div class="card-body">
<div class="d-flex align-items-start align-items-sm-center gap-4">
@{
_src = "assets/img/avatars/1.png";
if (userinfo.Company.Logo != null)
_src = "data:image/jpeg;base64," + @userinfo.Company.Logo;
}
<img src="@_src" alt="user-avatar" class="d-block rounded" height="100" width="100" id="uploadedAvatar">
<div class="button-wrapper">
<label for="upload" class="btn btn-primary me-2 mb-4" tabindex="0">
<span class="d-none d-sm-block">آپلود تصویر جدید</span>
<i class="bx bx-upload d-block d-sm-none"></i>
<InputFile OnChange="changePic" type="file" id="upload" class="account-file-input" hidden="" accept="image/png, image/jpeg"/>
</label>
<p class="text-muted mb-0">JPG، GIF یا PNG مجاز است. حداکثر اندازه @maxFileSize هزار</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="card mb-4">
<h5 class="card-header">تغییر کلمه عبور</h5>
<div class="card-body">
<EditForm Model="changepassModel" OnSubmit="changepassSubmit" FormName="changepass">
<div class="mb-3 row">
<label for="defaultFormControlInput" class="form-label">کلمه عبور فعلی</label>
<div class="col-md-10">
<InputText @bind-Value="@changepassModel.oldPass" style="text-align:center;" class="form-control" type="password" id="html5-password-input"/>
</div>
</div>
<div class="mb-3 row">
<label for="defaultFormControlInput" class="form-label">کلمه عبور جدید</label>
<div class="col-md-10">
<InputText style="text-align:center;" @bind-Value="@changepassModel.newPass" class="form-control" type="password" id="html5-password-input" />
</div>
</div>
<div class="mb-3 row">
<label for="defaultFormControlInput" class="form-label">تکرار کلمه عبور جدید</label>
<div class="col-md-10">
<InputText @bind-Value="@changepassModel.renewPass" style="text-align:center;" class="form-control" type="password" id="html5-password-input" />
</div>
</div>
<button type="submit" class="btn btn-primary">ارسال</button>
</EditForm>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card mb-4">
<h5 class="card-header">تغییر نام کاربری/ موبایل</h5>
<div class="card-body">
<form>
<div class="mb-3 row">
<label for="defaultFormControlInput" class="form-label">موبایل جدید</label>
<div class="input-group input-group-merge">
<input type="text" style="text-align:left;" id="basic-icon-default-phone" class="form-control phone-mask" placeholder="0000 000 0911" aria-label="0000 000 0911" value="@userinfo.UserName" aria-describedby="basic-icon-default-phone2">
<span id="basic-icon-default-phone2" class="input-group-text"><i class="bx bx-phone"></i></span>
</div>
</div>
<button type="submit" class="btn btn-primary">ارسال</button>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="card mb-4">
<h5 class="card-header">تغییر نام</h5>
<div class="card-body">
<form>
<div class="mb-3 row">
<label for="defaultFormControlInput" class="form-label">نام جدید</label>
<div class="input-group input-group-merge">
<span id="basic-icon-default-company2" class="input-group-text"><i class="bx bx-buildings"></i></span>
<input style="text-align:right;" type="text" id="basic-icon-default-company" value="@userinfo.Company.Name" class="form-control" placeholder="@userinfo.Company.Name" aria-label="@userinfo.Company.Name" aria-describedby="basic-icon-default-company2">
</div>
</div>
<button type="submit" class="btn btn-primary">ارسال</button>
</form>
</div>
</div>
</div>
</div>
</div>
@code {
public string _src { get; set; }
private long maxFileSize = 1024 * 15;
[SupplyParameterFromForm]
public ChangePasswordDto changepassModel { get; set; }
// alert
AlertColor alertColor = AlertColor.Primary;
IconName alertIconName = IconName.CheckCircleFill;
bool Hidealert = true;
string alertMessage = "";
protected override void OnInitialized() => changepassModel ??= new();
}
@functions{
private void ShowDangerAlert(string msg)
{
Hidealert = false;
alertColor = AlertColor.Danger;
alertIconName = IconName.ExclamationTriangleFill;
alertMessage = msg;
}
private void ShowSuccessAlert(string msg)
{
Hidealert = false;
alertColor = AlertColor.Success;
alertIconName = IconName.CheckCircleFill;
alertMessage = msg;
}
private async Task changepassSubmit(){
var request = await _hc.Post<ChangePasswordDto>("User/ChangePassword", changepassModel);
if (request.IsSuccessStatusCode)
{
if (await request.Content.ReadFromJsonAsync<bool>())
{
_hc._hc.DefaultRequestHeaders.Clear();
await Storage.RemoveItem("token");
userinfo.Token = "";
_hc._nav.NavigateTo("/Sign-in/changePass");
}
else ShowDangerAlert("خطای سیستمی");
}else
{
var errors = await request.Content.ReadFromJsonAsync<List<string>>();
ShowDangerAlert(errors[0]);
}
}
private async Task changePic(InputFileChangeEventArgs e){
if (e.GetMultipleFiles()[0].Size <= maxFileSize)
{
string Base64Str = "";
byte[] Array;
using (MemoryStream stream = new MemoryStream())
{
await e.GetMultipleFiles()[0].OpenReadStream(maxFileSize).CopyToAsync(stream);
Array = stream.ToArray();
Base64Str = Convert.ToBase64String(Array);
}
if (!string.IsNullOrEmpty(Base64Str))
{
var request = await _hc.Post<byte[]>("Company/ChangeLogo", Array);
if (request.IsSuccessStatusCode)
{
userinfo.Company.Logo = _src = Base64Str;
ShowSuccessAlert("تصویر با موفقیت تغییر کرد");
}
else
{
ShowDangerAlert ( "خطایی در اجرای عملیات رخ داده");
}
}
}
else
{
ShowDangerAlert ( "حجم فایل بیشتر از حد مجاز می باشد");
}
}
}

View File

@@ -143,7 +143,9 @@
if (status)
{
if (VerificationCodeModel.Type == "CompanyRegistration")
nav.NavigateTo("/Sign-in/Verification");
nav.NavigateTo("/Sign-in/VerificationRegister");
else if (VerificationCodeModel.Type == "ForgetPassword")
nav.NavigateTo("/Sign-in/VerificationFrogetPass");
else
nav.NavigateTo("/");

View File

@@ -13,6 +13,7 @@ builder.Services.AddBlazorBootstrap();
builder.Services.AddScoped<ILocalStorageService, LocalStorageService>();
builder.Services.AddScoped<localService>();
builder.Services.AddScoped<HttpClientController>();
builder.Services.AddScoped(sp => new UserAuthenticationDTO());

View File

@@ -0,0 +1,30 @@
using Microsoft.AspNetCore.Components;
using System.Net.Http.Json;
namespace Front.Services
{
public class HttpClientController
{
public readonly HttpClient _hc;
public readonly NavigationManager _nav;
public HttpClientController(HttpClient hc, NavigationManager nav)
{
_hc = hc;
_nav = nav;
}
public async Task<HttpResponseMessage> Get(string route)
{
var request = await _hc.GetAsync(route);
if (request.StatusCode==System.Net.HttpStatusCode.Unauthorized)
_nav.NavigateTo("/Sign-in/unon");
return request;
}
public async Task<HttpResponseMessage> Post<T>(string route,T mode)
{
var request = await _hc.PostAsJsonAsync(route,mode);
if (request.StatusCode == System.Net.HttpStatusCode.Unauthorized)
_nav.NavigateTo("/Sign-in/unon");
return request;
}
}
}

View File

@@ -31,6 +31,7 @@ namespace Front.Services
_user.Photo = userinfomodel.Photo;
_user.exitDate = userinfomodel.exitDate;
_user.enterDate = userinfomodel.enterDate;
_user.UserName= userinfomodel.UserName;
}
}