ilk commit
This commit is contained in:
19
src/module/kullanicilar/components/TabKullaniciBilgileri.vue
Normal file
19
src/module/kullanicilar/components/TabKullaniciBilgileri.vue
Normal file
@ -0,0 +1,19 @@
|
||||
<template>
|
||||
<div class="form-content">
|
||||
<div class="form-inner-content form-inner-content-left">
|
||||
<form-kullanici-bilgileri />
|
||||
</div>
|
||||
<div class="form-inner-content form-inner-content-right" v-if="usersStore.userId === globalStore.selUser">
|
||||
<form-sifre-degistir />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import FormKullaniciBilgileri from './form/FormKullaniciBilgileri.vue'
|
||||
import FormSifreDegistir from './form/FormSifreDegistir.vue'
|
||||
|
||||
import { useUsersStore } from '@/stores/usersStore'
|
||||
const usersStore = useUsersStore()
|
||||
import { useGlobalStore } from '@/stores/globalStore'
|
||||
const globalStore = useGlobalStore()
|
||||
</script>
|
||||
@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<section class="section-list form-inner-content-left">
|
||||
<form-kullanici-birimleri />
|
||||
</section>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import FormKullaniciBirimleri from './form/FormKullaniciBirimleri.vue'
|
||||
</script>
|
||||
@ -0,0 +1,9 @@
|
||||
<template>
|
||||
<section class="section-list form-inner-content-left">
|
||||
<form-kullanici-gorevleri />
|
||||
</section>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import AdminLayout from '@/layouts/AdminLayout.vue'
|
||||
import FormKullaniciGorevleri from './form/FormKullaniciGorevleri.vue'
|
||||
</script>
|
||||
38
src/module/kullanicilar/components/TabKullaniciLoglari.vue
Normal file
38
src/module/kullanicilar/components/TabKullaniciLoglari.vue
Normal file
@ -0,0 +1,38 @@
|
||||
<template>
|
||||
<section class="section-list">
|
||||
<list-table-content
|
||||
:tableHeader="tableHeader"
|
||||
icon="users"
|
||||
title="Kullanıcı Logları"
|
||||
listText="Kayıt"
|
||||
apiList="CekilisAtamaLog" />
|
||||
</section>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { useDateStore } from '@/stores/dateStore'
|
||||
const dateStore = useDateStore()
|
||||
|
||||
const tableHeader = ref<Record<string, any>[]>([
|
||||
{
|
||||
name: 'tarih',
|
||||
title: 'İşlem Tarihi',
|
||||
compute: (v: Record<string, any>): string => {
|
||||
return dateStore.dateFormat({ date: v.tarih })
|
||||
},
|
||||
sort: true,
|
||||
style:{width:'20%'}
|
||||
},
|
||||
{
|
||||
name: 'islemiYapan',
|
||||
title: 'İşlemi yapan',
|
||||
sort: true,
|
||||
style:{width:'20%'}
|
||||
},
|
||||
{
|
||||
name: 'islem',
|
||||
title: 'İşlem',
|
||||
sort: true
|
||||
}
|
||||
])
|
||||
</script>
|
||||
@ -0,0 +1,217 @@
|
||||
<template>
|
||||
<div class="form-part form-title" v-if="isNew">
|
||||
<div class="form-title-buttons">
|
||||
<div class="button-c button-save" @click="SaveData">Kaydet</div>
|
||||
<router-link class="button-c button-cancel" to="/kullanicilar/kullanici-liste">
|
||||
Vazgeç
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
<div :class="['form-part', formChanged && !isNew ? 'changed' : '']">
|
||||
<div class="form-part-title">
|
||||
<h4>Kullanıcı Bilgileri</h4>
|
||||
<div class="form-part-title-buttons"></div>
|
||||
</div>
|
||||
<div class="form-part-content" v-if="loaded">
|
||||
<form-input
|
||||
required
|
||||
half
|
||||
modelKey="gercekAdi"
|
||||
v-model="formData.gercekAdi"
|
||||
:invalidText="invalidTexts.gercekAdi"
|
||||
label="Adı"
|
||||
@keyup="OnKeyup" />
|
||||
<form-input
|
||||
required
|
||||
half
|
||||
modelKey="gercekSoyadi"
|
||||
v-model="formData.gercekSoyadi"
|
||||
:invalidText="invalidTexts.gercekSoyadi"
|
||||
label="Soyadı"
|
||||
@keyup="OnKeyup" />
|
||||
<form-select
|
||||
required
|
||||
v-model="formData.kullaniciGoreviId"
|
||||
:listData="appUserRoleStore.appUserRoles"
|
||||
listVal="id"
|
||||
listText="gorevAdi"
|
||||
modelKey="kullaniciGoreviId"
|
||||
label="Kullanıcının Görevi"
|
||||
:invalidText="invalidTexts.kullaniciGoreviId"
|
||||
@change="OnKeyup" />
|
||||
<form-select
|
||||
required
|
||||
v-model="formData.birimId"
|
||||
:listData="appUserUnitStore.appUserUnits"
|
||||
listVal="id"
|
||||
listText="birimAdi"
|
||||
modelKey="birimId"
|
||||
label="Kullanıcının Birimi"
|
||||
:invalidText="invalidTexts.birimId"
|
||||
@change="OnKeyup" />
|
||||
<form-input
|
||||
required
|
||||
half
|
||||
modelKey="telefonNumarasi"
|
||||
v-model="formData.telefonNumarasi"
|
||||
:invalidText="invalidTexts.telefonNumarasi"
|
||||
label="Telefon"
|
||||
placeholder="5554443322"
|
||||
maxlength="10"
|
||||
minlength="10"
|
||||
@keyup="OnKeyup" />
|
||||
<form-input
|
||||
required
|
||||
half
|
||||
modelKey="email"
|
||||
v-model="formData.email"
|
||||
:invalidText="invalidTexts.email"
|
||||
label="Mail"
|
||||
placeholder="eposta@alanadi.com"
|
||||
type="email" />
|
||||
<div class="form-item" v-if="formChanged && !isNew">
|
||||
<button class="button-c button-save" @click="SaveData">Kaydet</button>
|
||||
<button class="button-c button-cancel" @click="CancelSave">Vazgeç</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-part form-title" v-if="isNew">
|
||||
<div class="form-title-buttons">
|
||||
<div class="button-c button-save" @click="SaveData">Kaydet</div>
|
||||
<router-link class="button-c button-cancel" to="/kullanicilar/kullanici-liste">
|
||||
Vazgeç
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onBeforeMount } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
import { useDataStore } from '@/stores/dataStore'
|
||||
const dataStore = useDataStore()
|
||||
import { useGlobalStore } from '@/stores/globalStore'
|
||||
const globalStore = useGlobalStore()
|
||||
import { useValidationStore } from '@/stores/validationStore'
|
||||
const validationStore = useValidationStore()
|
||||
|
||||
import { useAppUserUnitStore } from '../../stores/appUserUnitStore'
|
||||
const appUserUnitStore = useAppUserUnitStore()
|
||||
import { useAppUserRoleStore } from '../../stores/appUserRoleStore'
|
||||
const appUserRoleStore = useAppUserRoleStore()
|
||||
import { useAppUserUnitService } from '../../service/appUserUnitService'
|
||||
const appUserUnitService = useAppUserUnitService()
|
||||
import { useAppUserRoleService } from '../../service/appUserRoleService'
|
||||
const appUserRoleService = useAppUserRoleService()
|
||||
import { useToastStore } from '@/components/global/toastStore'
|
||||
const toastStore = useToastStore()
|
||||
|
||||
import router from '@/router/'
|
||||
|
||||
const route = useRoute()
|
||||
const isNew = ref<boolean>(true)
|
||||
if (route.name === 'KullaniciDetay') isNew.value = false
|
||||
|
||||
const loaded = ref<boolean>(false)
|
||||
const formChanged = ref<boolean>(false)
|
||||
|
||||
const formData = reactive<Record<string, any>>({
|
||||
gercekAdi: '',
|
||||
gercekSoyadi: '',
|
||||
telefonNumarasi: '',
|
||||
email: '',
|
||||
kullaniciGoreviId: '',
|
||||
birimId: '',
|
||||
basvuruTipId: 24,
|
||||
kvkk: true,
|
||||
uyelikSozlesmesi: true
|
||||
})
|
||||
const isFormValid = ref<boolean>(true)
|
||||
const startData = reactive<Record<string, any>>(Object.assign({}, formData))
|
||||
const invalidTexts = ref<Record<string, any>>({})
|
||||
const safeData = reactive<Record<string, any>>({})
|
||||
|
||||
const OnKeyup = () => {
|
||||
formChanged.value = true
|
||||
}
|
||||
|
||||
const IsFieldEmpty = (field: string, text: string) => {
|
||||
if (validationStore.checkEmpty(formData[field]) || formData[field] === 0) {
|
||||
invalidTexts.value[field] = text
|
||||
isFormValid.value = false
|
||||
} else {
|
||||
delete invalidTexts.value[field]
|
||||
}
|
||||
}
|
||||
|
||||
const FormCheck = (): boolean => {
|
||||
IsFieldEmpty('gercekAdi', 'Kullanıcının adı boş bırakılamaz.')
|
||||
IsFieldEmpty('gercekSoyadi', 'Kullanıcının soyadı boş bırakılamaz.')
|
||||
IsFieldEmpty('telefonNumarasi', 'Kullanıcının telefonunu yazmalısınız')
|
||||
IsFieldEmpty('email', 'Kullanıcının mail adresini yazmalısınız')
|
||||
IsFieldEmpty('kullaniciGoreviId', 'Kullanıcının görevini seçmelisiniz')
|
||||
IsFieldEmpty('birimId', 'Kullanıcının birimini seçmelisiniz')
|
||||
return isFormValid.value
|
||||
}
|
||||
|
||||
const GetData = async () => {
|
||||
let data = await dataStore.dataGet('Auth/userbyuserid/' + globalStore.selUser)
|
||||
if (data !== 'errorfalse') {
|
||||
Object.assign(formData, data)
|
||||
Object.assign(safeData, data)
|
||||
setTimeout(() => {
|
||||
loaded.value = true
|
||||
}, 30)
|
||||
}
|
||||
}
|
||||
const SaveData = async () => {
|
||||
if (FormCheck()) {
|
||||
let res: any
|
||||
formData.basvuruTipId = formData.kullaniciGoreviId === 1 ? 19:24
|
||||
|
||||
if (isNew.value) {
|
||||
res = await dataStore.dataPost('Auth/register/', {
|
||||
data: formData
|
||||
})
|
||||
} else {
|
||||
const inData: Record<string, any> = {}
|
||||
const startProps = Object.keys(startData)
|
||||
Object.keys(formData).forEach((key, i) => {
|
||||
for (let i = 0; i <= startProps.length; i++) {
|
||||
if (key === startProps[i]) inData[key] = formData[key]
|
||||
}
|
||||
})
|
||||
inData.id = formData.id
|
||||
inData.basvuruTipId = inData.kullaniciGoreviId === 1 ? 19:24
|
||||
|
||||
res = await dataStore.dataPut('Auth/Guncelleme/' + formData.id, {
|
||||
data: inData
|
||||
})
|
||||
}
|
||||
|
||||
if (res !== 'errorfalse') {
|
||||
if (isNew.value) toastStore.AddToast('Kullanıcı başarıyla kaydedildi', 'success', 5000)
|
||||
else toastStore.AddToast('Başarıyla kaydedildi', 'success', 5000)
|
||||
formChanged.value = false
|
||||
loaded.value = false
|
||||
globalStore.selUser = res.user.id
|
||||
if (isNew.value) router.push('/kullanicilar/kullanici-liste')
|
||||
else GetData()
|
||||
isNew.value = false
|
||||
}
|
||||
} else {
|
||||
isFormValid.value = true
|
||||
}
|
||||
}
|
||||
const CancelSave = () => {
|
||||
Object.assign(formData, safeData)
|
||||
formChanged.value = false
|
||||
}
|
||||
|
||||
onBeforeMount(async () => {
|
||||
await appUserUnitService.GetAppUserUnitList()
|
||||
await appUserRoleService.GetAppUserRoleList()
|
||||
|
||||
if (!isNew.value) await GetData()
|
||||
else loaded.value = true
|
||||
})
|
||||
</script>
|
||||
@ -0,0 +1,55 @@
|
||||
<template>
|
||||
<list-table-content
|
||||
:tableHeader="tableHeader"
|
||||
apiList="Birim"
|
||||
icon="draws"
|
||||
listText="Birim"
|
||||
title="Kullanıcı Birimleri"
|
||||
:addAction="NewBirim"
|
||||
:rowAction="EditBirim"
|
||||
v-model:refresh="appUserUnitStore.refreshList" />
|
||||
<panel-wrapper
|
||||
v-if="appUserUnitStore.unitPanel"
|
||||
v-model="appUserUnitStore.unitPanel"
|
||||
:panel-title="appUserUnitStore.isUpdate ? 'Birim Düzenle' : 'Birim Ekle'">
|
||||
<template #panelContent>
|
||||
<panel-kullanici-birim />
|
||||
</template>
|
||||
<template #footerButton>
|
||||
<div class="button-c button-save" @click="appUserUnitService.SaveUnit">
|
||||
{{ appUserUnitStore.isUpdate ? 'Kaydet' : 'Ekle' }}
|
||||
</div>
|
||||
</template>
|
||||
</panel-wrapper>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
|
||||
import { useAppUserUnitStore } from '../../stores/appUserUnitStore'
|
||||
const appUserUnitStore = useAppUserUnitStore()
|
||||
import { useAppUserUnitService } from '../../service/appUserUnitService'
|
||||
const appUserUnitService = useAppUserUnitService()
|
||||
|
||||
import PanelWrapper from '@/components/PanelWrapper.vue'
|
||||
import PanelKullaniciBirim from '../panel/PanelKullaniciBirim.vue'
|
||||
|
||||
const tableHeader = ref<Record<string, any>[]>([
|
||||
{
|
||||
name: 'birimAdi',
|
||||
title: 'Kullanıcı Birimleri',
|
||||
sort: true
|
||||
}
|
||||
])
|
||||
|
||||
const NewBirim = () => {
|
||||
appUserUnitStore.ResetForm()
|
||||
appUserUnitStore.isUpdate = false
|
||||
appUserUnitStore.unitPanel = true
|
||||
}
|
||||
|
||||
const EditBirim = (d: Record<string, any>) => {
|
||||
Object.assign(appUserUnitStore.appUserUnitForm, d)
|
||||
appUserUnitStore.unitPanel = true
|
||||
appUserUnitStore.isUpdate = true
|
||||
}
|
||||
</script>
|
||||
@ -0,0 +1,53 @@
|
||||
<template>
|
||||
<list-table-content
|
||||
:tableHeader="tableHeader"
|
||||
apiList="KullaniciGorevi"
|
||||
icon="draws"
|
||||
listText="Görev"
|
||||
title="Kullanıcı Görevleri"
|
||||
:addAction="NewGorev"
|
||||
:rowAction="EditGorev"
|
||||
v-model:refresh="appUserRoleStore.refreshList" />
|
||||
<panel-wrapper
|
||||
v-if="appUserRoleStore.rolePanel"
|
||||
v-model="appUserRoleStore.rolePanel"
|
||||
:panel-title="appUserRoleStore.isUpdate ? 'Görevi Düzenle' : 'Görev Ekle'">
|
||||
<template #panelContent>
|
||||
<panel-kullanici-gorev />
|
||||
</template>
|
||||
<template #footerButton>
|
||||
<div class="button-c button-save" @click="appUserRoleService.SaveRole">
|
||||
{{ appUserRoleStore.isUpdate ? 'Kaydet' : 'Ekle' }}
|
||||
</div>
|
||||
</template>
|
||||
</panel-wrapper>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
|
||||
import { useAppUserRoleStore } from '../../stores/appUserRoleStore'
|
||||
const appUserRoleStore = useAppUserRoleStore()
|
||||
import { useAppUserRoleService } from '../../service/appUserRoleService'
|
||||
const appUserRoleService = useAppUserRoleService()
|
||||
|
||||
import PanelWrapper from '@/components/PanelWrapper.vue'
|
||||
import PanelKullaniciGorev from '../panel/PanelKullaniciGorev.vue'
|
||||
|
||||
const tableHeader = ref<Record<string, any>[]>([
|
||||
{
|
||||
name: 'gorevAdi',
|
||||
title: 'Kullanıcı Görevleri',
|
||||
sort: true
|
||||
}
|
||||
])
|
||||
|
||||
const NewGorev = () => {
|
||||
appUserRoleStore.ResetForm()
|
||||
appUserRoleStore.rolePanel = true
|
||||
}
|
||||
const EditGorev = (d: Record<string, any>) => {
|
||||
appUserRoleStore.isUpdate = true
|
||||
Object.assign(appUserRoleStore.appUserRoleForm, d)
|
||||
appUserRoleStore.rolePanel = true
|
||||
}
|
||||
</script>
|
||||
@ -0,0 +1,20 @@
|
||||
<template>
|
||||
<list-table-content
|
||||
:tableHeader="tableHeader"
|
||||
apiList="Auth/rolelistesi"
|
||||
:search="false"
|
||||
icon="draws"
|
||||
listText="Rol"
|
||||
title="Kullanıcı Rolleri" />
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
|
||||
const tableHeader = ref<Record<string,any>[]>([
|
||||
{
|
||||
name: 'baslik',
|
||||
title: 'Kullanıcı Rolleri',
|
||||
sort: true
|
||||
}
|
||||
])
|
||||
</script>
|
||||
121
src/module/kullanicilar/components/form/FormSifreDegistir.vue
Normal file
121
src/module/kullanicilar/components/form/FormSifreDegistir.vue
Normal file
@ -0,0 +1,121 @@
|
||||
<template>
|
||||
<div :class="['form-part', formChanged ? 'changed' : '']">
|
||||
<div class="form-part-title">
|
||||
<h4>Şifre Değiştir</h4>
|
||||
<div class="form-part-title-buttons"></div>
|
||||
</div>
|
||||
<div class="form-part-content">
|
||||
<form-input
|
||||
required
|
||||
type="password"
|
||||
modelKey="currentPassword"
|
||||
v-model="formData.currentPassword"
|
||||
:invalidText="invalidTexts.currentPassword"
|
||||
label="Kullandığınız Şifre"
|
||||
@keyup="OnKeyup" />
|
||||
<form-input
|
||||
required
|
||||
type="password"
|
||||
modelKey="newPassword"
|
||||
v-model="formData.newPassword"
|
||||
:invalidText="invalidTexts.newPassword"
|
||||
label="Yeni Şifre"
|
||||
@keyup="OnKeyup"
|
||||
description="Yeni şifreniz en az 6 karakter olmalıdır"
|
||||
minlength="6"/>
|
||||
<form-input
|
||||
required
|
||||
type="password"
|
||||
modelKey="confirmNewPassword"
|
||||
v-model="formData.confirmNewPassword"
|
||||
:invalidText="invalidTexts.confirmNewPassword"
|
||||
label="Yeni Şifre Tekrar"
|
||||
@keyup="OnKeyup" />
|
||||
<div class="form-item" v-if="formChanged">
|
||||
<button class="button-c button-save" @click="SaveData">Kaydet</button>
|
||||
<button class="button-c button-cancel" @click="CancelSave">Vazgeç</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive } from 'vue'
|
||||
import { useDataStore } from '@/stores/dataStore'
|
||||
const dataStore = useDataStore()
|
||||
import { useValidationStore } from '@/stores/validationStore'
|
||||
const validationStore = useValidationStore()
|
||||
import { useUsersStore } from '@/stores/usersStore'
|
||||
const usersStore = useUsersStore()
|
||||
|
||||
const formChanged = ref<boolean>(false)
|
||||
const formData = reactive<Record<string, any>>({
|
||||
emailAddress: usersStore.userMail,
|
||||
currentPassword: '',
|
||||
newPassword: '',
|
||||
confirmNewPassword: ''
|
||||
})
|
||||
const isFormValid = ref<boolean>(true)
|
||||
const invalidTexts = ref<Record<string, any>>({})
|
||||
const safeData = reactive<Record<string, any>>(Object.assign({}, formData))
|
||||
|
||||
const OnKeyup = () => {
|
||||
formChanged.value = true
|
||||
}
|
||||
|
||||
const IsFieldEmpty = (field: string, text: string) => {
|
||||
if (validationStore.checkEmpty(formData[field]) || formData[field] === 0) {
|
||||
invalidTexts.value[field] = text
|
||||
isFormValid.value = false
|
||||
} else {
|
||||
delete invalidTexts.value[field]
|
||||
}
|
||||
}
|
||||
|
||||
const FormCheck = (): boolean => {
|
||||
IsFieldEmpty('currentPassword', 'Lütfen şu an kullandığınız şifreyi giriniz.')
|
||||
IsFieldEmpty('newPassword', 'Yeni bir şifre belirlemelisiniz')
|
||||
IsFieldEmpty('confirmNewPassword', 'Yeni şifrenizin tekrarını girmelisiniz')
|
||||
|
||||
if (!validationStore.checkEmpty(formData.confirmNewPassword)) {
|
||||
if (formData.newPassword !== formData.confirmNewPassword) {
|
||||
invalidTexts.value.confirmNewPassword =
|
||||
'Belirlediğinzi şifreden farklı bir şifre yazdınız. Lütfen tekrar giriniz.'
|
||||
isFormValid.value = false
|
||||
} else {
|
||||
delete invalidTexts.value.confirmNewPassword
|
||||
}
|
||||
}
|
||||
|
||||
if (!validationStore.checkEmpty(formData.newPassword)) {
|
||||
if (formData.newPassword <6) {
|
||||
invalidTexts.value.confirmNewPassword =
|
||||
'Belirlediğinzi şifre en az 6 karakter olmalıdır.'
|
||||
isFormValid.value = false
|
||||
} else {
|
||||
delete invalidTexts.value.confirmNewPassword
|
||||
}
|
||||
}
|
||||
formData.emailAddress = usersStore.userMail
|
||||
return isFormValid.value
|
||||
}
|
||||
|
||||
const SaveData = async () => {
|
||||
if (FormCheck()) {
|
||||
let res: any
|
||||
res = await dataStore.dataPost('Auth/updatepassword/', {
|
||||
data: formData
|
||||
})
|
||||
|
||||
if (res !== 'errorfalse') {
|
||||
Object.assign(formData,safeData)
|
||||
formChanged.value = false
|
||||
}
|
||||
} else {
|
||||
isFormValid.value = true
|
||||
}
|
||||
}
|
||||
const CancelSave = () => {
|
||||
Object.assign(formData, safeData)
|
||||
formChanged.value = false
|
||||
}
|
||||
</script>
|
||||
@ -0,0 +1,14 @@
|
||||
<template>
|
||||
<form-input
|
||||
v-model="appUserUnitStore.appUserUnitForm.birimAdi"
|
||||
label="Birim Adı"
|
||||
modelKey="birimAdi"
|
||||
minlength="2"
|
||||
:invalidText="appUserUnitValidationStore.invalidTexts.birimAdi" />
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import {useAppUserUnitStore} from '../../stores/appUserUnitStore'
|
||||
const appUserUnitStore = useAppUserUnitStore()
|
||||
import {useAppUserUnitValidationStore} from '../../validation/appUserUnitValidationStore'
|
||||
const appUserUnitValidationStore = useAppUserUnitValidationStore()
|
||||
</script>
|
||||
@ -0,0 +1,14 @@
|
||||
<template>
|
||||
<form-input
|
||||
v-model="appUserRoleStore.appUserRoleForm.gorevAdi"
|
||||
label="Görev Adı"
|
||||
modelKey="gorevAdi"
|
||||
minlength="2"
|
||||
:invalidText="appUserRoleValidationStore.invalidTexts.gorevAdi" />
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { useAppUserRoleStore } from '../../stores/appUserRoleStore'
|
||||
const appUserRoleStore = useAppUserRoleStore()
|
||||
import { useAppUserRoleValidationStore } from '../../validation/appUserRoleValidationStore'
|
||||
const appUserRoleValidationStore = useAppUserRoleValidationStore()
|
||||
</script>
|
||||
13
src/module/kullanicilar/routes/index.ts
Normal file
13
src/module/kullanicilar/routes/index.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import kullanciYeni from './kullanici-yeni'
|
||||
import kullaniciDetay from './kullanici-detay'
|
||||
import kullaniciListesi from '@/module/kullanicilar/routes/kullanici-listesi'
|
||||
import kullaniciRolleri from '@/module/kullanicilar/routes/kullanici-rolleri'
|
||||
import kullaniciAyarlari from './kullanici-ayarlari'
|
||||
|
||||
export default [
|
||||
kullanciYeni,
|
||||
kullaniciDetay,
|
||||
kullaniciListesi,
|
||||
kullaniciRolleri,
|
||||
kullaniciAyarlari
|
||||
]
|
||||
10
src/module/kullanicilar/routes/kullanici-ayarlari.ts
Normal file
10
src/module/kullanicilar/routes/kullanici-ayarlari.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import KullaniciAyarlari from '../views/KullaniciAyarlari.vue'
|
||||
|
||||
export default {
|
||||
path: '/kullanicilar/kullanici-ayarlari',
|
||||
name: 'KullaniciAyarlari',
|
||||
component: KullaniciAyarlari,
|
||||
meta: {
|
||||
authRequired: true
|
||||
}
|
||||
}
|
||||
10
src/module/kullanicilar/routes/kullanici-detay.ts
Normal file
10
src/module/kullanicilar/routes/kullanici-detay.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import KullaniciDetay from '@/module/kullanicilar/views/KullaniciDetay.vue'
|
||||
|
||||
export default {
|
||||
path: '/kullanicilar/detay/:kullaniciId',
|
||||
name: 'KullaniciDetay',
|
||||
component: KullaniciDetay,
|
||||
meta: {
|
||||
authRequired: true
|
||||
}
|
||||
}
|
||||
10
src/module/kullanicilar/routes/kullanici-listesi.ts
Normal file
10
src/module/kullanicilar/routes/kullanici-listesi.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import KullaniciListesi from "@/module/kullanicilar/views/KullaniciListesi.vue";
|
||||
|
||||
export default {
|
||||
path:'/kullanicilar/kullanici-liste',
|
||||
name:'KullaniciListesi',
|
||||
component:KullaniciListesi,
|
||||
meta:{
|
||||
authRequired:true
|
||||
}
|
||||
}
|
||||
11
src/module/kullanicilar/routes/kullanici-rolleri.ts
Normal file
11
src/module/kullanicilar/routes/kullanici-rolleri.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import KullaniciRolleri from "@/module/kullanicilar/views/KullaniciRolleri.vue";
|
||||
|
||||
export default {
|
||||
path: '/kullanicilar/kullanici-roller',
|
||||
name: 'KullaniciRoller',
|
||||
component: KullaniciRolleri,
|
||||
meta: {
|
||||
authRequired: true
|
||||
}
|
||||
|
||||
}
|
||||
10
src/module/kullanicilar/routes/kullanici-yeni.ts
Normal file
10
src/module/kullanicilar/routes/kullanici-yeni.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import KullaniciYeni from '@/module/kullanicilar/views/KullaniciYeni.vue'
|
||||
|
||||
export default {
|
||||
path: '/kullanicilar/yeni-kullanici',
|
||||
name: 'YeniKullanici',
|
||||
component: KullaniciYeni,
|
||||
meta: {
|
||||
authRequired: true
|
||||
}
|
||||
}
|
||||
44
src/module/kullanicilar/service/appUserRoleService.ts
Normal file
44
src/module/kullanicilar/service/appUserRoleService.ts
Normal file
@ -0,0 +1,44 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { useDataStore } from '@/stores/dataStore'
|
||||
import { useAppUserRoleStore } from '../stores/appUserRoleStore'
|
||||
import { useAppUserRoleValidationStore } from '../validation/appUserRoleValidationStore'
|
||||
|
||||
export const useAppUserRoleService = defineStore('appUserRoleService', () => {
|
||||
const dataStore = useDataStore()
|
||||
const appUserRoleStore = useAppUserRoleStore()
|
||||
const appUserRoleValidationStore = useAppUserRoleValidationStore()
|
||||
|
||||
const GetAppUserRoleList = async () => {
|
||||
if (appUserRoleStore.appUserRoles.length === 0) {
|
||||
let data = await dataStore.dataGet('KullaniciGorevi')
|
||||
appUserRoleStore.appUserRoles = data
|
||||
}
|
||||
}
|
||||
|
||||
const SaveRole = async () => {
|
||||
if (appUserRoleValidationStore.FormCheck()) {
|
||||
if (appUserRoleStore.appUserRoleForm.appUsers === null)
|
||||
appUserRoleStore.appUserRoleForm.appUsers = []
|
||||
let dt: any
|
||||
if (!appUserRoleStore.isUpdate) {
|
||||
dt = await dataStore.dataPost('KullaniciGorevi', {
|
||||
data: appUserRoleStore.appUserRoleForm
|
||||
})
|
||||
} else {
|
||||
dt = await dataStore.dataPut('KullaniciGorevi/' + appUserRoleStore.appUserRoleForm.id, {
|
||||
data: appUserRoleStore.appUserRoleForm
|
||||
})
|
||||
}
|
||||
if (dt !== 'errorfalse') {
|
||||
appUserRoleStore.refreshList = true
|
||||
appUserRoleStore.isUpdate = false
|
||||
appUserRoleStore.rolePanel = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
GetAppUserRoleList,
|
||||
SaveRole
|
||||
}
|
||||
})
|
||||
11
src/module/kullanicilar/service/appUserService.ts
Normal file
11
src/module/kullanicilar/service/appUserService.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { useDataStore } from '@/stores/dataStore'
|
||||
import { useAppUserStore } from '../stores/appUserStore'
|
||||
|
||||
export const useAppUserService = defineStore('appUserService', () => {
|
||||
const dataStore = useDataStore()
|
||||
const appUserStore = useAppUserStore()
|
||||
|
||||
return {
|
||||
}
|
||||
})
|
||||
44
src/module/kullanicilar/service/appUserUnitService.ts
Normal file
44
src/module/kullanicilar/service/appUserUnitService.ts
Normal file
@ -0,0 +1,44 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { useDataStore } from '@/stores/dataStore'
|
||||
import { useAppUserUnitStore } from '../stores/appUserUnitStore'
|
||||
import { useAppUserUnitValidationStore } from '../validation/appUserUnitValidationStore'
|
||||
|
||||
export const useAppUserUnitService = defineStore('appUserUnitService', () => {
|
||||
const dataStore = useDataStore()
|
||||
const appUserUnitStore = useAppUserUnitStore()
|
||||
const appUserUnitValidationStore = useAppUserUnitValidationStore()
|
||||
|
||||
const GetAppUserUnitList = async () => {
|
||||
if (appUserUnitStore.appUserUnits.length === 0) {
|
||||
let data = await dataStore.dataGet('Birim')
|
||||
appUserUnitStore.appUserUnits = data
|
||||
}
|
||||
}
|
||||
|
||||
const SaveUnit = async () => {
|
||||
if (appUserUnitValidationStore.FormCheck()) {
|
||||
if (appUserUnitStore.appUserUnitForm.appUsers === null)
|
||||
appUserUnitStore.appUserUnitForm.appUsers = []
|
||||
let dt: any
|
||||
if (!appUserUnitStore.isUpdate) {
|
||||
dt = await dataStore.dataPost('Birim', {
|
||||
data: appUserUnitStore.appUserUnitForm
|
||||
})
|
||||
} else {
|
||||
dt = await dataStore.dataPut('Birim/' + appUserUnitStore.appUserUnitForm.id, {
|
||||
data: appUserUnitStore.appUserUnitForm
|
||||
})
|
||||
}
|
||||
if (dt !== 'errorfalse') {
|
||||
appUserUnitStore.refreshList = true
|
||||
appUserUnitStore.isUpdate = false
|
||||
appUserUnitStore.unitPanel = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
GetAppUserUnitList,
|
||||
SaveUnit
|
||||
}
|
||||
})
|
||||
30
src/module/kullanicilar/stores/appUserRoleStore.ts
Normal file
30
src/module/kullanicilar/stores/appUserRoleStore.ts
Normal file
@ -0,0 +1,30 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, reactive } from 'vue'
|
||||
|
||||
export const useAppUserRoleStore = defineStore('appUserRoleStore', () => {
|
||||
const appUserRoles = ref<Record<string, any>[]>([])
|
||||
const appUserRoleBaseForm = reactive<Record<string, any>>({
|
||||
gorevAdi: '',
|
||||
appUsers: []
|
||||
})
|
||||
const appUserRoleForm = reactive<Record<string, any>>({})
|
||||
const appUserRoleSafeForm = reactive<Record<string, any>>({})
|
||||
const isUpdate = ref<boolean>(false)
|
||||
const refreshList = ref<boolean>(false)
|
||||
const rolePanel = ref<boolean>(false)
|
||||
|
||||
const ResetForm = () => {
|
||||
Object.assign(appUserRoleForm, appUserRoleBaseForm)
|
||||
}
|
||||
|
||||
return {
|
||||
appUserRoles,
|
||||
appUserRoleBaseForm,
|
||||
appUserRoleForm,
|
||||
appUserRoleSafeForm,
|
||||
isUpdate,
|
||||
refreshList,
|
||||
rolePanel,
|
||||
ResetForm
|
||||
}
|
||||
})
|
||||
10
src/module/kullanicilar/stores/appUserStore.ts
Normal file
10
src/module/kullanicilar/stores/appUserStore.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref } from 'vue'
|
||||
|
||||
export const useAppUserStore = defineStore('appUserStore', () => {
|
||||
const selectedAppUser = ref<number>(0)
|
||||
|
||||
return {
|
||||
selectedAppUser
|
||||
}
|
||||
})
|
||||
30
src/module/kullanicilar/stores/appUserUnitStore.ts
Normal file
30
src/module/kullanicilar/stores/appUserUnitStore.ts
Normal file
@ -0,0 +1,30 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, reactive } from 'vue'
|
||||
|
||||
export const useAppUserUnitStore = defineStore('appUserUnitStore', () => {
|
||||
const appUserUnits = ref<Record<string, any>[]>([])
|
||||
const appUserUnitBaseForm = reactive<Record<string, any>>({
|
||||
birimAdi: '',
|
||||
appUsers: []
|
||||
})
|
||||
const appUserUnitForm = reactive<Record<string, any>>({})
|
||||
const appUserUnitSafeForm = reactive<Record<string, any>>({})
|
||||
const isUpdate = ref<boolean>(false)
|
||||
const refreshList = ref<boolean>(false)
|
||||
const unitPanel = ref<boolean>(false)
|
||||
|
||||
const ResetForm = () => {
|
||||
Object.assign(appUserUnitForm, appUserUnitBaseForm)
|
||||
}
|
||||
|
||||
return {
|
||||
appUserUnits,
|
||||
appUserUnitBaseForm,
|
||||
appUserUnitForm,
|
||||
appUserUnitSafeForm,
|
||||
isUpdate,
|
||||
refreshList,
|
||||
unitPanel,
|
||||
ResetForm
|
||||
}
|
||||
})
|
||||
@ -0,0 +1,35 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, reactive } from 'vue'
|
||||
import { useValidationStore } from '@/stores/validationStore'
|
||||
import { useAppUserRoleStore } from '../stores/appUserRoleStore'
|
||||
|
||||
export const useAppUserRoleValidationStore = defineStore(
|
||||
'appUserRoleValidationStore',
|
||||
() => {
|
||||
const appUserRoleStore = useAppUserRoleStore()
|
||||
const validationStore = useValidationStore()
|
||||
|
||||
const userFormChanged = ref<boolean>(false)
|
||||
const isFormValid = ref<boolean>(true)
|
||||
const invalidTexts = reactive<Record<string, any>>({})
|
||||
|
||||
const FormCheck = (): boolean => {
|
||||
Object.assign(invalidTexts, {})
|
||||
validationStore.IsFieldEmpty(
|
||||
appUserRoleStore.appUserRoleForm,
|
||||
invalidTexts,
|
||||
'gorevAdi',
|
||||
'Lütfen görev adını giriniz'
|
||||
)
|
||||
isFormValid.value = Object.keys(invalidTexts).length === 0
|
||||
return isFormValid.value
|
||||
}
|
||||
|
||||
return {
|
||||
userFormChanged,
|
||||
isFormValid,
|
||||
invalidTexts,
|
||||
FormCheck
|
||||
}
|
||||
}
|
||||
)
|
||||
@ -0,0 +1,35 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, reactive } from 'vue'
|
||||
import { useValidationStore } from '@/stores/validationStore'
|
||||
import { useAppUserUnitStore } from '../stores/appUserUnitStore'
|
||||
|
||||
export const useAppUserUnitValidationStore = defineStore(
|
||||
'appUserUnitValidationStore',
|
||||
() => {
|
||||
const appUserUnitStore = useAppUserUnitStore()
|
||||
const validationStore = useValidationStore()
|
||||
|
||||
const userFormChanged = ref<boolean>(false)
|
||||
const isFormValid = ref<boolean>(true)
|
||||
const invalidTexts = reactive<Record<string, any>>({})
|
||||
|
||||
const FormCheck = (): boolean => {
|
||||
Object.assign(invalidTexts, {})
|
||||
validationStore.IsFieldEmpty(
|
||||
appUserUnitStore.appUserUnitForm,
|
||||
invalidTexts,
|
||||
'birimAdi',
|
||||
'Lütfen birim adını giriniz.'
|
||||
)
|
||||
isFormValid.value = Object.keys(invalidTexts).length === 0
|
||||
return isFormValid.value
|
||||
}
|
||||
|
||||
return {
|
||||
userFormChanged,
|
||||
isFormValid,
|
||||
invalidTexts,
|
||||
FormCheck
|
||||
}
|
||||
}
|
||||
)
|
||||
30
src/module/kullanicilar/views/KullaniciAyarlari.vue
Normal file
30
src/module/kullanicilar/views/KullaniciAyarlari.vue
Normal file
@ -0,0 +1,30 @@
|
||||
<template>
|
||||
<AdminLayout>
|
||||
<Breadcrumb currentPageText="Kullanıcı Detay" />
|
||||
<tabs :tabList="tabList">
|
||||
<template #birimlistesi>
|
||||
<tab-kullanici-birimleri />
|
||||
</template>
|
||||
<template #gorevlistesi>
|
||||
<tab-kullanici-gorevleri />
|
||||
</template>
|
||||
</tabs>
|
||||
</AdminLayout>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
const route = useRoute()
|
||||
import { useGlobalStore } from '@/stores/globalStore'
|
||||
const globalStore = useGlobalStore()
|
||||
import AdminLayout from '@/layouts/AdminLayout.vue'
|
||||
import TabKullaniciGorevleri from '../components/TabKullaniciGorevleri.vue'
|
||||
import TabKullaniciBirimleri from '../components/TabKullaniciBirimleri.vue'
|
||||
|
||||
if (globalStore.selUser === 0) globalStore.selUser = Number(route.params.kullaniciId)
|
||||
|
||||
const tabList = ref<Record<string, any>[]>([
|
||||
{ text: 'Birim Listesi', id: 'birimlistesi' },
|
||||
{ text: 'Görev Listesi', id: 'gorevlistesi' }
|
||||
])
|
||||
</script>
|
||||
35
src/module/kullanicilar/views/KullaniciDetay.vue
Normal file
35
src/module/kullanicilar/views/KullaniciDetay.vue
Normal file
@ -0,0 +1,35 @@
|
||||
<template>
|
||||
<AdminLayout>
|
||||
<Breadcrumb currentPageText="Kullanıcı Detay" />
|
||||
<tabs :tabList="tabList">
|
||||
<template #kullanicibilgileri>
|
||||
<tab-kullanici-bilgileri />
|
||||
</template>
|
||||
<template #yetkilioldugupiyangolar>
|
||||
<tab-kullanici-yetkili-piyangolar />
|
||||
</template>
|
||||
<template #kullaniciloglari>
|
||||
<tab-kullanici-loglari />
|
||||
</template>
|
||||
</tabs>
|
||||
</AdminLayout>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
const route = useRoute()
|
||||
import { useGlobalStore } from '@/stores/globalStore'
|
||||
const globalStore = useGlobalStore()
|
||||
import AdminLayout from '@/layouts/AdminLayout.vue'
|
||||
import TabKullaniciBilgileri from '../components/TabKullaniciBilgileri.vue'
|
||||
import TabKullaniciYetkiliPiyangolar from '../components/TabKullaniciYetkiliPiyangolar.vue'
|
||||
import TabKullaniciLoglari from '../components/TabKullaniciLoglari.vue'
|
||||
|
||||
if (globalStore.selUser === 0) globalStore.selUser = Number(route.params.kullaniciId)
|
||||
|
||||
const tabList = ref<Record<string, any>[]>([
|
||||
{ text: 'Kullanıcı Bilgileri', id: 'kullanicibilgileri' },
|
||||
{ text: 'Yetkili Olduğu Piyangolar', id: 'yetkilioldugupiyangolar' },
|
||||
{ text: 'Kullanıcı Logları', id: 'kullaniciloglari' }
|
||||
])
|
||||
</script>
|
||||
100
src/module/kullanicilar/views/KullaniciListesi.vue
Normal file
100
src/module/kullanicilar/views/KullaniciListesi.vue
Normal file
@ -0,0 +1,100 @@
|
||||
<template>
|
||||
<AdminLayout>
|
||||
<Breadcrumb current-page-text="Kullanıcılar Listesi" />
|
||||
<section class="section-list">
|
||||
<list-table-content
|
||||
v-if="loaded"
|
||||
:tableHeader="tableHeader"
|
||||
:rowAction="rwAction"
|
||||
icon="customers"
|
||||
title="Kullanıcılar"
|
||||
listText="Kullanıcı"
|
||||
addRoute="yeni-kullanici"
|
||||
apiList="Auth/kullaniciList"
|
||||
apiText="Kullanıcı Listesi" />
|
||||
</section>
|
||||
</AdminLayout>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, onBeforeMount, computed } from 'vue'
|
||||
import AdminLayout from '@/layouts/AdminLayout.vue'
|
||||
import { useGlobalStore } from '@/stores/globalStore'
|
||||
const globalStore = useGlobalStore()
|
||||
import { useAppUserUnitStore } from '../stores/appUserUnitStore'
|
||||
const appUserUnitStore = useAppUserUnitStore()
|
||||
import { useAppUserRoleStore } from '../stores/appUserRoleStore'
|
||||
const appUserRoleStore = useAppUserRoleStore()
|
||||
import { useAppUserUnitService } from '../service/appUserUnitService'
|
||||
const appUserUnitService = useAppUserUnitService()
|
||||
import { useAppUserRoleService } from '../service/appUserRoleService'
|
||||
const appUserRoleService = useAppUserRoleService()
|
||||
import router from '@/router'
|
||||
|
||||
const loaded = ref<boolean>(false)
|
||||
|
||||
const userUnitList = computed<Record<string, any>[]>(() => {
|
||||
return appUserUnitStore.appUserUnits
|
||||
})
|
||||
|
||||
const userRoleList = computed<Record<string, any>[]>(() => {
|
||||
return appUserRoleStore.appUserRoles
|
||||
})
|
||||
|
||||
const tableHeader = ref<Record<string, any>[]>([
|
||||
{
|
||||
name: 'ad',
|
||||
title: 'Ad',
|
||||
sort: true
|
||||
},
|
||||
{
|
||||
name: 'soyad',
|
||||
title: 'Soyad',
|
||||
sort: true
|
||||
},
|
||||
{
|
||||
name: 'calistigiBirim',
|
||||
title: 'Çalıştığı Birim',
|
||||
sort: true,
|
||||
filter: {
|
||||
type: 'select',
|
||||
data: userUnitList,
|
||||
listVal: 'id',
|
||||
listText: 'birimAdi',
|
||||
filterId: 'birimId'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'kullaniciGorevi',
|
||||
title: 'Görevi',
|
||||
sort: true,
|
||||
filter: {
|
||||
type: 'select',
|
||||
data: userRoleList,
|
||||
listVal: 'id',
|
||||
listText: 'gorevAdi',
|
||||
filterId: 'kullaniciGorevId'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'email',
|
||||
title: 'E-posta',
|
||||
sort: true
|
||||
},
|
||||
{
|
||||
name: 'telefonNumarasi',
|
||||
title: 'Telefon',
|
||||
sort: true
|
||||
}
|
||||
])
|
||||
const rwAction = (row: any) => {
|
||||
globalStore.selUser = row.id
|
||||
router.push('detay/' + row.id)
|
||||
}
|
||||
|
||||
onBeforeMount(async () => {
|
||||
await appUserUnitService.GetAppUserUnitList()
|
||||
await appUserRoleService.GetAppUserRoleList()
|
||||
|
||||
loaded.value = true
|
||||
})
|
||||
</script>
|
||||
12
src/module/kullanicilar/views/KullaniciRolleri.vue
Normal file
12
src/module/kullanicilar/views/KullaniciRolleri.vue
Normal file
@ -0,0 +1,12 @@
|
||||
<template>
|
||||
<AdminLayout>
|
||||
<Breadcrumb current-page-text="Kullanıcı Rolleri" />
|
||||
<section class="section-list form-inner-content-left">
|
||||
<form-kullanici-rolleri />
|
||||
</section>
|
||||
</AdminLayout>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import AdminLayout from '@/layouts/AdminLayout.vue'
|
||||
import FormKullaniciRolleri from '../components/form/FormKullaniciRolleri.vue'
|
||||
</script>
|
||||
14
src/module/kullanicilar/views/KullaniciYeni.vue
Normal file
14
src/module/kullanicilar/views/KullaniciYeni.vue
Normal file
@ -0,0 +1,14 @@
|
||||
<template>
|
||||
<AdminLayout>
|
||||
<Breadcrumb current-page-text="Yeni Kullanici" />
|
||||
<div class="form-content">
|
||||
<div class="form-inner-content form-inner-content-left">
|
||||
<form-kullanici-bilgileri />
|
||||
</div>
|
||||
</div>
|
||||
</AdminLayout>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import AdminLayout from '@/layouts/AdminLayout.vue'
|
||||
import FormKullaniciBilgileri from '../components/form/FormKullaniciBilgileri.vue'
|
||||
</script>
|
||||
Reference in New Issue
Block a user