feat: 新增数据请求接口
This commit is contained in:
parent
0cb3cb3eae
commit
d9ee41c892
@ -9,7 +9,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"animate.css": "^4.1.1",
|
"animate.css": "^4.1.1",
|
||||||
"axios": "^0.23.0",
|
"axios": "0.23.0",
|
||||||
"crypto-ts": "^1.0.2",
|
"crypto-ts": "^1.0.2",
|
||||||
"highlight.js": "^11.5.0",
|
"highlight.js": "^11.5.0",
|
||||||
"naive-ui": "^2.25.2",
|
"naive-ui": "^2.25.2",
|
||||||
|
@ -1,35 +1,40 @@
|
|||||||
import axiosInstance from './axios'
|
import axiosInstance from './axios'
|
||||||
import { RequestEnum, ContentTypeEnum } from '@/enums/httpEnum'
|
import { RequestHttpEnum, ContentTypeEnum } from '@/enums/httpEnum'
|
||||||
|
|
||||||
export const get = (url: string, params: object) => {
|
export const get = (url: string, params: object) => {
|
||||||
return axiosInstance({
|
return axiosInstance({
|
||||||
url: url,
|
url: url,
|
||||||
method: RequestEnum.GET,
|
method: RequestHttpEnum.GET,
|
||||||
params,
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const post = (url: string, params: object, headersType: string) => {
|
export const post = (url: string, params: object, headersType?: string) => {
|
||||||
return axiosInstance({
|
return axiosInstance({
|
||||||
url: url,
|
url: url,
|
||||||
method: RequestEnum.POST,
|
method: RequestHttpEnum.POST,
|
||||||
data: params,
|
data: params,
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': headersType || ContentTypeEnum.JSON,
|
'Content-Type': headersType || ContentTypeEnum.JSON
|
||||||
},
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const del = (url: string, params: object) => {
|
export const del = (url: string, params: object) => {
|
||||||
return axiosInstance({
|
return axiosInstance({
|
||||||
url: url,
|
url: url,
|
||||||
method: RequestEnum.DELETE,
|
method: RequestHttpEnum.DELETE,
|
||||||
params,
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
// 获取请求函数,默认get
|
||||||
get,
|
export const http = (type?: RequestHttpEnum) => {
|
||||||
post,
|
return type === RequestHttpEnum.GET
|
||||||
del,
|
? get
|
||||||
|
: type === RequestHttpEnum.POST
|
||||||
|
? post
|
||||||
|
: type === RequestHttpEnum.DELETE
|
||||||
|
? del
|
||||||
|
: get
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ Mock.setup({
|
|||||||
|
|
||||||
// 单个X数据
|
// 单个X数据
|
||||||
const featchMockData = '/api/mockData'
|
const featchMockData = '/api/mockData'
|
||||||
Mock.mock(/\/api\/test(|\?\S*)$/, 'get', test.featchMockData)
|
Mock.mock(/\/api\/mockData(|\?\S*)$/, 'get', test.featchMockData)
|
||||||
|
|
||||||
export {
|
export {
|
||||||
featchMockData
|
featchMockData
|
@ -1,9 +1,18 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="go-config-item-box">
|
<div class="go-config-item-box">
|
||||||
<n-text class="item-left" depth="2">{{ name }}</n-text>
|
<n-text class="item-left" depth="2">
|
||||||
<div class="item-right" justify="space-between" :style="{
|
{{ name }}
|
||||||
|
<n-space :size="5">
|
||||||
|
<slot name="name"></slot>
|
||||||
|
</n-space>
|
||||||
|
</n-text>
|
||||||
|
<div
|
||||||
|
class="item-right"
|
||||||
|
justify="space-between"
|
||||||
|
:style="{
|
||||||
gridTemplateColumns: alone ? '1fr' : '1fr 1fr'
|
gridTemplateColumns: alone ? '1fr' : '1fr 1fr'
|
||||||
}">
|
}"
|
||||||
|
>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -13,7 +22,7 @@
|
|||||||
defineProps({
|
defineProps({
|
||||||
name: {
|
name: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: false
|
||||||
},
|
},
|
||||||
alone: {
|
alone: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
|
@ -13,7 +13,7 @@ export enum ResultEnum {
|
|||||||
/**
|
/**
|
||||||
* @description: 请求方法
|
* @description: 请求方法
|
||||||
*/
|
*/
|
||||||
export enum RequestEnum {
|
export enum RequestHttpEnum {
|
||||||
GET = 'get',
|
GET = 'get',
|
||||||
POST = 'post',
|
POST = 'post',
|
||||||
PATCH = 'patch',
|
PATCH = 'patch',
|
||||||
|
4
src/packages/index.d.ts
vendored
4
src/packages/index.d.ts
vendored
@ -15,7 +15,9 @@ export type ConfigType = {
|
|||||||
|
|
||||||
// 数据请求
|
// 数据请求
|
||||||
interface requestConfig {
|
interface requestConfig {
|
||||||
data: RequestConfigType
|
data: RequestConfigType,
|
||||||
|
// 暂时约定为数据存储区域(未使用)
|
||||||
|
requestData: any
|
||||||
}
|
}
|
||||||
|
|
||||||
// Echarts 数据类型
|
// Echarts 数据类型
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
import { getUUID } from '@/utils'
|
import { getUUID } from '@/utils'
|
||||||
import { PublicConfigType } from '@/packages/index.d'
|
import { PublicConfigType } from '@/packages/index.d'
|
||||||
import { RequestDataTypeEnum, RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
|
import { RequestDataTypeEnum, RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
|
import { RequestHttpEnum } from '@/enums/httpEnum'
|
||||||
|
|
||||||
const requestConfig: RequestConfigType = {
|
const requestConfig: RequestConfigType = {
|
||||||
requestDataType: RequestDataTypeEnum.STATIC,
|
requestDataType: RequestDataTypeEnum.STATIC,
|
||||||
|
requestHttpType: RequestHttpEnum.GET
|
||||||
}
|
}
|
||||||
|
|
||||||
export class publicConfig implements PublicConfigType {
|
export class publicConfig implements PublicConfigType {
|
||||||
@ -18,11 +20,9 @@ export class publicConfig implements PublicConfigType {
|
|||||||
animations: []
|
animations: []
|
||||||
}
|
}
|
||||||
// 数据
|
// 数据
|
||||||
public data = {
|
public data = { ...requestConfig }
|
||||||
requestDataType: RequestDataTypeEnum.STATIC
|
|
||||||
}
|
|
||||||
// 数据获取
|
// 数据获取
|
||||||
public requestData = { ...requestConfig }
|
public requestData = []
|
||||||
// 设置坐标
|
// 设置坐标
|
||||||
public setPosition(x: number, y: number): void {
|
public setPosition(x: number, y: number): void {
|
||||||
this.attr.x = x
|
this.attr.x = x
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { CreateComponentType } from '@/packages/index.d'
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
import { HistoryActionTypeEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
|
import { HistoryActionTypeEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
|
||||||
|
import { RequestHttpEnum } from '@/enums/httpEnum'
|
||||||
import type {
|
import type {
|
||||||
ChartColorsNameType,
|
ChartColorsNameType,
|
||||||
GlobalThemeJsonType,
|
GlobalThemeJsonType,
|
||||||
@ -133,6 +134,8 @@ export enum RequestDataTypeEnum {
|
|||||||
export type RequestConfigType = {
|
export type RequestConfigType = {
|
||||||
// 获取数据的方式
|
// 获取数据的方式
|
||||||
requestDataType: RequestDataTypeEnum
|
requestDataType: RequestDataTypeEnum
|
||||||
|
// 请求方式 get/post/del/put/patch
|
||||||
|
requestHttpType: RequestHttpEnum
|
||||||
// 请求源地址
|
// 请求源地址
|
||||||
requestUrl?: string
|
requestUrl?: string
|
||||||
requestInterval?: number
|
requestInterval?: number
|
||||||
|
@ -1,11 +1,105 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>ajax</div>
|
<div class="go-chart-configurations-data-ajax">
|
||||||
|
<setting-item-box name="类型" :alone="true">
|
||||||
|
<n-select
|
||||||
|
v-model:value="targetData.data.requestHttpType"
|
||||||
|
:options="selectOptions"
|
||||||
|
/>
|
||||||
|
</setting-item-box>
|
||||||
|
<setting-item-box :alone="true">
|
||||||
|
<template #name>
|
||||||
|
地址
|
||||||
|
<n-tooltip trigger="hover" v-if="ISDEV">
|
||||||
|
<template #trigger>
|
||||||
|
<n-icon size="21" :depth="3">
|
||||||
|
<help-outline-icon></help-outline-icon>
|
||||||
|
</n-icon>
|
||||||
|
</template>
|
||||||
|
<span>
|
||||||
|
开发环境使用 mock 数据,请输入【
|
||||||
|
<n-text type="info">
|
||||||
|
{{ featchMockData }}
|
||||||
|
</n-text>
|
||||||
|
】
|
||||||
|
</span>
|
||||||
|
</n-tooltip>
|
||||||
|
</template>
|
||||||
|
<n-input
|
||||||
|
v-model:value="targetData.data.requestUrl"
|
||||||
|
:min="1"
|
||||||
|
placeholder="http(s)://..."
|
||||||
|
/>
|
||||||
|
</setting-item-box>
|
||||||
|
<setting-item-box name="测试" :alone="true">
|
||||||
|
<n-space>
|
||||||
|
<n-button @click="sendHandle">
|
||||||
|
<template #icon>
|
||||||
|
<n-icon>
|
||||||
|
<flash-icon />
|
||||||
|
</n-icon>
|
||||||
|
</template>
|
||||||
|
发送地址请求
|
||||||
|
</n-button>
|
||||||
|
</n-space>
|
||||||
|
</setting-item-box>
|
||||||
|
<chart-data-matching-and-show
|
||||||
|
v-show="showMatching"
|
||||||
|
:targetData="targetData"
|
||||||
|
></chart-data-matching-and-show>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { PropType, ref, toRefs } from 'vue'
|
||||||
|
import { icon } from '@/plugins'
|
||||||
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
|
import { SettingItemBox } from '@/components/ChartItemSetting/index'
|
||||||
|
import { RequestHttpEnum } from '@/enums/httpEnum'
|
||||||
|
import { SelectHttpType } from '../../index.d'
|
||||||
|
import { featchMockData } from '@/api/mock'
|
||||||
|
import { http } from '@/api/http'
|
||||||
|
import { ChartDataMatchingAndShow } from '../ChartDataMatchingAndShow'
|
||||||
|
|
||||||
|
const { HelpOutlineIcon, FlashIcon } = icon.ionicons5
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
targetData: {
|
||||||
|
type: Object as PropType<CreateComponentType>,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 是否是开发环境
|
||||||
|
const ISDEV = import.meta.env.DEV === true
|
||||||
|
// 是否展示数据分析
|
||||||
|
const showMatching = ref(false)
|
||||||
|
// 请求相关
|
||||||
|
const { requestUrl, requestHttpType } = toRefs(props.targetData.data)
|
||||||
|
|
||||||
|
// 选项
|
||||||
|
const selectOptions: SelectHttpType[] = [
|
||||||
|
{
|
||||||
|
label: RequestHttpEnum.GET,
|
||||||
|
value: RequestHttpEnum.GET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: RequestHttpEnum.POST,
|
||||||
|
value: RequestHttpEnum.POST
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
// 发送请求
|
||||||
|
const sendHandle = async () => {
|
||||||
|
if(!requestUrl || !requestUrl.value) {
|
||||||
|
window['$message'].warn('请求参数不正确,请检查!')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const res = await http(requestHttpType.value)(requestUrl.value as string, {})
|
||||||
|
console.log(res)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
@include go('chart-configurations-data-ajax') {
|
||||||
|
}
|
||||||
</style>
|
</style>
|
@ -7,9 +7,8 @@
|
|||||||
<th v-for="item in tableTitle" :key="item">{{ item }}</th>
|
<th v-for="item in tableTitle" :key="item">{{ item }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody v-show="!tableLoad">
|
<tbody>
|
||||||
<go-skeleton :repeat="3" :load="tableLoad" style="width: 200px;"></go-skeleton>
|
<tr v-for="(item, index) in getDimensionsAndSource" :key="index">
|
||||||
<tr v-for="(item, index) in tableData" :key="index">
|
|
||||||
<td>{{ item.field }}</td>
|
<td>{{ item.field }}</td>
|
||||||
<td>{{ item.mapping }}</td>
|
<td>{{ item.mapping }}</td>
|
||||||
<td>
|
<td>
|
||||||
@ -69,30 +68,20 @@ import { ref, computed, watch, nextTick, PropType } from 'vue'
|
|||||||
import { UploadCustomRequestOptions } from 'naive-ui'
|
import { UploadCustomRequestOptions } from 'naive-ui'
|
||||||
import { FileTypeEnum } from '@/enums/fileTypeEnum'
|
import { FileTypeEnum } from '@/enums/fileTypeEnum'
|
||||||
import { readFile, downloadFile } from '@/utils'
|
import { readFile, downloadFile } from '@/utils'
|
||||||
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
import { DataResultEnum, TimelineTitleEnum } from '../../index.d'
|
import { DataResultEnum, TimelineTitleEnum } from '../../index.d'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
tableData: {
|
targetData: {
|
||||||
type: Object,
|
type: Object as PropType<CreateComponentType>,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const tableLoad = ref(true)
|
|
||||||
|
|
||||||
// 表格标题
|
// 表格标题
|
||||||
const tableTitle = ['字段', '映射', '状态']
|
const tableTitle = ['字段', '映射', '状态']
|
||||||
|
|
||||||
// 表格数据加载
|
|
||||||
watch(() => props.tableData.value, (newData: object[]) => {
|
|
||||||
if (!(newData && newData.length !== 0)) {
|
|
||||||
tableLoad.value = false
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
immediate: true
|
|
||||||
})
|
|
||||||
|
|
||||||
const { DocumentAddIcon, DocumentDownloadIcon } = icon.carbon
|
const { DocumentAddIcon, DocumentDownloadIcon } = icon.carbon
|
||||||
const uploadFileListRef = ref()
|
const uploadFileListRef = ref()
|
||||||
const source = ref()
|
const source = ref()
|
||||||
@ -172,7 +161,7 @@ const customRequest = (options: UploadCustomRequestOptions) => {
|
|||||||
// 下载文件
|
// 下载文件
|
||||||
const download = () => {
|
const download = () => {
|
||||||
try {
|
try {
|
||||||
window['$message'].success('正在下载文件!')
|
window['$message'].success('下载中,请耐心等待...')
|
||||||
downloadFile(JSON.stringify(props.targetData?.option?.dataset), undefined, 'json')
|
downloadFile(JSON.stringify(props.targetData?.option?.dataset), undefined, 'json')
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
window['$message'].success('下载失败,数据错误!')
|
window['$message'].success('下载失败,数据错误!')
|
||||||
@ -181,7 +170,7 @@ const download = () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@include go("chart-configurations-data-static") {
|
@include go("chart-configurations-timeline") {
|
||||||
@include deep() {
|
@include deep() {
|
||||||
pre {
|
pre {
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="go-chart-configurations-data-static" v-if="targetData">
|
<div class="go-chart-configurations-data-static">
|
||||||
<ChartDataMatchingAndShow :tableData="targetData"></ChartDataMatchingAndShow>
|
<chart-data-matching-and-show
|
||||||
|
:targetData="targetData"
|
||||||
|
></chart-data-matching-and-show>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -15,19 +17,9 @@ const props = defineProps({
|
|||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@include go("chart-configurations-data-static") {
|
@include go('chart-configurations-data-static') {
|
||||||
@include deep() {
|
|
||||||
pre {
|
|
||||||
white-space: pre-wrap;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.source-btn-box {
|
|
||||||
margin-top: 10px !important;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { RequestDataTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
import { RequestDataTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
|
import { RequestHttpEnum } from '@/enums/httpEnum'
|
||||||
|
|
||||||
// 匹配结果
|
// 匹配结果
|
||||||
export enum DataResultEnum {
|
export enum DataResultEnum {
|
||||||
@ -12,13 +13,20 @@ export enum TimelineTitleEnum {
|
|||||||
CONTENT = '数据内容',
|
CONTENT = '数据内容',
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum SelcetOptionsLableEnum {
|
export enum SelectCreateDataEnum {
|
||||||
STATIC = '静态数据',
|
STATIC = '静态数据',
|
||||||
AJAX = '动态请求',
|
AJAX = '动态请求',
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SelectOptionsType {
|
export interface SelectCreateDataType {
|
||||||
label: SelcetOptionsLableEnum
|
label: SelectCreateDataEnum
|
||||||
value: RequestDataTypeEnum
|
value: RequestDataTypeEnum
|
||||||
disabled?: boolean
|
disabled?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ajax 请求
|
||||||
|
export interface SelectHttpType {
|
||||||
|
label: RequestHttpEnum
|
||||||
|
value: RequestHttpEnum
|
||||||
|
disabled?: boolean
|
||||||
|
}
|
||||||
|
@ -1,15 +1,19 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="go-chart-configurations-data" v-if="targetData">
|
<div class="go-chart-configurations-data" v-if="targetData">
|
||||||
<setting-item-box name="请求方式" :alone="true">
|
<setting-item-box name="请求方式" :alone="true">
|
||||||
<n-select v-model:value="targetData.data.requestDataType" :options="selectOptions" />
|
<n-select
|
||||||
|
v-model:value="targetData.data.requestDataType"
|
||||||
|
:options="selectOptions"
|
||||||
|
/>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
|
<n-divider style="margin: 10px 0;"></n-divider>
|
||||||
<!-- 静态 -->
|
<!-- 静态 -->
|
||||||
<chart-data-static
|
<chart-data-static
|
||||||
v-if="targetData.data.requestDataType === RequestDataTypeEnum.STATIC"
|
v-if="targetData.data.requestDataType === RequestDataTypeEnum.STATIC"
|
||||||
:targetData="targetData"
|
:targetData="targetData"
|
||||||
></chart-data-static>
|
></chart-data-static>
|
||||||
<!-- 动态 -->
|
<!-- 动态 -->
|
||||||
<chart-data-ajax v-else></chart-data-ajax>
|
<chart-data-ajax v-else :targetData="targetData"></chart-data-ajax>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -19,27 +23,25 @@ import { RequestDataTypeEnum } from '@/store/modules/chartEditStore/chartEditSto
|
|||||||
import { useTargetData } from '../hooks/useTargetData.hook'
|
import { useTargetData } from '../hooks/useTargetData.hook'
|
||||||
import { ChartDataStatic } from './components/ChartDataStatic/index'
|
import { ChartDataStatic } from './components/ChartDataStatic/index'
|
||||||
import { ChartDataAjax } from './components/ChartDataAjax/index'
|
import { ChartDataAjax } from './components/ChartDataAjax/index'
|
||||||
import { SelectOptionsType, SelcetOptionsLableEnum } from './index.d'
|
import { SelectCreateDataType, SelectCreateDataEnum } from './index.d'
|
||||||
|
|
||||||
const { targetData } = useTargetData()
|
const { targetData } = useTargetData()
|
||||||
|
|
||||||
// 选项
|
// 选项
|
||||||
const selectOptions: SelectOptionsType[] = [
|
const selectOptions: SelectCreateDataType[] = [
|
||||||
{
|
{
|
||||||
label: SelcetOptionsLableEnum.STATIC,
|
label: SelectCreateDataEnum.STATIC,
|
||||||
value: RequestDataTypeEnum.STATIC
|
value: RequestDataTypeEnum.STATIC
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: SelcetOptionsLableEnum.AJAX,
|
label: SelectCreateDataEnum.AJAX,
|
||||||
value: RequestDataTypeEnum.AJAX,
|
value: RequestDataTypeEnum.AJAX
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style></style>
|
||||||
</style>
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@include go("chart-configurations-data") {
|
@include go('chart-configurations-data') {
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user