Files
hamkadr/src/JobsMedical.Web/Pages/Index.cshtml
T
soroush.asadi 2fb86a435e Initial commit — Hamkadr (همکادر) healthcare-staffing marketplace
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>
2026-06-03 01:44:24 +03:30

155 lines
6.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@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>&nbsp;</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>