Initial commit

This commit is contained in:
Developer
2025-04-21 16:03:20 +02:00
commit 2832896157
22874 changed files with 3092801 additions and 0 deletions

View File

@@ -0,0 +1,84 @@
<template>
<meta-head title="Доход"></meta-head>
<div class="xl:container xl:mx-auto px-2 md:px-3">
<div class="mt-16 shadow-classic rounded-md bg-indigo-200">
<div class="flex flex-col md:grid grid-cols-6 lg:grid-cols-5">
<settings-menu />
<div class="col-span-4">
<div class="border-b border-indigo-300">
<div class="flex justify-between px-4 2xl:px-28 my-4 lg:my-8">
<div class="flex flex-col text-white">
<span class="text-lg">Баланс:</span>
<span class="text-3xl">{{$page.props.balance}}</span>
</div>
<button @click="testPaid" type="button"
class="my-1 transition shadow-none hover:shadow-classic2 inline-flex items-center px-8 py-3 justify-center text-base rounded-md text-white bg-pink focus:outline-none">
Пополнить
</button>
<button type="button"
class="my-1 transition shadow-none hover:shadow-classic2 inline-flex items-center px-8 py-3 justify-center text-base rounded-md text-white bg-orange focus:outline-none">
Вывести
</button>
</div>
</div>
<div class="my-4 lg:my-8">
<div class="py-4 px-4 2xl:px-28 md:text-lg text-white">История операций:</div>
<div class="divide-y divide-indigo-300 ">
<div v-for="point in points" :key="point.id" class="py-4 px-4 2xl:px-28 lg:items-center flex flex-col lg:grid gap-2 lg:gap-5 grid-cols-12">
<div class="col-span-5 flex items-center">
<div class="flex-shrink-0 mr-3 lg:mr-8">
<svg :class="[point.direction == 0 ? 'text-green rotate-90' : '-rotate-90 text-red', 'transform w-8 h-8']">
<use xlink:href="#arrow-up-circle"></use>
</svg>
</div>
<div class="flex flex-col">
<p class="truncate text-base lg:text-lg font-semibold text-gray">{{point.date}}</p>
<p class="truncate lg:mt-1 text-base text-gray-light">{{point.time}}</p>
</div>
</div>
<div class="col-span-2 text-left lg:text-center text-white xl:text-xl font-semibold">
{{point.point}}
</div>
<div class="col-span-5 text-left lg:text-right text-gray-light xl:text-lg">
{{point.type}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { Inertia } from "@inertiajs/inertia";
import Layout from '@/Shared/Layout'
import SettingsMenu from '@/Shared/LayoutParts/SettingsMenu'
import MetaHead from '@/Shared/MetaHead'
export default {
layout: Layout,
components: {
MetaHead,
SettingsMenu,
},
props:{
points: Array,
},
methods: {
testPaid(){
Inertia.post(route("users.testPaid"), {
preserveScroll: true,
preserveState: true,
});
}
},
}
</script>

View File

@@ -0,0 +1,128 @@
<template>
<meta-head title="Оповещения"></meta-head>
<div class="xl:container xl:mx-auto px-2 md:px-3">
<div class="mt-16 shadow-classic rounded-md bg-indigo-200">
<div class="flex flex-col md:grid grid-cols-6 lg:grid-cols-5">
<settings-menu />
<div class="col-span-4">
<div data-simplebar class="max-h-[500px] overflow-auto my-4 lg:my-8">
<div class="divide-y divide-indigo-300">
<div class="py-4 px-4 2xl:px-28 lg:items-center flex flex-col lg:grid gap-2 lg:gap-5 grid-cols-12 md:space-x-4">
<div class="col-span-4 flex items-center">
<div class="flex-shrink-0 mr-5">
<div class="w-14 h-14 md:w-20 md:h-20 rounded-full bg-cover bg-center" style="background-image: url('/image/card1.jpg');"></div>
</div>
<div class="flex flex-col">
<p class="truncate text-base lg:text-lg font-semibold text-orange">Сергей Сергеев</p>
<p class="truncate lg:mt-1 text-base text-gray-light">10 сен в 17:20</p>
</div>
</div>
<div class="col-span-6 text-white xl:text-xl">
оценил(а) вашу фотографию
</div>
<div class="col-span-2 flex lg:justify-end">
<img class="object-cover w-20 h-20" src="/image/user_card2.png" alt="">
</div>
</div>
<div class="py-4 px-4 2xl:px-28 lg:items-center flex flex-col lg:grid gap-2 lg:gap-5 grid-cols-12 md:space-x-4">
<div class="col-span-4 flex items-center">
<div class="flex-shrink-0 mr-5">
<div class="w-14 h-14 md:w-20 md:h-20 rounded-full bg-cover bg-center" style="background-image: url('/image/card1.jpg');"></div>
</div>
<div class="flex flex-col">
<p class="truncate text-base lg:text-lg font-semibold text-orange">Сергей Сергеев</p>
<p class="truncate lg:mt-1 text-base text-gray-light">10 сен в 17:20</p>
</div>
</div>
<div class="col-span-6 flex flex-col text-white xl:text-xl">
<span>оставил(а) комментарий:</span>
<span class="truncate text-base text-gray-light">Очень красиво</span>
</div>
<div class="col-span-2 flex lg:justify-end">
<a href="#" class="text-pink text-lg">Перейти</a>
</div>
</div>
<div class="py-4 px-4 2xl:px-28 lg:items-center flex flex-col lg:grid gap-2 lg:gap-5 grid-cols-12 md:space-x-4">
<div class="col-span-4 flex items-center">
<div class="flex-shrink-0 mr-5">
<div class="w-14 h-14 md:w-20 md:h-20 rounded-full bg-cover bg-center" style="background-image: url('/image/card1.jpg');"></div>
</div>
<div class="flex flex-col">
<p class="truncate text-base lg:text-lg font-semibold text-orange">Сергей Сергеев</p>
<p class="truncate lg:mt-1 text-base text-gray-light">10 сен в 17:20</p>
</div>
</div>
<div class="col-span-6 flex flex-col text-white xl:text-xl">
<span>оставил(а) комментарий:</span>
<span class="truncate text-base text-gray-light">Очень красиво</span>
</div>
<div class="col-span-2 flex lg:justify-end">
<a href="#" class="text-pink text-lg">Перейти</a>
</div>
</div>
<div class="py-4 px-4 2xl:px-28 lg:items-center flex flex-col lg:grid gap-2 lg:gap-5 grid-cols-12 md:space-x-4">
<div class="col-span-4 flex items-center">
<div class="flex-shrink-0 mr-5">
<div class="w-14 h-14 md:w-20 md:h-20 rounded-full bg-cover bg-center" style="background-image: url('/image/card1.jpg');"></div>
</div>
<div class="flex flex-col">
<p class="truncate text-base lg:text-lg font-semibold text-orange">Сергей Сергеев</p>
<p class="truncate lg:mt-1 text-base text-gray-light">10 сен в 17:20</p>
</div>
</div>
<div class="col-span-6 flex flex-col text-white xl:text-xl">
<span>оставил(а) комментарий:</span>
<span class="truncate text-base text-gray-light">Очень красиво</span>
</div>
<div class="col-span-2 flex lg:justify-end">
<a href="#" class="text-pink text-lg">Перейти</a>
</div>
</div>
<div class="py-4 px-4 2xl:px-28 lg:items-center flex flex-col lg:grid gap-2 lg:gap-5 grid-cols-12 md:space-x-4">
<div class="col-span-4 flex items-center">
<div class="flex-shrink-0 mr-5">
<div class="w-14 h-14 md:w-20 md:h-20 rounded-full bg-cover bg-center" style="background-image: url('/image/card1.jpg');"></div>
</div>
<div class="flex flex-col">
<p class="truncate text-base lg:text-lg font-semibold text-orange">Сергей Сергеев</p>
<p class="truncate lg:mt-1 text-base text-gray-light">10 сен в 17:20</p>
</div>
</div>
<div class="col-span-6 flex flex-col text-white xl:text-xl">
<span>оставил(а) комментарий:</span>
<span class="truncate text-base text-gray-light">Очень красиво</span>
</div>
<div class="col-span-2 flex lg:justify-end">
<a href="#" class="text-pink text-lg">Перейти</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import Layout from '@/Shared/Layout'
import SettingsMenu from '@/Shared/LayoutParts/SettingsMenu'
import MetaHead from '@/Shared/MetaHead'
export default {
layout: Layout,
components: {
MetaHead,
SettingsMenu,
},
methods: {
},
}
</script>

View File

@@ -0,0 +1,195 @@
<template>
<meta-head title="Мои настройки"></meta-head>
<div class="xl:container xl:mx-auto px-2 md:px-3">
<div class="mt-16 shadow-classic rounded-md bg-indigo-200">
<div class="flex flex-col md:grid grid-cols-6 lg:grid-cols-5">
<settings-menu />
<div class="col-span-4">
<div class="m-4 lg:m-8">
<div class="flex flex-col xl:flex-row">
<div class="xl:mr-24">
<div class="flex items-center">
<div class="flex-shrink-0 mr-5">
<user-avatar :user='user' class="w-20 h-20 text-lg" />
</div>
<div class="flex flex-col">
<p class="text-base lg:text-xl font-semibold text-gray">{{user.name}}</p>
<p class="lg:mt-1 text-base text-gray-light">@{{user.username}}</p>
</div>
</div>
<input ref="fileavatar" class="hidden" accept="image/png, image/jpeg, image/jpg" type="file" @change="previewFiles">
<input ref="filebanner" class="hidden" accept="image/png, image/jpeg, image/jpg" type="file" @change="previewFilesBanner">
<div>
<div v-if="$page.props.errors.avatar" class="text-red lg:text-lg">
{{$page.props.errors.avatar}}
</div>
<button v-if="!user.photo_path" @click="changeAvatar" class="hover:underline mt-2 text-left lg:mt-5 default lg:text-lg text-orange">
Изменить фото профиля
</button>
<button v-else @click="removeAvatar" class="hover:underline mt-2 text-left lg:mt-5 default lg:text-lg text-red">
Удалить фото
</button>
</div>
</div>
<div class="mt-5 xl:mt-0">
<div class="flex items-center">
<div class="flex-shrink-0 mr-5">
<user-banner class="w-60 lg:w-96 h-20 rounded-xl bg-indigo-300" :user='user' size='banner' />
</div>
</div>
<div>
<div v-if="$page.props.errors.banner" class="text-red lg:text-lg">
{{$page.props.errors.banner}}
</div>
<button v-if="!user.banner_path" @click="changeBanner" class="hover:underline mt-2 text-left lg:mt-5 default lg:text-lg text-orange">
Изменить баннер профиля
</button>
<button v-else @click="removeBanner" class="hover:underline mt-2 text-left lg:mt-5 default lg:text-lg text-red">
Удалить баннер
</button>
</div>
</div>
</div>
<form @submit.prevent="submit" class="mt-10 grid gap-4 lg:gap-10 grid-cols-1 lg:grid-cols-2">
<div class="flex flex-col">
<text-input v-model="form.first_name" :error="form.errors.first_name" class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light" label="Имя" />
</div>
<div class="flex flex-col">
<text-input v-model="form.last_name" :error="form.errors.last_name" class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light" label="Фамилия" />
</div>
<div class="flex flex-col">
<text-input v-model="form.username" :error="form.errors.username" class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light" label="Тег" />
</div>
<div class="flex flex-col">
<text-input v-model="form.date_of_birth" :error="form.errors.date_of_birth" type="date" class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light" label="Дата рождения" />
</div>
<div class="flex flex-col">
<text-input v-model="form.email" :error="form.errors.email" type="email" class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light" label="Почта" />
</div>
<div class="flex flex-col">
<text-input v-model="form.phone" :error="form.errors.phone" type="tel" class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light" label="Телефон" />
</div>
<div>
<div class="text-gray-light text-lg mb-2">Пол</div>
<div class="flex space-x-6">
<div class="flex items-center">
<input id="user-sex-1" v-model="form.sex" value="1" type="radio" class="h-5 w-5 text-orange border-gray-light focus:ring-transparent focus:ring-offset-transparent">
<label for="user-sex-1" class="select-none ml-3 text-gray">Женский</label>
</div>
<div class="flex items-center">
<input id="user-sex-2" v-model="form.sex" value="2" type="radio" class="h-5 w-5 text-orange border-gray-light focus:ring-transparent focus:ring-offset-transparent">
<label for="user-sex-2" class="select-none ml-3 text-gray">Мужской</label>
</div>
</div>
</div>
<div class="lg:col-span-2">
<div class="flex flex-col">
<textarea-input label="О себе" v-model="form.about" :error="form.errors.about" class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md" cols="30" rows="2"></textarea-input>
</div>
</div>
<div class="flex flex-wrap -my-1 -mx-3">
<loading-button :loading="form.processing" class="mx-3 my-1 transition shadow-none hover:shadow-classic2 inline-flex items-center px-8 py-3 justify-center text-base rounded-md text-white bg-orange focus:outline-none" type="submit">Сохранить</loading-button>
<button type="button"
class="mx-3 my-1 default text-lg text-orange">
Удалить аккаунт
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import Layout from '@/Shared/Layout'
import SettingsMenu from '@/Shared/LayoutParts/SettingsMenu'
import LoadingButton from "@/Shared/Form/LoadingButton";
import UserAvatar from '@/Shared/Misc/UserAvatar'
import UserBanner from '@/Shared/Misc/UserBanner'
import MetaHead from '@/Shared/MetaHead'
import TextInput from '@/Shared/Form/TextInput'
import TextareaInput from '@/Shared/Form/TextareaInput'
import { useForm } from "@inertiajs/inertia-vue3";
import { Inertia } from "@inertiajs/inertia";
import { toRefs } from "vue";
export default {
layout: Layout,
components: {
MetaHead,
UserAvatar,
UserBanner,
TextInput,
TextareaInput,
LoadingButton,
SettingsMenu,
},
props: {
user: Object,
},
methods: {
previewFilesBanner(event){
const file = event.target.files[0];
Inertia.post(route("image.banner"), {
_method: 'put',
banner: file,
})
},
previewFiles(event){
const file = event.target.files[0];
Inertia.post(route("image.avatar"), {
_method: 'put',
avatar: file,
})
},
changeBanner(){
this.$refs.filebanner.click();
},
removeBanner(){
Inertia.post(route("image.banner.remove"), {
_method: 'delete',
})
},
changeAvatar(){
this.$refs.fileavatar.click();
},
removeAvatar(){
Inertia.post(route("image.avatar.remove"), {
_method: 'delete',
})
}
},
setup(props) {
const { user } = toRefs(props);
const form = useForm({
first_name: user.value.first_name,
last_name: user.value.last_name,
username: user.value.username,
email: user.value.email,
phone: user.value.phone,
sex: user.value.sex,
date_of_birth: user.value.date_of_birth,
about: user.value.about,
password: null,
});
const submit = () => {
form.put(route("users.update", user.value.id));
};
return { form, submit }
},
}
</script>

View File

@@ -0,0 +1,47 @@
<template>
<meta-head title="Покупки"></meta-head>
<div class="xl:container xl:mx-auto px-2 md:px-3">
<div class="mt-16 shadow-classic rounded-md bg-indigo-200">
<div class="flex flex-col md:grid grid-cols-6 lg:grid-cols-5">
<settings-menu />
<div class="col-span-4">
<div class="m-4 lg:m-8 grid grid-cols-2 sm:grid-cols-3 xl:grid-cols-4 gap-2 lg:gap-4">
<inertia-link :href="route('setting.show.purchases', feed.id)" v-for="feed in feeds" :key="feed.id" class="block contain relative overflow-hidden">
<feed-header-misc :count="1" :type="feed.type" />
<div>
<feed-preview class="w-full h-36 md:h-72 object-cover" :type="feed.type" :source='feed.preview' />
</div>
<p class="mt-2 text-gray-light text-sm">Цена: {{feed.price}}</p>
<p class="mt-2 text-gray-light text-sm">Дата покупки: {{feed.purchase_date}}</p>
</inertia-link>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import Layout from "@/Shared/Layout";
import SettingsMenu from "@/Shared/LayoutParts/SettingsMenu";
import MetaHead from "@/Shared/MetaHead";
import Feed from "@/Shared/Feed/Feed";
import FeedHeaderMisc from "@/Shared/Feed/HeaderMisc";
import FeedPreview from "@/Shared/Feed/FeedPreview";
export default {
layout: Layout,
components: {
Feed,
MetaHead,
SettingsMenu,
FeedHeaderMisc,
FeedPreview,
},
props: {
feeds: Array,
},
methods: {},
};
</script>

View File

@@ -0,0 +1,95 @@
<template>
<meta-head title="Скачать медиа контент"></meta-head>
<div class="xl:container xl:mx-auto px-2 md:px-3">
<div class="mt-16 shadow-classic rounded-md bg-indigo-200">
<div class="flex flex-col md:grid grid-cols-6 lg:grid-cols-5">
<settings-menu />
<div class="col-span-4 p-5">
<div class="mb-4 flex items-center text-gray-light text-lg font-medium">
<inertia-link :href="route('setting.purchases')" class="block hover:underline">Вернуться</inertia-link>
<span class="px-3">/</span>
<h1 class="text-gray">Скачать медиа контент</h1>
</div>
<div class="my-8 flex items-center justify-between">
<inertia-link :href="route('profile.user', seller.username)" class="flex items-center">
<div class="flex-shrink-0 block mr-2 md:mr-4">
<user-avatar :user='seller' size='small' class="w-10 h-10 md:w-16 md:h-16 text-lg" />
</div>
<div class="flex flex-col">
<span class="text-sm md:text-base block font-medium text-white">{{ seller.name }}</span>
<span class="text-xs text-gray-light">продавец</span>
</div>
</inertia-link>
<div class="text-right">
<p class="mt-2 text-gray-light text-sm">Цена: {{purchase.price}}</p>
<p class="mt-2 text-gray-light text-sm">Дата покупки: {{purchase.purchase_date}}</p>
</div>
</div>
<div v-if="purchase.title" class="text-lg text-gray font-semibold">
{{purchase.title}}
</div>
<div v-if="purchase.body" class="text-lg mt-4 text-gray-light" v-html="purchase.body"></div>
<div class="mt-4 ">
<component
:is="currentTypeNode"
:purchase="purchase"
></component>
</div>
<div class="mt-12 flex -mx-3 -my-1 flex-wrap">
<a :href="route('download.purchases', purchase.id)" class="mx-3 my-1 transition shadow-none hover:shadow-classic2 inline-flex items-center px-8 py-3 justify-center text-base rounded-md text-white bg-orange focus:outline-none">
Скачать архив
</a>
<inertia-link :href="route('setting.purchases')"
class="mx-3 my-1 transition shadow-none hover:shadow-classic inline-flex items-center px-8 py-3 justify-center text-base rounded-md text-white bg-indigo-300 focus:outline-none">
Вернуться
</inertia-link>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import Layout from "@/Shared/Layout";
import MetaHead from "@/Shared/MetaHead";
import PurchaseImages from "@/Shared/Purchase/PurchaseImages";
import PurchaseMusics from "@/Shared/Purchase/PurchaseMusics";
import SettingsMenu from "@/Shared/LayoutParts/SettingsMenu";
import UserAvatar from '@/Shared/Misc/UserAvatar'
export default {
layout: Layout,
components: {
MetaHead,
PurchaseImages,
PurchaseMusics,
SettingsMenu,
UserAvatar,
},
props: {
purchase: Object,
seller: Object,
},
computed: {
currentTypeNode() {
return "purchase-" + this.purchase.type;
},
},
};
</script>

View File

@@ -0,0 +1,78 @@
<template>
<meta-head title="Тарифы"></meta-head>
<div class="xl:container xl:mx-auto px-2 md:px-3">
<div class="mt-16 shadow-classic rounded-md bg-indigo-200">
<div class="flex flex-col md:grid grid-cols-6 lg:grid-cols-5">
<settings-menu />
<div class="col-span-4">
<div class="mx-4 2xl:mx-28 my-8">
<h2 class="text-xl lg:text-2xl xl:text-4xl text-white font-semibold">
Выберите тариф, который подходит именно вам
</h2>
<p class="mt-4 lg:text-xl xl:text-2xl text-white">
Более 1 млн фотографий, видео и музыки в постоянном доступе для вас!
</p>
<p v-if="lastSubscription" class="mt-4 xl:text-xl text-green">
Дата окончания подписки:
<span class="block md:inline-block">{{ lastSubscription.endDateTime }} ({{ lastSubscription.package.name }})</span>
</p>
<div v-for="plan in plans" :key='plan.id' :class="[lastSubscription?.package.id === plan.id ? 'border-l-4 lg:border-l-8 border-orange' : '' ,'mt-7 p-7 xl:mt-14 xl:p-14 shadow-classic rounded-md bg-indigo-100']">
<div class="flex flex-col lg:grid grid-cols-6 gap-3 items-center">
<div class="col-start-1 col-end-4 flex flex-col items-center lg:items-start text-center lg:text-left">
<span class="text-xl md:text-2xl lg:text-3xl xl:text-4xl text-white font-medium">{{plan.name}}</span>
<span class="mt-4 text-lg xl:text-2xl text-gray-light">For individuals that need advanced recording & editing.</span>
</div>
<div class="col-start-5 col-end-7 flex flex-col items-center">
<span class="text-3xl lg:text-4xl xl:text-6xl text-white font-bold">{{plan.price}}</span>
<button type="button"
@click="subsPlan(plan.id)"
:class="[lastSubscription?.package.id === plan.id ? 'bg-white border border-green text-green' : 'text-white bg-pink hover:shadow-pink' , 'mt-4 my-1 transition shadow-none inline-flex items-center px-8 py-3 justify-center text-base rounded-3xl focus:outline-none']">
<span v-if="lastSubscription?.package.id === plan.id">
активен
</span>
<span v-else>
выбрать тариф
</span>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { Inertia } from "@inertiajs/inertia";
import Layout from '@/Shared/Layout'
import SettingsMenu from '@/Shared/LayoutParts/SettingsMenu'
import MetaHead from '@/Shared/MetaHead'
export default {
layout: Layout,
components: {
MetaHead,
SettingsMenu,
},
props:{
plans: Array,
lastSubscription: Object,
},
methods: {
subsPlan(id) {
Inertia.post(route("users.plan", id), {
preserveScroll: true,
preserveState: true,
});
},
},
}
</script>