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 Hosting by ValitovGaziz team on docker compose
on docker compose
create REST API on Golang 1.25.1 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_data:/etc/letsencrypt
- certbot_www:/var/www/certbot - certbot_www:/var/www/certbot
- ./stubSite:/usr/share/nginx/stub/html - ./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 - ../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 - ../begushiybashkir/bbvue/dist:/usr/share/nginx/begushiybashkir/html
networks: networks:
- web-network - 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>
-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