diff --git a/.gitignore b/.gitignore index 4ce6fdd..c086b59 100644 --- a/.gitignore +++ b/.gitignore @@ -1,340 +1,26 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) +``` +# Compiled and build artifacts +*.sln +*.csproj +obj/ +bin/ +Debug/ +Release/ +*.exe +*.dll +*.pdb *.userprefs -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c +# Dependencies +packages/ -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj +# Logs and temp files *.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ +*.tmp +*.swp -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) +# Editors +.vs/ +.ReSharper*/ _UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- Backup*.rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# JetBrains Rider -.idea/ -*.sln.iml - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb \ No newline at end of file +``` \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..80aa275 --- /dev/null +++ b/index.html @@ -0,0 +1,61 @@ + + + + + + Запись на стрижку + + + +
+

Запись на стрижку

+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+

Цена услуги: 0 руб.

+

Коэффициент мастера: 1.0

+

Итого: 0 руб.

+
+ + +
+ + +
+ + + + \ No newline at end of file diff --git a/script.js b/script.js new file mode 100644 index 0000000..d17d470 --- /dev/null +++ b/script.js @@ -0,0 +1,129 @@ +// Данные о мастерах и услугах +const masters = [ + { id: 1, name: "Анна", coefficient: 1.2 }, + { id: 2, name: "Иван", coefficient: 1.0 }, + { id: 3, name: "Мария", coefficient: 1.5 }, + { id: 4, name: "Олег", coefficient: 1.3 } +]; + +const services = [ + { id: 1, name: "Стрижка мужская", basePrice: 500 }, + { id: 2, name: "Стрижка женская", basePrice: 700 }, + { id: 3, name: "Стрижка детская", basePrice: 400 }, + { id: 4, name: "Укладка", basePrice: 600 }, + { id: 5, name: "Окрашивание", basePrice: 1200 } +]; + +// Временные слоты (с 9:00 до 18:00 с интервалом 30 минут) +const timeSlots = []; +for (let hour = 9; hour <= 17; hour++) { + for (let minute = 0; minute < 60; minute += 30) { + const timeString = `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`; + timeSlots.push(timeString); + } +} + +// Загрузка данных при загрузке страницы +document.addEventListener('DOMContentLoaded', function() { + // Заполнение списка мастеров + const masterSelect = document.getElementById('master'); + masters.forEach(master => { + const option = document.createElement('option'); + option.value = master.id; + option.textContent = `${master.name} (коэфф. ${master.coefficient})`; + masterSelect.appendChild(option); + }); + + // Заполнение списка услуг + const serviceSelect = document.getElementById('service'); + services.forEach(service => { + const option = document.createElement('option'); + option.value = service.id; + option.textContent = `${service.name} (${service.basePrice} руб.)`; + serviceSelect.appendChild(option); + }); + + // Заполнение временных слотов + const timeSelect = document.getElementById('time'); + timeSlots.forEach(time => { + const option = document.createElement('option'); + option.value = time; + option.textContent = time; + timeSelect.appendChild(option); + }); + + // Установка минимальной даты как сегодня + const today = new Date().toISOString().split('T')[0]; + document.getElementById('date').min = today; + + // Обработчик изменения выбора мастера или услуги для пересчета цены + document.getElementById('master').addEventListener('change', calculateTotalPrice); + document.getElementById('service').addEventListener('change', calculateTotalPrice); + + // Обработчик формы + document.getElementById('bookingForm').addEventListener('submit', function(e) { + e.preventDefault(); + confirmBooking(); + }); +}); + +// Функция расчета общей стоимости +function calculateTotalPrice() { + const masterId = parseInt(document.getElementById('master').value); + const serviceId = parseInt(document.getElementById('service').value); + + if (masterId && serviceId) { + const master = masters.find(m => m.id === masterId); + const service = services.find(s => s.id === serviceId); + + if (master && service) { + const basePrice = service.basePrice; + const totalPrice = Math.round(basePrice * master.coefficient); + + document.getElementById('basePrice').textContent = basePrice; + document.getElementById('coefficient').textContent = master.coefficient.toFixed(1); + document.getElementById('totalPrice').textContent = totalPrice; + } + } else { + document.getElementById('basePrice').textContent = '0'; + document.getElementById('coefficient').textContent = '1.0'; + document.getElementById('totalPrice').textContent = '0'; + } +} + +// Функция подтверждения бронирования +function confirmBooking() { + const masterId = parseInt(document.getElementById('master').value); + const serviceId = parseInt(document.getElementById('service').value); + const date = document.getElementById('date').value; + const time = document.getElementById('time').value; + + if (!masterId || !serviceId || !date || !time) { + alert('Пожалуйста, заполните все поля'); + return; + } + + const master = masters.find(m => m.id === masterId); + const service = services.find(s => s.id === serviceId); + const totalPrice = Math.round(service.basePrice * master.coefficient); + + // Показываем информацию о бронировании + document.getElementById('confirmMaster').textContent = master.name; + document.getElementById('confirmDate').textContent = formatDate(date); + document.getElementById('confirmTime').textContent = time; + document.getElementById('confirmService').textContent = service.name; + document.getElementById('confirmPrice').textContent = totalPrice; + + // Скрываем форму и показываем подтверждение + document.querySelector('#bookingForm').classList.add('hidden'); + document.querySelector('#confirmation').classList.remove('hidden'); +} + +// Функция форматирования даты +function formatDate(dateString) { + const date = new Date(dateString); + const day = date.getDate().toString().padStart(2, '0'); + const month = (date.getMonth() + 1).toString().padStart(2, '0'); + const year = date.getFullYear(); + return `${day}.${month}.${year}`; +} \ No newline at end of file diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..f727717 --- /dev/null +++ b/styles.css @@ -0,0 +1,89 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: Arial, sans-serif; + background-color: #f5f5f5; + padding: 20px; +} + +.container { + max-width: 600px; + margin: 0 auto; + background-color: white; + padding: 30px; + border-radius: 10px; + box-shadow: 0 0 10px rgba(0,0,0,0.1); +} + +h1 { + text-align: center; + margin-bottom: 30px; + color: #333; +} + +.form-group { + margin-bottom: 20px; +} + +label { + display: block; + margin-bottom: 5px; + font-weight: bold; + color: #555; +} + +select, input { + width: 100%; + padding: 10px; + border: 1px solid #ddd; + border-radius: 5px; + font-size: 16px; +} + +.price-info { + background-color: #f9f9f9; + padding: 15px; + border-radius: 5px; + margin: 20px 0; +} + +.price-info p { + margin: 5px 0; + font-size: 16px; +} + +button { + width: 100%; + padding: 15px; + background-color: #4CAF50; + color: white; + border: none; + border-radius: 5px; + font-size: 18px; + cursor: pointer; +} + +button:hover { + background-color: #45a049; +} + +.confirmation { + margin-top: 30px; + padding: 20px; + background-color: #dff0d8; + border: 1px solid #d6e9c6; + border-radius: 5px; +} + +.confirmation h2 { + color: #3c763d; + text-align: center; +} + +.hidden { + display: none; +} \ No newline at end of file diff --git "a/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217.sln" "b/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217.sln" deleted file mode 100644 index ce2e9ba..0000000 --- "a/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217.sln" +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29613.14 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Эволюция", "Эволюция\Эволюция.csproj", "{1BF28965-06F6-44AB-94E9-DA3AE265598A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1BF28965-06F6-44AB-94E9-DA3AE265598A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1BF28965-06F6-44AB-94E9-DA3AE265598A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1BF28965-06F6-44AB-94E9-DA3AE265598A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1BF28965-06F6-44AB-94E9-DA3AE265598A}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {9FAAD6A5-F2C1-44A4-A40B-AEA4AED173F7} - EndGlobalSection -EndGlobal diff --git "a/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217/\320\230\320\263\321\200\320\260.cs" "b/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217/\320\230\320\263\321\200\320\260.cs" deleted file mode 100644 index c61ed78..0000000 --- "a/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217/\320\230\320\263\321\200\320\260.cs" +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Эволюция -{ - class Игра - { - static void Main(string[] args) - { - Console.WriteLine("Игра!"); - } - } -} diff --git "a/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217.csproj" "b/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217.csproj" deleted file mode 100644 index c73e0d1..0000000 --- "a/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217/\320\255\320\262\320\276\320\273\321\216\321\206\320\270\321\217.csproj" +++ /dev/null @@ -1,8 +0,0 @@ - - - - Exe - netcoreapp3.1 - - -