2fb86a435e
ASP.NET Core 10 Razor Pages + PostgreSQL/EF Core. RTL Persian, Jalali dates, self-hosted Vazirmatn, teal/coral brand. Features: - Shift listings: browse/filter (city, district, role, type, pay), weekly Jalali calendar, detail + interest handoff, near-me distance sort - Hiring (استخدام) listings with employment type + salary range - Pattern-engine recommendations + anonymous interest tracking (visitor cookie) - Heuristic Persian listing-parser + admin queue (raw channel post → shift/job) - Phone-OTP cookie auth + visitor-history linking + profile Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
155 lines
6.8 KiB
Plaintext
155 lines
6.8 KiB
Plaintext
@page
|
||
@model IndexModel
|
||
@{
|
||
ViewData["Title"] = null; // use default site title for the home page (best for SEO)
|
||
ViewData["Description"] = "همکادر؛ سریعترین راه برای کادر درمان (پزشک، پرستار، ماما، تکنسین) جهت یافتن شیفت و موقعیت استخدامی در بیمارستانها و کلینیکهای تهران. بهجای گشتن در کانالهای تلگرام و بله، همه فرصتها یکجا.";
|
||
}
|
||
|
||
<section class="hero">
|
||
<div class="container">
|
||
<h1>شیفت و شغل بعدیات را در چند ثانیه پیدا کن</h1>
|
||
<p>
|
||
دیگر لازم نیست دهها کانال تلگرام، بله و آگهی دیوار را زیر و رو کنی.
|
||
همهی شیفتها و فرصتهای استخدامی کادر درمان تهران، دستهبندیشده بر اساس
|
||
مرکز درمانی، محل و تقویم هفتگی — یکجا.
|
||
</p>
|
||
|
||
<form class="search-card" method="get" asp-page="/Shifts/Index">
|
||
<div class="field">
|
||
<label>شهر</label>
|
||
<select name="cityId">
|
||
<option value="">همه شهرها</option>
|
||
@foreach (var c in Model.Cities)
|
||
{
|
||
<option value="@c.Id">@c.Name</option>
|
||
}
|
||
</select>
|
||
</div>
|
||
<div class="field">
|
||
<label>نقش</label>
|
||
<select name="roleId">
|
||
<option value="">همه نقشها</option>
|
||
@foreach (var r in Model.Roles)
|
||
{
|
||
<option value="@r.Id">@r.Name</option>
|
||
}
|
||
</select>
|
||
</div>
|
||
<div class="field">
|
||
<label>نوع شیفت</label>
|
||
<select name="shiftType">
|
||
<option value="">همه</option>
|
||
<option value="0">صبح</option>
|
||
<option value="1">عصر</option>
|
||
<option value="2">شب</option>
|
||
<option value="3">آنکال</option>
|
||
</select>
|
||
</div>
|
||
<div class="field">
|
||
<label> </label>
|
||
<button type="submit" class="btn btn-accent btn-block btn-lg">جستجوی فرصتها</button>
|
||
</div>
|
||
</form>
|
||
|
||
<div class="stat-pills">
|
||
<div class="stat-pill"><span class="n">@JalaliDate.ToPersianDigits(Model.OpenShiftCount.ToString())</span><span class="l">شیفت باز</span></div>
|
||
<div class="stat-pill"><span class="n">@JalaliDate.ToPersianDigits(Model.FacilityCount.ToString())</span><span class="l">مرکز درمانی</span></div>
|
||
<div class="stat-pill"><span class="n">@JalaliDate.ToPersianDigits(Model.CityCount.ToString())</span><span class="l">شهر فعال</span></div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
@if (Model.Recommendations.Count > 0)
|
||
{
|
||
<section class="section" style="padding-bottom:0;">
|
||
<div class="container">
|
||
@if (Model.HasPersonalization)
|
||
{
|
||
<div class="rec-banner">
|
||
<div>
|
||
<h2 style="margin:0 0 4px;">✨ پیشنهادهای ویژه شما</h2>
|
||
<span style="opacity:.9; font-size:14px;">بر اساس علاقهمندیها و فعالیت شما انتخاب شدهاند</span>
|
||
</div>
|
||
<a class="btn btn-outline" asp-page="/Preferences/Index">ویرایش علاقهمندیها</a>
|
||
</div>
|
||
}
|
||
else
|
||
{
|
||
<div class="rec-banner">
|
||
<div>
|
||
<h2 style="margin:0 0 4px;">پیشنهادها را شخصیسازی کن</h2>
|
||
<span style="opacity:.9; font-size:14px;">نقش، شهر و نوع شیفت دلخواهت را بگو تا بهترین فرصتها را برایت پیدا کنیم</span>
|
||
</div>
|
||
<a class="btn btn-outline" asp-page="/Preferences/Index">تنظیم علاقهمندیها</a>
|
||
</div>
|
||
}
|
||
<div class="grid grid-3">
|
||
@foreach (var rec in Model.Recommendations)
|
||
{
|
||
<partial name="_RecommendationCard" model="rec" />
|
||
}
|
||
</div>
|
||
</div>
|
||
</section>
|
||
}
|
||
|
||
<section class="section">
|
||
<div class="container">
|
||
<div class="section-head">
|
||
<h2>جدیدترین شیفتها</h2>
|
||
<a asp-page="/Shifts/Index">مشاهده همه ←</a>
|
||
</div>
|
||
@if (Model.LatestShifts.Count == 0)
|
||
{
|
||
<div class="empty-state">فعلاً شیفت بازی ثبت نشده است.</div>
|
||
}
|
||
else
|
||
{
|
||
<div class="grid grid-3">
|
||
@foreach (var s in Model.LatestShifts)
|
||
{
|
||
<partial name="_ShiftCard" model="s" />
|
||
}
|
||
</div>
|
||
}
|
||
</div>
|
||
</section>
|
||
|
||
@if (Model.LatestJobs.Count > 0)
|
||
{
|
||
<section class="section" style="padding-top:0;">
|
||
<div class="container">
|
||
<div class="section-head">
|
||
<h2>فرصتهای استخدامی</h2>
|
||
<a asp-page="/Jobs/Index">مشاهده همه ←</a>
|
||
</div>
|
||
<div class="grid grid-3">
|
||
@foreach (var j in Model.LatestJobs)
|
||
{
|
||
<partial name="_JobCard" model="j" />
|
||
}
|
||
</div>
|
||
</div>
|
||
</section>
|
||
}
|
||
|
||
<section class="section" style="background: var(--surface); border-top: 1px solid var(--line);">
|
||
<div class="container">
|
||
<div class="section-head"><h2>چطور کار میکند؟</h2></div>
|
||
<div class="grid grid-3">
|
||
<div class="card card-pad">
|
||
<h3 style="margin-top:0;">۱. جستجو کن</h3>
|
||
<p class="muted">بر اساس شهر، بیمارستان، تاریخ و نوع شیفت، موقعیت مناسب خودت را فیلتر کن.</p>
|
||
</div>
|
||
<div class="card card-pad">
|
||
<h3 style="margin-top:0;">۲. تقویم را ببین</h3>
|
||
<p class="muted">شیفتهای خالی هر مرکز را در یک نمای هفتگی شمسی مشاهده کن.</p>
|
||
</div>
|
||
<div class="card card-pad">
|
||
<h3 style="margin-top:0;">۳. اعلام تمایل کن</h3>
|
||
<p class="muted">روی شیفت دلخواه «اعلام تمایل» بزن تا مرکز درمانی با تو تماس بگیرد.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|