delete ald api on golang, moove file on yalarba project into one

directories
This commit is contained in:
2025-10-04 23:07:40 +05:00
parent ade401699c
commit 26f8a2d0b5
330 changed files with 4 additions and 837 deletions
-10
View File
@@ -1,10 +0,0 @@
build:
@docker compose build --no-cache
run: stop
@docker compose up -d --remove-orphans
stop:
@docker compose down
.DEFAULT_GOAL=run
+1 -7
View File
@@ -1,9 +1,3 @@
Hosting by ValitovGaziz team
on docker compose
Hosting by ValitovGaziz team on docker compose
create REST API on Golang 1.25.1
бегущий башкир
Над дизайном поработать надо, фотки у меня не подгрузилась в альбоме, отзывы от непонятных людей, надо с фото, с медалькой самим написать, скажи только куда, Ғаяз стайер это конечно круто звучит, но не каждый поймет, в общем и целом правильном направлении идем
-10
View File
@@ -1,10 +0,0 @@
services:
networks:
web-network:
driver: bridge
internal:
-37
View File
@@ -1,37 +0,0 @@
/spa/node_modules
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
coverage
*.local
/cypress/videos/
/cypress/screenshots/
.vscode/*
.vscode/extensions.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
*.tsbuildinfo
*.node_modules
*Makefile
/node_modules
/.pnp
.pnp.js
/coverage
/build
.env.local
.env.development.local
.env.test.local
.env.production.local
dist
dist-ssr
!.vscode/extensions.json
+2 -2
View File
@@ -30,9 +30,9 @@ services:
- certbot_data:/etc/letsencrypt
- certbot_www:/var/www/certbot
- ./stubSite:/usr/share/nginx/stub/html
- ../serv_spa/spa/vue/dist:/usr/share/nginx/yalarba/html
- ../yalarba/serv_spa/spa/vue/dist:/usr/share/nginx/yalarba/html
- ../valitovgaziz/html:/usr/share/nginx/valitovgaziz/html
- ../easySite/easy-site/prod:/usr/share/nginx/easysite102/html
- ../yalarba/easySite/easy-site/prod:/usr/share/nginx/easysite102/html
- ../begushiybashkir/bbvue/dist:/usr/share/nginx/begushiybashkir/html
networks:
- web-network
-6
View File
@@ -1,6 +0,0 @@
# REST API SERVER
SERVER_PORT=8000
SECRET_KEY=my_very_secret_key
-11
View File
@@ -1,11 +0,0 @@
FROM golang:1.22.5
WORKDIR /app
COPY . .
RUN go mod tidy
RUN go build -o bin/api cmd/main.go
ENTRYPOINT [ "bin/api" ]
-2
View File
@@ -1,2 +0,0 @@
t:
@go test ./... -v
Binary file not shown.
-22
View File
@@ -1,22 +0,0 @@
package main
import (
"api/src/configs"
"api/src/initializers"
"log/slog"
"os"
)
// TODO write the tests
var APIServerCnf configs.APIserver
var PSQLCnf configs.PSQLConfig
var SecretKey = []byte(os.Getenv("SECRET_KEY"))
func main() {
slog.Info("Start")
initializers.InitChiRouting()
initializers.InitDBconnection()
slog.Info("server is closed", "info", <-initializers.Done)
slog.Info("End")
}
-25
View File
@@ -1,25 +0,0 @@
module api
go 1.22.5
require github.com/go-chi/chi/v5 v5.1.0
require (
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/pgx/v5 v5.6.0 // indirect
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/stretchr/testify v1.9.0 // indirect
golang.org/x/crypto v0.25.0
golang.org/x/sync v0.7.0 // indirect
golang.org/x/text v0.16.0 // indirect
)
require (
github.com/golang-jwt/jwt/v4 v4.5.0
github.com/google/uuid v1.6.0
gorm.io/driver/postgres v1.5.9
gorm.io/gorm v1.25.11
)
-42
View File
@@ -1,42 +0,0 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw=
github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY=
github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8=
gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg=
gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
@@ -1,9 +0,0 @@
package configs
import(
)
type APIserver struct {
Server_port string
}
@@ -1,9 +0,0 @@
package configs
type PSQLConfig struct {
Db_user string
Db_password string
Db_name string
Db_port string
Host_db string
}
@@ -1,43 +0,0 @@
package initializers
import (
"api/src/storages/psql"
"fmt"
"log/slog"
"os"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
func InitDBconnection() {
slog.Info("Init DB connection")
dsn := fmt.Sprintf(
"host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Yekaterinburg",
os.Getenv("PGHOST"),
os.Getenv("PGUSER"),
os.Getenv("PGPASSWORD"),
os.Getenv("PGDATABASE"),
os.Getenv("PGPORT"),
)
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
if err != nil {
slog.Error("failed to connect database", "error", err)
os.Exit(2)
}
psql.PSQL_GORM_DB = db
sql, err := db.DB()
if err != nil {
slog.Error("failed to get database", "error", err)
os.Exit(2)
}
err = sql.Ping()
if err != nil {
slog.Error("failed to ping database", "error", err)
os.Exit(2)
}
slog.Info("connected to database")
}
@@ -1,68 +0,0 @@
package initializers
import (
"api/src/rt/admin"
"api/src/rt/auth"
"api/src/rt/prf"
"api/src/rt/srch"
"log/slog"
"os"
"time"
"net/http"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
)
var Done = make(chan bool)
func InitChiRouting() {
slog.Info("Init routing")
r := chi.NewRouter()
// middlewares
r.Use(middleware.Logger)
r.Use(middleware.Timeout(60 * time.Second))
r.Use(middleware.RequestID)
r.Use(middleware.CleanPath)
r.Use(middleware.Heartbeat("/ping"))
r.Use(middleware.NoCache)
r.Use(middleware.Recoverer)
r.NotFound(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(404)
w.Write([]byte("route does not exist"))
})
r.MethodNotAllowed(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(405)
w.Write([]byte("method is not valid"))
})
// public Routes
r.Group(func(r chi.Router) {
r.Post("/signup", auth.Register) // register
r.Post("/signin", auth.Login) // signin
r.Get("/search", srch.Search)
})
// Private Routes
// Require Authentication
r.Group(func(r chi.Router) {
r.Use(auth.AuthMiddleware)
r.Get("/profile", prf.Profile)
r.Get("/allUsersAdm", admin.GetAllUser)
r.Route("/admin", func(r chi.Router) {
r.Use(auth.AuthAdminMiddleware)
r.Get("/allUsersAdm", admin.GetAllUser) // all users get
})
})
// up server on os.Getenv("SERVER_PORT") port on gorutin
go func() {
defer close(Done)
err := http.ListenAndServe(":"+os.Getenv("SERVER_PORT"), r)
if err != nil {
slog.Error("Can't start server: ", "error", err)
}
}()
}
-11
View File
@@ -1,11 +0,0 @@
package models
import "github.com/google/uuid"
type Contact struct {
Id uuid.UUID `json:"id" gorm:"type:uuid;primaryKey;unique;AutoIncrement:false"`
Email string `json:"email" gorm:"type:string"`
Phone string `json:"phone" gorm:"type:string"`
Address string `json:"address" gorm:"type:string"`
Point Point `json:"point" gorm:"type:struct"`
}
-13
View File
@@ -1,13 +0,0 @@
package models
import "github.com/google/uuid"
type Essence struct {
Id uuid.UUID `json:"id" gorm:"type:uuid;primaryKey;unique;AutoIncrement:false"`
Name string `json:"name" gorm:"type:string"`
Type string `json:"type" gorm:"type:string"`
Contact Contact `json:"contact" gorm:"type:struct"`
ShortDescription string `json:"shortDesc" gorm:"type:string"`
Description string `json:"description" gorm:"type:string"`
AverageBill int `json:"number" gorm:"type:int"`
}
-9
View File
@@ -1,9 +0,0 @@
package models
import "github.com/google/uuid"
type Point struct {
Id uuid.UUID `json:"id" gorm:"type:uuid;primaryKey;unique;AutoIncrement:false"`
Latitude int64 `json:"latitude" gorm:"type:int64"`
Longitude int64 `json:"longitude" gorm:"type:int64"`
}
@@ -1,20 +0,0 @@
package models
import (
"github.com/golang-jwt/jwt/v4"
)
type Credentials struct {
Name string `json:"name"`
Email string `json:"email"`
Password string `json:"password"`
Phone string `json:"phone"`
Role string `json:"role"`
}
type Claims struct {
jwt.RegisteredClaims
Email string `json:"email"`
Phone string `json:"phone"`
Role string `json:"role"`
}
-12
View File
@@ -1,12 +0,0 @@
package models
import "github.com/google/uuid"
type User struct {
Id uuid.UUID `json:"id" gorm:"type:uuid;primaryKey;unique;AutoIncrement:false"`
Name string `json:"name" gorm:"type:string"`
Email string `json:"email" gorm:"type:string;index"`
Password string `json:"password" gorm:"type:string;index"`
Phone string `json:"phone" gorm:"type:string;index"`
Role string `json:"role" gorm:"type:string;index"`
}
-27
View File
@@ -1,27 +0,0 @@
package admin
import (
"api/src/models"
"api/src/storages/psql"
"encoding/json"
"net/http"
)
func GetAllUser(w http.ResponseWriter, r *http.Request) {
var users []models.User
qr := psql.PSQL_GORM_DB.Find(&users)
if qr.Error != nil {
w.WriteHeader(http.StatusNotFound)
return
}
jsData, err := json.Marshal(users)
if err != nil {
w.WriteHeader(http.StatusNotAcceptable)
return
}
w.Write([]byte(jsData))
}
-61
View File
@@ -1,61 +0,0 @@
package auth
import (
"api/src/models"
"api/src/storages/psql"
"encoding/json"
"net/http"
"os"
"time"
"github.com/golang-jwt/jwt/v4"
"golang.org/x/crypto/bcrypt"
)
var jwtKey = []byte(os.Getenv("SECRET_KEY"))
func Login(w http.ResponseWriter, r *http.Request) {
var creds models.Credentials
if err := json.NewDecoder(r.Body).Decode(&creds); err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
// check user
var user models.User
// get user by email
result := psql.PSQL_GORM_DB.Where("email = ?", creds.Email).First(&user)
if result.Error != nil || !checkPasswordHash(creds.Password, user.Password) {
w.WriteHeader(http.StatusInternalServerError)
return
}
// create jwt token
expirationtime := time.Now().Add(5 * time.Minute)
claims := &models.Claims{
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(expirationtime),
},
Email: user.Email,
Phone: user.Phone,
Role: user.Role,
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString(jwtKey)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
http.SetCookie(w, &http.Cookie{
Name: "token",
Value: tokenString,
Expires: expirationtime,
})
w.WriteHeader(http.StatusOK)
}
func checkPasswordHash(password, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
-50
View File
@@ -1,50 +0,0 @@
package auth
import (
"api/src/models"
"api/src/storages/psql"
"encoding/json"
"net/http"
"github.com/google/uuid"
"golang.org/x/crypto/bcrypt"
)
func Register(w http.ResponseWriter, r *http.Request) {
var Credentials models.Credentials
// Decoe body
if err := json.NewDecoder(r.Body).Decode(&Credentials); err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
// shep password
hashedPassword, err := hashPassword(Credentials.Password)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
id := uuid.New()
user := models.User{
Id: id,
Name: Credentials.Name,
Email: Credentials.Email,
Password: hashedPassword,
Phone: Credentials.Phone,
Role: Credentials.Role,
}
result := psql.PSQL_GORM_DB.Create(&user)
if result.Error != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusCreated)
}
func hashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err
}
@@ -1,50 +0,0 @@
package auth
import (
"api/src/models"
"context"
"net/http"
"github.com/golang-jwt/jwt/v4"
)
func AuthAdminMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
c, err := r.Cookie("token")
if err != nil {
if err == http.ErrNoCookie {
w.WriteHeader(http.StatusUnauthorized)
return
}
w.WriteHeader(http.StatusBadRequest)
return
}
tknStr := c.Value
claims := &models.Claims{}
tkn, err := jwt.ParseWithClaims(tknStr, claims, func(token *jwt.Token) (interface{}, error) {
return jwtKey, nil
})
if err != nil {
if err == jwt.ErrSignatureInvalid {
w.WriteHeader(http.StatusUnauthorized)
return
}
w.WriteHeader(http.StatusBadRequest)
return
}
if !tkn.Valid {
w.WriteHeader(http.StatusUnauthorized)
return
}
if claims.Role != "admin" {
w.WriteHeader(http.StatusNonAuthoritativeInfo)
return
}
ctx := context.WithValue(r.Context(), "email", claims.Email)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
@@ -1,45 +0,0 @@
package auth
import (
"api/src/models"
"context"
"net/http"
"github.com/golang-jwt/jwt/v4"
)
func AuthMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
c, err := r.Cookie("token")
if err != nil {
if err == http.ErrNoCookie {
w.WriteHeader(http.StatusUnauthorized)
return
}
w.WriteHeader(http.StatusBadRequest)
return
}
tknStr := c.Value
claims := &models.Claims{}
tkn, err := jwt.ParseWithClaims(tknStr, claims, func(token *jwt.Token) (interface{}, error) {
return jwtKey, nil
})
if err != nil {
if err == jwt.ErrSignatureInvalid {
w.WriteHeader(http.StatusUnauthorized)
return
}
w.WriteHeader(http.StatusBadRequest)
return
}
if !tkn.Valid {
w.WriteHeader(http.StatusUnauthorized)
return
}
ctx := context.WithValue(r.Context(), "email", claims.Email)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
@@ -1,16 +0,0 @@
package auth
import (
"testing"
"golang.org/x/crypto/bcrypt"
)
func Test_hashPass(t *testing.T) {
password := "some hard password"
hash, _ := hashPassword(password)
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
if err != nil {
t.Errorf("Falis by: %s", err)
}
}
@@ -1,9 +0,0 @@
package prf
import "net/http"
func AuthUserMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusUnauthorized)
})
}
-7
View File
@@ -1,7 +0,0 @@
package prf
import "net/http"
func Profile(w http.ResponseWriter, r *http.Request) {
}
-7
View File
@@ -1,7 +0,0 @@
package srch
import "net/http"
func Search(w http.ResponseWriter, r *http.Request) {
}
@@ -1,5 +0,0 @@
package psql
import "gorm.io/gorm"
var PSQL_GORM_DB *gorm.DB
-19
View File
@@ -1,19 +0,0 @@
services:
api:
container_name: api
build:
context: ./api
dockerfile: Dockerfile
env_file:
- .env
ports:
- "${SERVER_PORT}:${SERVER_PORT}"
volumes:
- api:/usr/src/app
depends_on:
- db
command: ./bin/api
restart: unless-stopped
volumes:
api:
-13
View File
@@ -1,13 +0,0 @@
build:
npm run build
run:
npm run dev
deploy:
npm run build
git add .
git commit -m 'build deploy'
git push
.DEFAULT_GOAL := run
-1
View File
@@ -1 +0,0 @@
import{_ as m,F as g,a as v}from"./footerB-DAi6c01a.js";import{u as p,o,c as n,b as c,t,r as b,a as l,d as k,F as u,e as f}from"./index-DccGIixi.js";const $={setup(){const{t:e}=p();return{t:e}}},x={class:"container"};function F(e,r,_,a,i,d){return o(),n("div",x,[c("h1",null,t(a.t("messages.tripFreedomAdventure.name")),1),c("p",null,t(a.t("messages.tripFreedomAdventure.text")),1)])}const w=m($,[["render",F],["__scopeId","data-v-aa005713"]]),y="/assets/photo_2025-01-25_05-57-24-BwgIchq6.jpg",A={setup(){const{t:e}=p();return{t:e}},methods:{donat(){window.open("https://www.tinkoff.ru/rm/r_fFXNVwPxmH.VMEQXkfWxO/Ho4MN83486","_blank")}},components:{FTA:w}},z={class:"about"};function C(e,r,_,a,i,d){const s=b("FTA");return o(),n("div",z,[l(s),c("p",null,t(a.t("messages.aboutL.donat-request")),1),c("button",{onClick:r[0]||(r[0]=(...h)=>d.donat&&d.donat(...h)),class:"donat-coffee"},t(a.t("messages.aboutL.donat-coffee")),1),r[1]||(r[1]=c("img",{src:y,alt:"Донат QRcod",class:"QRcod"},null,-1))])}const I=m(A,[["render",C],["__scopeId","data-v-6a219422"]]),B={setup(){const{t:e}=p();return{t:e}},data(){return{loading:!0,commits:[],error:null}},mounted(){this.fetchCommits()},methods:{async fetchCommits(){try{const e=await k.get("https://api.github.com/repos/valitovgaziz/spa_/commits",{headers:{Accept:"application/vnd.github.v3+json"}});this.commits=e.data}catch(e){this.error=e.message||"Произошла неизвестная ошибка"}finally{this.loading=!1}}}},L={key:0},V={key:1},N={key:2};function D(e,r,_,a,i,d){return i.loading?(o(),n("div",L,t(a.t("messages.commits.download")),1)):i.error?(o(),n("ul",V,t(a.t("messages.commits.errorOc"))+": "+t(i.error),1)):(o(),n("ul",N,[r[0]||(r[0]=c("h2",null,"Commits",-1)),(o(!0),n(u,null,f(i.commits,s=>(o(),n("li",{key:s.sha},[c("i",null,t(s.author.login)+" "+t(s.commit.author.date.slice(0,10))+" "+t(s.commit.message),1)]))),128))]))}const H=m(B,[["render",D],["__scopeId","data-v-ab2221db"]]),Q={setup(){const{t:e}=p();return{t:e}},name:"DevelopersList",data(){return{developers:[{nickname:"valitovgaziz",name:"Валитов Газиз",profileUrl:"https://github.com/valitovgaziz"}]}}},T={class:"developers"},j={class:"title"},q={class:"developer-list"},E=["href"];function M(e,r,_,a,i,d){return o(),n("div",T,[c("h1",j,t(a.t("messages.aboutL.developers")),1),c("ul",q,[(o(!0),n(u,null,f(i.developers,s=>(o(),n("li",{key:s.name,class:"developer-item"},[c("a",{href:s.profileUrl,target:"_blank",rel:"noopener noreferrer"},t(s.nickname)+" ("+t(s.name)+") ",9,E)]))),128))])])}const O=m(Q,[["render",M],["__scopeId","data-v-948e9ec5"]]),X={__name:"AboutView",setup(e){return(r,_)=>(o(),n(u,null,[l(g),l(I),l(O),l(H),l(v)],64))}};export{X as default};
-1
View File
@@ -1 +0,0 @@
.container[data-v-aa005713]{max-width:800px;margin:0 auto;padding:20px}h1[data-v-aa005713]{text-align:center;font-size:32px;margin-bottom:30px}p[data-v-aa005713]{line-height:1.6;font-size:18px}.additional-content[data-v-aa005713]{margin-top:40px}@media screen and (max-width: 600px){.container[data-v-aa005713]{padding:10px}h1[data-v-aa005713]{font-size:24px}p[data-v-aa005713]{font-size:16px}}.about[data-v-6a219422]{height:fit-content;display:flex;flex-direction:column;align-items:center;filter:none;padding:1rem;border-radius:1rem;margin:1rem}.donat-coffee[data-v-6a219422]{margin:1rem;background-color:#59db6d;box-shadow:1px 4px 8px #1b2d2533;border-radius:1rem}.donat-coffee[data-v-6a219422]:hover{cursor:pointer;background-color:#0a9632;color:#fff;box-shadow:1px 4px 8px #0a9632}.QRcod[data-v-6a219422]{height:200px;display:flexbox;border-radius:.5rem}ul[data-v-ab2221db]{max-width:1024px;list-style-type:none;padding:0}li[data-v-ab2221db]{margin:.5rem 0;white-space:pre-wrap;width:100%}.developers[data-v-948e9ec5]{max-width:600px;margin:0 auto;padding:20px}.title[data-v-948e9ec5]{text-align:center;font-size:24px;margin-bottom:20px}.developer-list[data-v-948e9ec5]{list-style-type:none;padding-left:0}.developer-item[data-v-948e9ec5]{margin-bottom:10px}.developer-item a[data-v-948e9ec5]{color:#007bff;text-decoration:none}.developer-item a[data-v-948e9ec5]:hover{text-decoration:underline}
-1
View File
@@ -1 +0,0 @@
import{_ as u,F as m,a as _}from"./footerB-DAi6c01a.js";import{u as p,d as v,o as n,c as w,b as r,t as l,w as g,v as b,F as h,e as R,a as c}from"./index-DccGIixi.js";const f={setup(){const{t:e}=p();return{t:e}},data(){return{reviews:[],newReview:"",showAll:!1}},computed:{displayedReviews(){return this.showAll?this.reviews:this.reviews.slice(0,5)}},mounted(){this.loadReviews()},methods:{async loadReviews(){try{const e=await v.get("https://yalarba.ru/api/reviews/reviews");this.reviews=e.data.sort((s,d)=>new Date(d.created_at)-new Date(s.created_at))}catch(e){console.error("Ошибка при загрузке отзывов:",e)}},async submitReview(){if(this.newReview.trim())try{const e=await v.post("https://yalarba.ru/api/reviews/reviews",{text:this.newReview});this.reviews.unshift(e.data),this.newReview=""}catch(e){console.error("Ошибка при отправке отзыва:",e)}},formatDate(e){return new Date(e).toLocaleString()},toggleShowAll(){this.showAll=!this.showAll}}},x={class:"reviews-container"},y={class:"add-review"},A=["placeholder"],k=["disabled"],D=["disabled"],F={class:"reviews-list"};function S(e,s,d,a,o,i){return n(),w("div",x,[r("h2",null,l(a.t("messages.reviews.h2review")),1),r("h4",null,l(a.t("messages.reviews.h4review")),1),r("div",y,[g(r("textarea",{"onUpdate:modelValue":s[0]||(s[0]=t=>o.newReview=t),placeholder:a.t("messages.reviews.textareaplaceholder"),rows:"4"},null,8,A),[[b,o.newReview]]),r("button",{onClick:s[1]||(s[1]=(...t)=>i.submitReview&&i.submitReview(...t)),disabled:!o.newReview.trim()},l(a.t("messages.reviews.button")),9,k),r("button",{onClick:s[2]||(s[2]=(...t)=>i.toggleShowAll&&i.toggleShowAll(...t)),disabled:o.reviews.length===0},l(o.showAll?a.t("messages.reviews.hide"):a.t("messages.reviews.viewAll")),9,D)]),r("div",F,[(n(!0),w(h,null,R(i.displayedReviews,t=>(n(),w("div",{key:t.id,class:"review-item"},[r("p",null,l(t.text),1),r("small",null,l(i.formatDate(t.created_at)),1)]))),128))])])}const B=u(f,[["render",S],["__scopeId","data-v-d1550644"]]),I={__name:"FeetbackView",setup(e){return(s,d)=>(n(),w(h,null,[c(m),c(B),c(_)],64))}};export{I as default};
@@ -1 +0,0 @@
.reviews-container[data-v-d1550644]{max-width:600px;margin:0 auto;padding:20px}.add-review textarea[data-v-d1550644]{width:90%;padding:10px;margin-bottom:10px;border-radius:5px;border:1px solid #ccc;background-color:var(--light-dark-background-color);box-shadow:1px 2px 3px #3d9a60}.add-review textarea[data-v-d1550644]::placeholder{color:var(--light-dark-text-color)}.add-review button[data-v-d1550644]{padding:10px 20px;background-color:var(--button-dark-background-color);color:var(--text-color);border:none;border-radius:.7rem;cursor:pointer;margin-right:10px;box-shadow:1px 2px 3px #3d9a60}.add-review button[data-v-d1550644]:disabled{background-color:var(--disabled-dark-background-color);cursor:not-allowed}.reviews-list[data-v-d1550644]{margin-top:2rem;width:90%}.review-item[data-v-d1550644]{background:var(--light-dark-background-color);padding:15px;border-radius:5px;margin-bottom:10px;box-shadow:1px 2px 3px #3d9a60}.review-item p[data-v-d1550644]{margin:0}.review-item small[data-v-d1550644]{color:var(--light-dark-text-color);font-size:.9em}
-1
View File
@@ -1 +0,0 @@
@font-face{font-family:OpenSansVariableFont;src:url(/assets/hinted-OpenSans-Regular-DZwYhniE.ttf) format("truetype-variations"),url(/assets/OpenSans-Regular-C74AleX8.woff) format("woff"),url(/assets/OpenSans-Regular-BT0WUJf-.woff2) format("woff2");font-weight:100 900;font-stretch:50% 200%}@font-face{font-family:OpenSansItalicVariableFont;src:url(/assets/hinted-OpenSans-Italic-BD2qe0ib.ttf) format("truetype-variations"),url(/assets/OpenSans-Italic-Cv5d4RQ-.woff) format("woff"),url(/assets/OpenSans-Italic-DNMplG0v.woff2) format("woff2");font-style:italic;font-weight:100 900;font-stretch:50% 200%}@font-face{font-family:RobotoVariableFont;src:url(/assets/hinted-Roboto-Regular-CFXqJ5DR.ttf) format("truetype-variations"),url(/assets/Roboto-Regular-n8vMMKqC.woff) format("woff"),url(/assets/Roboto-Regular-jtJqKL8A.woff2) format("woff2");font-weight:100 900;font-stretch:50% 200%}@font-face{font-family:RobotoItalicVarFont;src:url(/assets/hinted-Roboto-Italic-CDlkg4IH.ttf) format("truetype-variations"),url(/assets/Roboto-Italic-uZr_9iaA.woff) format("woff"),url(/assets/Roboto-Italic-DS1crIJz.woff2) format("woff2");font-style:italic;font-weight:100 900;font-stretch:50% 200%}:root{--font-primary: "OpenSansVariableFont", Arial, sans-serif;--font-secondary: "RobotoItalicVarFont", Arial, sans-serif;--weight-light: 300;--weight-normal: 400;--weight-bold: 700}body{font-family:var(--font-primary);font-weight:var(--weight-normal)}h1,h2,h3{font-family:var(--font-secondary);font-weight:var(--weight-light)}:root{--background-color: #ffffff;--text-color: #1c1d1d;--light-dark-background-color: #ffffff;--light-dark-text-color: #273f2c;--disabled-backgroud-color: rgba(23, 62, 31, .281);--button-text-color: #bac677;--disabled-dark-background-color: rgba(55, 64, 62, .2);--button-dark-background-color: #3cbf40;--light-dark-background-color: #8cd68f}[data-theme=dark]{--background-color: #282828;--text-color: #3cb756;--light-dark-background-color: #4e5e49;--light-dark-text-color: #59f37b;--disabled-dark-background-color: rgba(159, 193, 185, .2);--button-dark-background-color: #395e3a}a{color:inherit;text-decoration:none}a:visited{color:inherit}a:hover{text-decoration:none}a:active{color:inherit}html,body{background-color:var(--background-color);color:var(--text-color);margin:0;padding:0;height:fit-content;width:100%;font-family:Arial,sans-serif;transition:background-color .3s,color .3s;min-width:320px}body{display:flex;flex-direction:column;align-items:center;justify-content:center}.main{margin:2rem;min-height:90vh;min-width:320px;max-width:1024px;height:100%;width:100%;border-radius:1rem;display:flex;align-items:center;flex-direction:column;justify-content:space-between;padding:1rem 0 0}@media only screen and (max-width: 600px){.main{margin:.5rem;min-height:80vh;min-width:auto;max-width:90vw;width:90%;border-radius:.5rem}}
-1
View File
@@ -1 +0,0 @@
import{F as a,a as r}from"./footerB-DAi6c01a.js";import{S as o}from"./searchLine-3vDx-8Ye.js";import{c as t,a as e,F as s,o as c}from"./index-DccGIixi.js";const f={__name:"HomeView",setup(m){return(n,p)=>(c(),t(s,null,[e(a),e(o),e(r)],64))}};export{f as default};
-1
View File
@@ -1 +0,0 @@
import{_ as x,F as V,a as F}from"./footerB-DAi6c01a.js";import{i as d,u as S,j as B,k as I,l as L,m as s,o as c,c as m,t as n,b as e,w as h,v as g,f as A,a as p,F as M}from"./index-DccGIixi.js";const R={key:0},q={key:1,class:"logout"},C={key:2,class:"login-form"},D={class:"form-group"},E={for:"email"},N=["placeholder"],U={class:"form-group"},$={for:"password"},j=["placeholder"],G={type:"submit"},H={__name:"inout",setup(v){const l=d("");d(!0);const a=d("");d(!0);const{t:r}=S(),_=B(),i=I();let t=d(!1);L(async()=>{t=!0,i.checkAuth().catch(o=>console.error("Check auth failed",o)),t=!1});async function w(){if(t=!0,!b(l.value)||!y(a.value)){alert("Пожалуйста, заполните все поля корректно."),t=!1;return}try{await i.login({email:l.value,password:a.value}),t=!1,_.push("/")}catch(o){console.error(o),alert("Неверный email или пароль. Попробуйте снова.")}}function y(o){return!(a.length===0||a.length<6)}function b(o){return!(o.length===0||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o))}function k(){t=!0,i.logout(),t=!1,_.push("/")}return(o,u)=>s(t)?(c(),m("div",R,n(s(r)("messages.load"))+" . . .",1)):s(i).isAuthenticated?(c(),m("div",q,[e("div",null,[e("p",null,"Good by "+n(s(i).user.name)+"!",1),e("button",{onClick:k},"Logout")])])):(c(),m("div",C,[e("h1",null,n(s(r)("messages.inout.login")),1),e("form",{onSubmit:A(w,["prevent"])},[e("div",D,[e("label",E,n(s(r)("messages.inout.email"))+": ",1),h(e("input",{"onUpdate:modelValue":u[0]||(u[0]=f=>l.value=f),type:"email",id:"email",required:"",placeholder:s(r)("messages.inout.email")},null,8,N),[[g,l.value,void 0,{trim:!0}]])]),e("div",U,[e("label",$,n(s(r)("messages.inout.password"))+": ",1),h(e("input",{"onUpdate:modelValue":u[1]||(u[1]=f=>a.value=f),type:"password",id:"password",required:"",placeholder:s(r)("messages.inout.password")},null,8,j),[[g,a.value,void 0,{trim:!0}]])]),e("button",G,n(s(r)("messages.inout.login")),1)],32)]))}},P=x(H,[["__scopeId","data-v-1bd59691"]]),J={__name:"LogInView",setup(v){return(l,a)=>(c(),m(M,null,[p(V),p(P),p(F)],64))}};export{J as default};
-1
View File
@@ -1 +0,0 @@
.login-form[data-v-1bd59691]{padding:0 2rem 2rem;border:1px solid #ccc;border-radius:1rem;box-shadow:1px 2px 3px #609f7d}.form-group[data-v-1bd59691]{margin-bottom:1rem}.form-group label[data-v-1bd59691]{display:block}.form-group input[data-v-1bd59691]{padding:.7rem;border:none;border-radius:1rem;background-color:var(--light-dark-background-color);color:var(--text-color);box-shadow:1px 2px 3px #609f7d}button[data-v-1bd59691]{margin-top:.7rem;padding:.7rem 1.7rem;background-color:var(--button-dark-background-color);color:var(--text-color);border:none;border-radius:1rem;cursor:pointer;box-shadow:1px 2px 3px #609f7d}button[data-v-1bd59691]:hover{box-shadow:0 0 6px #609f7d}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-1
View File
@@ -1 +0,0 @@
import{_ as m,F as p,a as _}from"./footerB-DAi6c01a.js";import{o as r,c as l,b as e,t as n,w as v,v as y,f as P,F as u,e as d,g as h,a as c}from"./index-DccGIixi.js";const k={name:"Profile",data(){return{user:{avatar:"https://via.placeholder.com/150",name:"Иван Иванов",email:"ivan@example.com",places:[{id:1,title:"Место 1",description:"Описание места 1",editUrl:"/edit-place/1"},{id:2,title:"Место 2",description:"Описание места 2",editUrl:"/edit-place/2"}]},searchQuery:""}},computed:{filteredPlaces(){return this.searchQuery?this.user.places.filter(o=>o.title.toLowerCase().includes(this.searchQuery.toLowerCase())):this.user.places}},methods:{editUserInfo(){alert("Редактируем информацию о пользователе...")},searchPlaces(){console.log(`Поиск мест по запросу: ${this.searchQuery}`)}}},g={class:"profile"},x={class:"profile-header"},Q=["src"],U={class:"name"},w={class:"email"},b={class:"search-form"},C={key:0,class:"search-results"},F=["href"],V={key:1,class:"places-list"},B=["href"];function I(o,s,f,N,i,a){return r(),l("div",g,[e("header",x,[e("img",{src:i.user.avatar,alt:"Avatar",class:"avatar"},null,8,Q),e("h1",U,n(i.user.name),1),e("p",w,n(i.user.email),1)]),e("button",{onClick:s[0]||(s[0]=t=>a.editUserInfo()),class:"edit-profile-btn"},"Редактировать профиль"),e("form",b,[v(e("input",{type:"text",placeholder:"Поиск...","onUpdate:modelValue":s[1]||(s[1]=t=>i.searchQuery=t)},null,512),[[y,i.searchQuery,void 0,{trim:!0}]]),e("button",{onClick:s[2]||(s[2]=P(t=>a.searchPlaces(),["prevent"]))},"Найти")]),a.filteredPlaces.length>0&&i.searchQuery!==""?(r(),l("section",C,[s[3]||(s[3]=e("h2",null,"Результаты поиска",-1)),e("ul",null,[(r(!0),l(u,null,d(a.filteredPlaces,t=>(r(),l("li",{key:t.id,class:"place-item"},[e("h3",null,[e("a",{href:t.editUrl},n(t.title),9,F)]),e("p",null,n(t.description),1)]))),128))])])):h("",!0),a.filteredPlaces.length>0?(r(),l("section",V,[s[4]||(s[4]=e("h2",null,"Места",-1)),e("ul",null,[(r(!0),l(u,null,d(a.filteredPlaces,t=>(r(),l("li",{key:t.id,class:"place-item"},[e("h3",null,[e("a",{href:t.editUrl},n(t.title),9,B)]),e("p",null,n(t.description),1)]))),128))])])):h("",!0)])}const L=m(k,[["render",I],["__scopeId","data-v-f0c15aba"]]),A={__name:"ProfileView",setup(o){return(s,f)=>(r(),l(u,null,[c(p),c(L),c(_)],64))}};export{A as default};
-1
View File
@@ -1 +0,0 @@
.profile[data-v-f0c15aba]{display:flex;flex-direction:column;align-items:center}.profile-header[data-v-f0c15aba]{text-align:center;margin-bottom:20px}.avatar[data-v-f0c15aba]{width:100px;height:100px;border-radius:50%;object-fit:cover;margin-bottom:10px}.name[data-v-f0c15aba]{font-size:24px;margin-top:0}.email[data-v-f0c15aba]{color:#666;font-size:16px}.edit-profile-btn[data-v-f0c15aba]{padding:8px 12px;background-color:#4caf50;color:#fff;border:none;cursor:pointer;margin-bottom:20px}.places-list h2[data-v-f0c15aba],.search-results h2[data-v-f0c15aba]{margin-top:30px;margin-bottom:10px}.place-item[data-v-f0c15aba]{margin-bottom:15px}.search-form[data-v-f0c15aba]{max-width:300px;width:100%;margin-bottom:20px}.search-form input[data-v-f0c15aba]{width:calc(100% - 80px);padding:8px;border:1px solid #ccc;border-right:none;border-top-left-radius:5px;border-bottom-left-radius:5px}.search-form button[data-v-f0c15aba]{width:70px;padding:8px;background-color:#2196f3;color:#fff;border:none;border-top-right-radius:5px;border-bottom-right-radius:5px;cursor:pointer}@media (max-width: 600px){.profile[data-v-f0c15aba]{width:90%}.search-form[data-v-f0c15aba]{width:100%}}
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
.form-name-h3[data-v-cf5dfe80]{margin-top:0;padding-top:0;height:1.5rem}.register-form[data-v-cf5dfe80]{max-width:fit-content;padding:1rem 2rem 2rem;border-radius:1rem;box-shadow:1px 2px 5px #609f7d}.form-group[data-v-cf5dfe80]{margin-bottom:1rem}.form-group label[data-v-cf5dfe80]{display:block}.form-group input[data-v-cf5dfe80]{padding:.7rem;border-radius:1rem;border:1px solid #439c5f;background-color:var(--light-dark-background-color);color:var(--texgt-color);box-shadow:1px 2px 3px #439c5f}button[data-v-cf5dfe80]{margin-top:1rem;padding:.7rem 1.4rem;background-color:var(--button-dark-background-color);color:#fff;border:none;border-radius:1rem;cursor:pointer;box-shadow:1px 2px 3px #a1c3ab;border:1px solid rgb(124,171,156)}button[data-v-cf5dfe80]:hover{box-shadow:0 0 6px #4b675e}
@@ -1 +0,0 @@
import{_,F as m,a as f}from"./footerB-DAi6c01a.js";import{o as n,c as o,b as e,t as a,F as i,e as p,a as r,n as g,r as b,p as c}from"./index-DccGIixi.js";const k="/assets/restObject-CcS1cBol.jpg",h={name:"PlaceDetails",props:{place:Object}},x={class:"place-details"},j={class:"place-header"},v={class:"place-info"},y={class:"place-name"},B={class:"place-type"},F={class:"place-coordinates"},O={class:"place-contacts"},V={class:"place-reviews"},C={class:"place-actions"};function N(d,s,t,D,P,R){const u=b("router-link");return n(),o("div",x,[e("header",j,[s[0]||(s[0]=e("img",{src:k,alt:"Фото места",class:"place-image"},null,-1)),e("div",v,[e("h1",y,a(t.place.name),1),e("span",B,"Тип: "+a(t.place.type),1),e("span",F,"Координаты: "+a(t.place.coordinates),1)])]),e("section",O,[s[1]||(s[1]=e("h2",null,"Контакты",-1)),e("ul",null,[(n(!0),o(i,null,p(t.place.contacts,l=>(n(),o("li",{key:l.id},[e("strong",null,a(l.label)+":",1),c(" "+a(l.value),1)]))),128))])]),e("section",V,[s[4]||(s[4]=e("h2",null,"Отзывы",-1)),e("ul",null,[(n(!0),o(i,null,p(t.place.reviews,l=>(n(),o("li",{key:l.id},[e("p",null,[s[2]||(s[2]=e("strong",null,"Автор:",-1)),c(" "+a(l.author),1)]),e("p",null,[s[3]||(s[3]=e("strong",null,"Отзыв:",-1)),c(" "+a(l.text),1)])]))),128))])]),e("footer",C,[r(u,{to:`/edit/${t.place.id}`,class:"btn-edit"},{default:g(()=>s[5]||(s[5]=[c("Редактировать")])),_:1},8,["to"])])])}const w=_(h,[["render",N],["__scopeId","data-v-4f7fe9ca"]]),H={__name:"RestObjectView",setup(d){return(s,t)=>(n(),o(i,null,[r(m),r(w,{place:s.mockPlace},null,8,["place"]),r(f)],64))}};export{H as default};
@@ -1 +0,0 @@
.place-details[data-v-4f7fe9ca]{display:flex;flex-direction:column;gap:20px;padding:20px}.place-header[data-v-4f7fe9ca]{display:flex;gap:20px;align-items:center}.place-image[data-v-4f7fe9ca]{width:200px;height:200px;object-fit:cover;border-radius:10px}.place-info[data-v-4f7fe9ca]{display:flex;flex-direction:column;gap:10px}.place-name[data-v-4f7fe9ca]{font-size:24px;margin:0}.place-type[data-v-4f7fe9ca],.place-coordinates[data-v-4f7fe9ca]{font-size:18px;color:#555}.place-contacts[data-v-4f7fe9ca],.place-reviews[data-v-4f7fe9ca]{border:1px solid #ddd;padding:20px;border-radius:10px}.place-contacts li[data-v-4f7fe9ca],.place-reviews li[data-v-4f7fe9ca]{margin-bottom:10px}.btn-edit[data-v-4f7fe9ca]{padding:10px 20px;background-color:#4caf50;color:#fff;text-decoration:none;border-radius:5px;display:inline-block;text-align:center}@media (min-width: 768px){.place-details[data-v-4f7fe9ca]{gap:40px;padding:40px}.place-header[data-v-4f7fe9ca]{gap:40px}.place-image[data-v-4f7fe9ca]{width:300px;height:300px}.place-name[data-v-4f7fe9ca]{font-size:32px}.place-type[data-v-4f7fe9ca],.place-coordinates[data-v-4f7fe9ca]{font-size:22px}.place-contacts[data-v-4f7fe9ca],.place-reviews[data-v-4f7fe9ca]{padding:30px}.place-contacts li[data-v-4f7fe9ca],.place-reviews li[data-v-4f7fe9ca]{margin-bottom:15px}.btn-edit[data-v-4f7fe9ca]{padding:15px 30px}}
-1
View File
@@ -1 +0,0 @@
import{_ as o,F as n,a as c}from"./footerB-DAi6c01a.js";import{o as t,c as r,b as _,a as e,F as l}from"./index-DccGIixi.js";import{S as u}from"./searchLine-3vDx-8Ye.js";const m={},i={class:"results"};function f(a,s){return t(),r("div",i,s[0]||(s[0]=[_("h1",null,"Results",-1)]))}const p=o(m,[["render",f]]),h={__name:"ResultsView",setup(a){return(s,d)=>(t(),r(l,null,[e(n),e(u),e(p),e(c)],64))}};export{h as default};
-1
View File
@@ -1 +0,0 @@
.results{background-color:#2f4f4f}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-1
View File
@@ -1 +0,0 @@
import{_ as r,F as c,a as _}from"./footerB-DAi6c01a.js";import{o as s,c as n,b as i,a as t,F as p}from"./index-DccGIixi.js";const m={name:"Settings"},d={class:"settings"};function l(a,e,o,f,g,F){return s(),n("div",d,e[0]||(e[0]=[i("h1",null,"Settings",-1)]))}const u=r(m,[["render",l]]),B={__name:"SettingsView",setup(a){return(e,o)=>(s(),n(p,null,[t(c),t(u),t(_)],64))}};export{B as default};
@@ -1 +0,0 @@
.settings{background-color:#856565}
-1
View File
@@ -1 +0,0 @@
import{_ as c,F as g,a as _}from"./footerB-DAi6c01a.js";import{d as h,o,c as a,b as t,w as u,v as p,t as l,g as d,f as b,a as m,F as M}from"./index-DccGIixi.js";const x={data(){return{formData:{email:"",text:""},isLoading:!1,successMessage:"",errorMessage:""}},methods:{async submitForm(){this.isLoading=!0,this.successMessage="",this.errorMessage="";try{console.log(this.formData),(await h.post("https://yalarba.ru/api/support/support",this.formData)).status===201?(this.successMessage="Сообщение успешно отправлено!",this.formData.email="",this.formData.text=""):this.errorMessage="Произошла ошибка при отправке сообщения."}catch{this.errorMessage="Произошла ошибка при отправке сообщения."}finally{this.isLoading=!1}}}},D={class:"support-form"},y={class:"form-group"},v={class:"form-group"},F=["disabled"],V={key:0,class:"success-message"},w={key:1,class:"error-message"};function L(i,s,f,B,e,n){return o(),a("div",D,[s[5]||(s[5]=t("h2",null,"Техническая поддержка",-1)),t("form",{onSubmit:s[2]||(s[2]=b((...r)=>n.submitForm&&n.submitForm(...r),["prevent"]))},[t("div",y,[s[3]||(s[3]=t("label",{for:"email"},"Ваш email:",-1)),u(t("input",{type:"email",id:"email","onUpdate:modelValue":s[0]||(s[0]=r=>e.formData.email=r),required:"",placeholder:"Введите ваш email"},null,512),[[p,e.formData.email]])]),t("div",v,[s[4]||(s[4]=t("label",{for:"message"},"Сообщение:",-1)),u(t("textarea",{id:"message","onUpdate:modelValue":s[1]||(s[1]=r=>e.formData.text=r),required:"",placeholder:"Опишите вашу проблему"},null,512),[[p,e.formData.text]])]),t("button",{type:"submit",disabled:e.isLoading},l(e.isLoading?"Отправка...":"Отправить"),9,F),e.successMessage?(o(),a("p",V,l(e.successMessage),1)):d("",!0),e.errorMessage?(o(),a("p",w,l(e.errorMessage),1)):d("",!0)],32)])}const k=c(x,[["render",L],["__scopeId","data-v-ba31f826"]]),q={__name:"SupportView",setup(i){return(s,f)=>(o(),a(M,null,[m(g),m(k),m(_)],64))}};export{q as default};
-1
View File
@@ -1 +0,0 @@
.support-form[data-v-ba31f826]{max-width:700px;margin:0 auto;padding:1rem;border-radius:1rem}h2[data-v-ba31f826]{text-align:center;margin-bottom:2rem}.form-group[data-v-ba31f826]{margin-bottom:1rem}label[data-v-ba31f826]{display:block;margin-bottom:5px;font-weight:700}input[data-v-ba31f826],textarea[data-v-ba31f826]{width:100%;padding:10px;border:none;border-radius:1rem;font-size:16px;background-color:var(--light-dark-background-color);box-shadow:1px 2px 3px #00ffa2}input[data-v-ba31f826]::placeholder,textarea[data-v-ba31f826]::placeholder{color:var(--light-dark-text-color)}textarea[data-v-ba31f826]{resize:vertical;min-height:150px}button[data-v-ba31f826]{width:50%;padding:10px;color:var(--light-dark-text-color);background-color:var(--light-dark-background-color);border:none;border-radius:.5rem;font-size:16px;cursor:pointer;box-shadow:1px 2px 3px #64c799}button[data-v-ba31f826]:disabled{background-color:#ccc;cursor:not-allowed}.success-message[data-v-ba31f826]{color:green;text-align:center;margin-top:10px}.error-message[data-v-ba31f826]{color:red;text-align:center;margin-top:10px}@media (max-width: 600px){.support-form[data-v-ba31f826]{padding:15px}input[data-v-ba31f826],textarea[data-v-ba31f826],button[data-v-ba31f826]{font-size:14px}}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
.hamburger[data-v-e4c072fc]{cursor:pointer;display:flex;flex-direction:column;justify-content:space-around;height:24px;width:24px;padding:.6rem;border-radius:50%;box-shadow:1px 2px 3px #b3d2d8;background-color:var(--background-color)}.hamburger[data-v-e4c072fc]:hover{box-shadow:0 0 6px #92abb0}.line[data-v-e4c072fc]{width:100%;height:3px;background-color:var(--text-color);transition:all .3s ease}.line-1[data-v-e4c072fc]{transform:rotate(45deg) translate(5px,5px)}.line-2[data-v-e4c072fc]{opacity:0}.line-3[data-v-e4c072fc]{transform:rotate(-45deg) translate(5px,-5px)}.menuH[data-v-d5d87da0]{height:100%;position:relative;display:flex;flex-direction:column;align-items:flex-end;justify-content:center}#ul-m[data-v-d5d87da0]{position:absolute;top:3rem;right:1rem;width:25vw;min-width:300px;visibility:hidden;border-radius:1rem;box-shadow:1px 2px 3px #8de1d6;padding:.5rem;list-style-type:none;background-color:var(--background-color)}li[data-v-d5d87da0]{width:100%;padding:.3rem;text-decoration:none}li[data-v-d5d87da0] *{text-decoration:none}li[data-v-d5d87da0]:hover{cursor:pointer;background-color:#5c7171;border-radius:.3rem}.visible[data-v-d5d87da0]{visibility:visible!important}#rl-about[data-v-da10bb5b]{display:flex;flex-direction:row;align-items:center;justify-content:center;border-radius:50%;padding:1rem;height:1rem;width:1rem;box-shadow:1px 2px 3px #b3d2d8}#rl-about[data-v-da10bb5b]:hover{cursor:pointer;box-shadow:0 0 6px #b3d2d8}img[data-v-da10bb5b]{height:2rem;border-radius:50%;padding:.4rem}.language-selector[data-v-f5abd657]{position:relative;display:inline-block;background-color:var(--light-dark-background-clor);color:var(--text-color);box-shadow:1px 2px 3px #75c2d0;border-radius:50%;padding:.5rem}.language-selector[data-v-f5abd657]:hover{border-radius:50%;box-shadow:0 0 6px #75c2d0;box-shadow:0 0 7px #75c2d0;box-shadow:0 0 8px #75c2d0}.lang-icon[data-v-f5abd657]{cursor:pointer;font-size:1.5em}.dropdown-menu[data-v-f5abd657]{position:absolute;top:100%;right:0;border:1px solid #ccc;border-radius:4px;z-index:1000;box-shadow:1px 2px 3px #75c2d0;background-color:var(--background-color)}.dropdown-item[data-v-f5abd657]{padding:8px 16px;cursor:pointer;color:var(--text-color);border-radius:1rem}.dropdown-item[data-v-f5abd657]:hover{background-color:var(--light-dark-background-color)}.theme-toggle[data-v-0d1e5383]{display:flex;align-items:center;justify-content:center;box-shadow:1px 2px 3px #b3d2d8;border-radius:50%;height:2rem;width:2rem;padding:.5rem}.theme-toggle[data-v-0d1e5383]:hover{box-shadow:0 0 6px #b3d2d8}.theme-toggle__label[data-v-0d1e5383]{display:flex;align-items:center;cursor:pointer}.theme-toggle__input[data-v-0d1e5383]{display:none}.theme-toggle__slider[data-v-0d1e5383]{width:40px;height:20px;background-color:#ccc;border-radius:20px;position:relative;transition:background-color .3s}.theme-toggle__slider[data-v-0d1e5383]:before{content:"";position:absolute;width:16px;height:16px;border-radius:50%;background-color:#fff;top:2px;left:2px;transition:transform .3s}.theme-toggle__input:checked+.theme-toggle__slider[data-v-0d1e5383]{background-color:#4caf50}.theme-toggle__input:checked+.theme-toggle__slider[data-v-0d1e5383]:before{transform:translate(20px)}.header[data-v-681057a5]{max-width:1024px;width:50%;min-width:400px;height:100%;margin:0;padding:0;border-radius:1rem;display:flex;flex-direction:row;align-items:center;justify-content:space-between;height:3rem}.footer[data-v-0fdbac37]{height:3rem;width:100%;max-width:500px;display:flex;flex-direction:row;align-items:center;align-content:center;justify-content:space-between;padding:0 2rem;margin:0 0 .5rem}.navigation[data-v-0fdbac37]{height:100%;width:100%;margin:.3rem;border:1px solid;display:flex;flex-direction:column;align-items:center;justify-content:center;border:1px solid rgb(197,214,216);border-radius:1rem;box-shadow:1px 2px 3px #80c7d3}.navigation[data-v-0fdbac37]:hover{cursor:pointer;box-shadow:0 0 7px #80c7d3}img[data-v-0fdbac37]{height:100%}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-1
View File
@@ -1 +0,0 @@
@font-face{font-family:OpenSansVariableFont;src:url(/assets/hinted-OpenSans-Regular-DZwYhniE.ttf) format("truetype-variations"),url(/assets/OpenSans-Regular-C74AleX8.woff) format("woff"),url(/assets/OpenSans-Regular-BT0WUJf-.woff2) format("woff2");font-weight:100 900;font-stretch:50% 200%}@font-face{font-family:OpenSansItalicVariableFont;src:url(/assets/hinted-OpenSans-Italic-BD2qe0ib.ttf) format("truetype-variations"),url(/assets/OpenSans-Italic-Cv5d4RQ-.woff) format("woff"),url(/assets/OpenSans-Italic-DNMplG0v.woff2) format("woff2");font-style:italic;font-weight:100 900;font-stretch:50% 200%}@font-face{font-family:RobotoVariableFont;src:url(/assets/hinted-Roboto-Regular-CFXqJ5DR.ttf) format("truetype-variations"),url(/assets/Roboto-Regular-n8vMMKqC.woff) format("woff"),url(/assets/Roboto-Regular-jtJqKL8A.woff2) format("woff2");font-weight:100 900;font-stretch:50% 200%}@font-face{font-family:RobotoItalicVarFont;src:url(/assets/hinted-Roboto-Italic-CDlkg4IH.ttf) format("truetype-variations"),url(/assets/Roboto-Italic-uZr_9iaA.woff) format("woff"),url(/assets/Roboto-Italic-DS1crIJz.woff2) format("woff2");font-style:italic;font-weight:100 900;font-stretch:50% 200%}:root{--background-color: #ffffff;--text-color: #1c1d1d;--light-dark-background-color: #ffffff;--light-dark-text-color: #273f2c;--disabled-backgroud-color: rgba(23, 62, 31, .281);--button-text-color: #bac677;--disabled-dark-background-color: rgba(55, 64, 62, .2);--button-dark-background-color: #3cbf40;--light-dark-background-color: #8cd68f}[data-theme=dark]{--background-color: #282828;--text-color: #3cb756;--light-dark-background-color: #4e5e49;--light-dark-text-color: #59f37b;--disabled-dark-background-color: rgba(159, 193, 185, .2);--button-dark-background-color: #395e3a}a{color:inherit;text-decoration:none}a:visited{color:inherit}a:hover{text-decoration:none}a:active{color:inherit}html,body{background-color:var(--background-color);color:var(--text-color);margin:0;padding:0;height:fit-content;width:100%;font-family:Arial,sans-serif;transition:background-color .3s,color .3s;min-width:320px}body{display:flex;flex-direction:column;align-items:center;justify-content:center}.main{margin:2rem;min-height:90vh;min-width:320px;max-width:1024px;height:100%;width:100%;border-radius:1rem;display:flex;align-items:center;flex-direction:column;justify-content:space-between;padding:1rem 0 0}@media only screen and (max-width: 600px){.main{margin:.5rem;min-height:80vh;min-width:auto;max-width:90vw;width:90%;border-radius:.5rem}}@font-face{font-family:OpenSansVariableFont;src:url(/assets/hinted-OpenSans-Regular-DZwYhniE.ttf) format("truetype-variations"),url(/assets/OpenSans-Regular-C74AleX8.woff) format("woff"),url(/assets/OpenSans-Regular-BT0WUJf-.woff2) format("woff2");font-weight:100 900;font-stretch:50% 200%}@font-face{font-family:OpenSansItalicVariableFont;src:url(/assets/hinted-OpenSans-Italic-BD2qe0ib.ttf) format("truetype-variations"),url(/assets/OpenSans-Italic-Cv5d4RQ-.woff) format("woff"),url(/assets/OpenSans-Italic-DNMplG0v.woff2) format("woff2");font-style:italic;font-weight:100 900;font-stretch:50% 200%}@font-face{font-family:RobotoVariableFont;src:url(/assets/hinted-Roboto-Regular-CFXqJ5DR.ttf) format("truetype-variations"),url(/assets/Roboto-Regular-n8vMMKqC.woff) format("woff"),url(/assets/Roboto-Regular-jtJqKL8A.woff2) format("woff2");font-weight:100 900;font-stretch:50% 200%}@font-face{font-family:RobotoItalicVarFont;src:url(/assets/hinted-Roboto-Italic-CDlkg4IH.ttf) format("truetype-variations"),url(/assets/Roboto-Italic-uZr_9iaA.woff) format("woff"),url(/assets/Roboto-Italic-DS1crIJz.woff2) format("woff2");font-style:italic;font-weight:100 900;font-stretch:50% 200%}:root{--font-primary: "OpenSansVariableFont", Arial, sans-serif;--font-secondary: "RobotoItalicVarFont", Arial, sans-serif;--weight-light: 300;--weight-normal: 400;--weight-bold: 700}body{font-family:var(--font-primary);font-weight:var(--weight-normal)}h1,h2,h3{font-family:var(--font-secondary);font-weight:var(--weight-light)}
File diff suppressed because one or more lines are too long
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

-1
View File
@@ -1 +0,0 @@
import{u as h,o as a,c as o,b as r,F as u,e as c,t as d,g as m,w as p,v,h as f}from"./index-DccGIixi.js";import{_ as g}from"./footerB-DAi6c01a.js";const y={setup(){const{t:i}=h();return{t:i}},data(){return{searchQuery:"",isMenuVisible:!1,searchOptions:["Пляжи","Горы","Отели","Рестораны"]}},methods:{performSearch(){this.searchQuery.trim()&&this.$router.push({name:"results",query:{q:this.searchQuery}})},toggleMenu(){this.isMenuVisible=!this.isMenuVisible},selectOption(i){this.searchQuery=i,this.isMenuVisible=!1,this.performSearch()}}},M={class:"search-container"},S={class:"search-input-container"},V={key:0,class:"search-menu"},_=["onClick"],b=["placeholder"];function k(i,e,w,l,n,t){return a(),o("div",M,[r("div",S,[r("div",{class:"menu-icon",onClick:e[0]||(e[0]=(...s)=>t.toggleMenu&&t.toggleMenu(...s))},e[4]||(e[4]=[r("svg",{viewBox:"0 0 24 24",width:"24",height:"24"},[r("path",{d:"M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z",fill:"currentColor"})],-1)])),n.isMenuVisible?(a(),o("div",V,[(a(!0),o(u,null,c(n.searchOptions,s=>(a(),o("div",{class:"menu-item",key:s,onClick:C=>t.selectOption(s)},d(s),9,_))),128))])):m("",!0),p(r("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>n.searchQuery=s),onKeyup:e[2]||(e[2]=f((...s)=>t.performSearch&&t.performSearch(...s),["enter"])),class:"search-input",placeholder:l.t("messages.searchPlaceholder")},null,40,b),[[v,n.searchQuery]]),r("button",{onClick:e[3]||(e[3]=(...s)=>t.performSearch&&t.performSearch(...s)),class:"search-button"},e[5]||(e[5]=[r("svg",{viewBox:"0 0 24 24",width:"24",height:"24"},[r("path",{d:"M10 18a8 8 0 1 1 0-16 8 8 0 0 1 0 16zm8-8a7.95 7.95 0 0 1-1.757 4.95l4.95 4.95-1.414 1.414-4.95-4.95A7.95 7.95 0 0 1 10 18z",fill:"currentColor"})],-1)]))])])}const z=g(y,[["render",k],["__scopeId","data-v-a8d17828"]]);export{z as S};
-1
View File
@@ -1 +0,0 @@
.search-container[data-v-a8d17828]{position:relative;width:100%;max-width:600px;margin:auto;border-radius:25px;background-color:var(--light-dark-background-color);color:var(--light-dark-text-color);box-shadow:0 2px 5px #0003}.search-input-container[data-v-a8d17828]{display:flex;align-items:center;padding:.5rem}.menu-icon[data-v-a8d17828]{cursor:pointer;margin-right:10px;height:100%}.search-input[data-v-a8d17828]{flex-grow:1;border:none;outline:none;border-radius:2rem;background-color:var(--light-dark-background-color);color:var(--light-dark-text-color)}.search-input[data-v-a8d17828]::placeholder{color:var(--light-dark-text-color)}.search-button[data-v-a8d17828]{background:none;border:none;cursor:pointer}.search-menu[data-v-a8d17828]{position:absolute;top:60px;left:0;right:0;background:none;border-radius:10px;box-shadow:0 4px 6px #0000001a;z-index:1000}.menu-item[data-v-a8d17828]{cursor:pointer}.menu-item[data-v-a8d17828]:hover{background-color:none}
-1
View File
@@ -1 +0,0 @@
google-site-verification: googleef5054d37f782f91.html
-14
View File
@@ -1,14 +0,0 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/assets/YalArbaLogo300-BGWtRO6S.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>YalArba</title>
<script type="module" crossorigin src="/assets/index-DccGIixi.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-B44ZMC8Y.css">
</head>
<body>
<div id="app"></div>
</body>
</html>
-8
View File
@@ -1,8 +0,0 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Verification: 64282c87685452a7
</body>
</html>

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Some files were not shown because too many files have changed in this diff Show More