智慧种植模块一体育苗页面开发,new政务数据大屏路由调整
This commit is contained in:
parent
5909699ca8
commit
c4304f8da7
@ -57,11 +57,11 @@ export const rightApps = [
|
||||
},
|
||||
{
|
||||
// name: 'sub-government-screen-service',
|
||||
name: 'new-digital-agriculture-screen',
|
||||
name: 'new-digital-agriculture-screen/v2/land',
|
||||
// entry: VITE_APP_SUB_GSS,
|
||||
entry: VITE_APP_SUB_GSR,
|
||||
// activeRule: '/sub-government-screen-service',
|
||||
activeRule: '/new-digital-agriculture-screen',
|
||||
activeRule: '/new-digital-agriculture-screen/v2/land',
|
||||
title: '数据大屏',
|
||||
icon: 'images/platform/icon-screen.png',
|
||||
},
|
||||
|
@ -28,7 +28,7 @@ const props = defineProps({
|
||||
});
|
||||
|
||||
const titles = ref([
|
||||
{ label: '首页', value: 'home' },
|
||||
// { label: '首页', value: 'home' },
|
||||
{ label: '土地资源', value: 'land' },
|
||||
{ label: '投入品', value: 'inputs' },
|
||||
{ label: '生产经营主体', value: 'entities' },
|
||||
|
@ -54,7 +54,7 @@ const props = defineProps({
|
||||
type: Array,
|
||||
default() {
|
||||
return [
|
||||
{ label: '首页', value: '/new-digital-agriculture-screen/v2/home' },
|
||||
// { label: '首页', value: '/new-digital-agriculture-screen/v2/home' },
|
||||
{ label: '土地资源', value: '/new-digital-agriculture-screen/v2/land' },
|
||||
{ label: '投入品监管', value: '/new-digital-agriculture-screen/v2/inputs' },
|
||||
{ label: '产出品管理', value: '/new-digital-agriculture-screen/v2/entities' },
|
||||
|
@ -58,10 +58,10 @@ onMounted(() => {
|
||||
user-select: none;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
height: 100;
|
||||
height: 100%;
|
||||
background:
|
||||
url('@/assets/images/basic/containerBG.png') no-repeat center 100%,
|
||||
url('@/assets/images/basic/containerBotBG.png') no-repeat bottom center;
|
||||
url('../assets/images/basic/containerBG.png') no-repeat center 100%,
|
||||
url('../assets/images/basic/containerBotBG.png') no-repeat bottom center;
|
||||
&-header {
|
||||
width: 100%;
|
||||
margin-bottom: 16px;
|
||||
|
@ -17,21 +17,22 @@ export const constantRoutes = [
|
||||
component: () => import('@/views/error/403.vue'),
|
||||
hidden: true,
|
||||
},
|
||||
{
|
||||
path: '/new-digital-agriculture-screen',
|
||||
name: 'layout',
|
||||
component: Layout,
|
||||
redirect: '/new-digital-agriculture-screen/v2/home',
|
||||
meta: { title: '首页', icon: 'House' },
|
||||
children: [
|
||||
{
|
||||
path: '/new-digital-agriculture-screen/v2/home',
|
||||
component: () => import('@/views/home/index.vue'),
|
||||
name: 'home',
|
||||
meta: { title: '首页', icon: '' },
|
||||
},
|
||||
],
|
||||
},
|
||||
// {
|
||||
// // 原来的首页默认配置
|
||||
// path: '/new-digital-agriculture-screen',
|
||||
// name: 'layout',
|
||||
// component: Layout,
|
||||
// redirect: '/new-digital-agriculture-screen/v2/home',
|
||||
// meta: { title: '首页', icon: 'House' },
|
||||
// children: [
|
||||
// {
|
||||
// path: '/new-digital-agriculture-screen/v2/home',
|
||||
// component: () => import('@/views/home/index.vue'),
|
||||
// name: 'home',
|
||||
// meta: { title: '首页', icon: '' },
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// ...demoRouters,
|
||||
v2,
|
||||
// {
|
||||
|
@ -4,7 +4,7 @@ export default {
|
||||
path: '/new-digital-agriculture-screen',
|
||||
name: 'layout',
|
||||
component: Layout,
|
||||
redirect: '/new-digital-agriculture-screen/v2/home',
|
||||
redirect: '/new-digital-agriculture-screen/v2/land', //原home
|
||||
meta: { title: '首页', icon: '' },
|
||||
children: [
|
||||
{
|
||||
|
@ -23,6 +23,7 @@
|
||||
"axios": "^1.6.5",
|
||||
"echarts": "^5.6.0",
|
||||
"element-plus": "^2.7.2",
|
||||
"hls.js": "^1.6.2",
|
||||
"js-base64": "^3.7.6",
|
||||
"lodash": "^4.17.21",
|
||||
"moment": "^2.30.1",
|
||||
|
BIN
sub-operation-service/src/assets/images/smartFarm/灌溉控制.png
Normal file
BIN
sub-operation-service/src/assets/images/smartFarm/灌溉控制.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.0 KiB |
BIN
sub-operation-service/src/assets/images/smartFarm/病虫害.png
Normal file
BIN
sub-operation-service/src/assets/images/smartFarm/病虫害.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
BIN
sub-operation-service/src/assets/images/smartFarm/育苗.png
Normal file
BIN
sub-operation-service/src/assets/images/smartFarm/育苗.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
@ -63,6 +63,12 @@ export const constantRoutes = [
|
||||
name: 'fieldInspection',
|
||||
meta: { title: '田间检测' },
|
||||
},
|
||||
{
|
||||
path: '/sub-operation-service/smartFarm/growSeedlings',
|
||||
component: () => import('@/views/smartFarm/growSeedlings/index.vue'),
|
||||
name: 'growSeedlings',
|
||||
meta: { title: '一体育苗' },
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
@ -48,12 +48,19 @@ const menus = reactive([
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'purchaser',
|
||||
name: 'control',
|
||||
title: '生产管理控制',
|
||||
icon: 'menu3.png',
|
||||
path: '/sub-operation-service/ecommerce-purchaser',
|
||||
isOpen: false,
|
||||
children: [],
|
||||
children: [
|
||||
{
|
||||
name: 'control',
|
||||
title: '一体育苗',
|
||||
icon: 'menu3.png',
|
||||
path: '/sub-operation-service/smartFarm/growSeedlings',
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
</script>
|
||||
|
@ -76,12 +76,19 @@ const leftMenu = reactive([
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'purchaser',
|
||||
name: 'control',
|
||||
title: '生产管理控制',
|
||||
icon: 'menu3.png',
|
||||
path: '/sub-operation-service/ecommerce-purchaser',
|
||||
path: '/sub-operation-service/smartFarm/main',
|
||||
isOpen: false,
|
||||
children: [],
|
||||
children: [
|
||||
{
|
||||
name: 'control',
|
||||
title: '一体育苗',
|
||||
icon: 'menu3.png',
|
||||
path: '/sub-operation-service/smartFarm/growSeedlings',
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
||||
@ -108,9 +115,12 @@ const toLink = (index) => {
|
||||
}
|
||||
};
|
||||
const toLinkSub = (index, c) => {
|
||||
console.info('index', index);
|
||||
console.info('c', c);
|
||||
currentCIndex.value = c;
|
||||
let path = leftMenu[index].children[c].path;
|
||||
if (path) {
|
||||
console.info('path', path);
|
||||
router.push(path);
|
||||
}
|
||||
};
|
||||
|
@ -0,0 +1,79 @@
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted, watch } from 'vue';
|
||||
|
||||
const props = defineProps({
|
||||
column: {
|
||||
type: Array,
|
||||
required: true,
|
||||
default: () => [],
|
||||
},
|
||||
data: {
|
||||
type: Array,
|
||||
required: true,
|
||||
default: () => [],
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: () => '',
|
||||
validator: (items) => {
|
||||
return items;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
console.log(props.column);
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<el-card style="border-radius: 16px">
|
||||
<div class="my-table-title" style="">{{ title }}</div>
|
||||
<div style="height: 170px">
|
||||
<table border="0" cellspacing="0" cellpadding="8">
|
||||
<tr class="my-table-th">
|
||||
<th v-for="(item, index) in column" :key="item.prop || index">
|
||||
{{ item?.label || '' }}
|
||||
</th>
|
||||
</tr>
|
||||
<tr v-for="(item, index) in data" :key="item.id || index">
|
||||
<td v-for="(cell, i) of item" :key="item.id || i">
|
||||
<span style="color: #25bf82" v-if="cell == '开启'">{{ cell }}</span>
|
||||
<span style="color: #fe4066" v-else-if="cell == '关闭'">{{ cell }}</span>
|
||||
<span v-else>{{ cell }}</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.my-table-title {
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
color: #000;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
table {
|
||||
width: 100%;
|
||||
display: table;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
td,
|
||||
th {
|
||||
display: table-cell;
|
||||
width: auto;
|
||||
padding: 5px;
|
||||
text-align: left;
|
||||
}
|
||||
.my-table-th {
|
||||
color: #999;
|
||||
font-weight: 300;
|
||||
background-color: rgba(37, 191, 130, 0.05);
|
||||
}
|
||||
</style>
|
@ -0,0 +1,158 @@
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted, watch } from 'vue';
|
||||
import { isEmpty, getAssetsFile } from '@/utils';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
|
||||
const props = defineProps({
|
||||
devices: {
|
||||
type: Array,
|
||||
required: true,
|
||||
default: () => [],
|
||||
validator: (items) => {
|
||||
return items.every((item) => {
|
||||
return (
|
||||
typeof item === 'object' &&
|
||||
item !== null &&
|
||||
typeof item.id === 'number' &&
|
||||
typeof item.isOpen === 'number' &&
|
||||
typeof item.isOperation === 'number' &&
|
||||
typeof item.name === 'string' &&
|
||||
typeof item.serial === 'string' &&
|
||||
typeof item.icon === 'string' &&
|
||||
(!item.status || typeof item.status === 'number')
|
||||
);
|
||||
});
|
||||
},
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: () => '',
|
||||
validator: (items) => {
|
||||
return items;
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<el-card style="border-radius: 16px">
|
||||
<div class="device-list-title" style="">{{ title }}</div>
|
||||
<div style="display: flex; justify-content: flex-start; flex-wrap: wrap; gap: 16px">
|
||||
<div v-for="(item, index) in devices" :key="index" class="device">
|
||||
<div v-if="item.status == 1" class="status" style="background-color: #25bf82">正常</div>
|
||||
<div v-else-if="item.status == 0" class="status" style="background-color: #999999">离线</div>
|
||||
<div v-else-if="item.status == -1" class="status" style="background-color: #fe4066">故障</div>
|
||||
<div style="display: flex; flex-direction: column; justify-content: space-between; height: 100%">
|
||||
<div style="display: flex; justify-content: flex-start">
|
||||
<img v-if="item.icon === 'plant'" :src="getAssetsFile('images/smartFarm/育苗.png')" alt="" />
|
||||
<img v-else-if="item.icon === 'gogga'" :src="getAssetsFile('images/smartFarm/病虫害.png')" alt="" />
|
||||
<img v-else-if="item.icon === 'water'" :src="getAssetsFile('images/smartFarm/灌溉控制.png')" alt="" />
|
||||
<div style="margin-left: 10px">
|
||||
<div style="font-size: 16px; text-align: left">{{ item.name }}</div>
|
||||
<div style="font-size: 12px; text-align: left">{{ item.serial }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="text-align: left; font-size: 16px; display: flex; justify-content: space-between; padding-left: 6px">
|
||||
<div style="width: 128px; height: 30px; border-radius: 15px; background-color: #ffffff">
|
||||
<div v-if="item.status == '0'" :class="{ 'swich-box2': true, 'swich-box-close': item.isOpen == 0 }">
|
||||
<span class="swich-btn" :style="{ color: item.isOpen == 0 ? '#999999' : '#ffffff' }">开启</span>
|
||||
<span class="swich-btn" :style="{ color: item.isOpen == 1 ? '#999999' : '#ffffff' }">关闭</span>
|
||||
</div>
|
||||
<div v-else :class="{ 'swich-box': true, 'swich-box-close': item.isOpen == 0 }">
|
||||
<span class="swich-btn" :style="{ color: item.isOpen == 0 ? '#25bf82' : '#ffffff' }" @click="item.isOpen = 1">开启</span>
|
||||
<span class="swich-btn" :style="{ color: item.isOpen == 1 ? '#999999' : '#ffffff' }" @click="item.isOpen = 0">关闭</span>
|
||||
</div>
|
||||
</div>
|
||||
<span v-if="item.isOperation == 0" style="color: #999999">待机中...</span>
|
||||
<span v-else-if="item.isOperation == 1" style="color: #25bf82">运作中...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.device-list-title {
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
color: #000;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.device {
|
||||
height: 150px;
|
||||
flex: 0 0 calc(33.33% - 11px);
|
||||
background-color: #f5f5f5;
|
||||
border-radius: 16px;
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
padding: 16px 16px 16px 10px;
|
||||
img {
|
||||
height: 64px;
|
||||
width: 64px;
|
||||
}
|
||||
}
|
||||
.status {
|
||||
border-radius: 0 16px 0 16px;
|
||||
height: 32px;
|
||||
line-height: 26px;
|
||||
width: 40px;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
color: #ffffff;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.swich-box,
|
||||
.swich-box2 {
|
||||
width: 128px;
|
||||
height: 30px;
|
||||
border-radius: 15px;
|
||||
z-index: 0;
|
||||
position: relative;
|
||||
&::before {
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
content: '';
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: -1;
|
||||
width: 64px;
|
||||
height: 30px;
|
||||
background-color: #25bf82;
|
||||
border-radius: 15px;
|
||||
transition: all 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
&.swich-box-close::before {
|
||||
left: 64px;
|
||||
background-color: #999999;
|
||||
}
|
||||
|
||||
::v-deep .swich-btn {
|
||||
display: inline-block;
|
||||
font-size: 16px;
|
||||
width: 64px;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
border-radius: 15px;
|
||||
text-align: center;
|
||||
transition: all 0.3s ease-in-out;
|
||||
}
|
||||
}
|
||||
.swich-box2 {
|
||||
&::before {
|
||||
background-color: #999999;
|
||||
}
|
||||
}
|
||||
</style>
|
@ -0,0 +1,204 @@
|
||||
<template>
|
||||
<section>
|
||||
<common>
|
||||
<template #main>
|
||||
<div>
|
||||
<ProduceDevices :title="'育苗设备'" :devices="devices"></ProduceDevices>
|
||||
</div>
|
||||
<div style="display: flex; justify-content: space-between; margin-top: 20px">
|
||||
<MyTable :title="'育苗策略'" :data="leftTableData" :column="leftTableTitle" style="width: 60%; margin-right: 20px"></MyTable>
|
||||
<MyTable :title="'育苗记录'" :data="rightTableData" :column="rightTableTitle" style="flex: 1"></MyTable>
|
||||
</div>
|
||||
</template>
|
||||
</common>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue';
|
||||
import Common from '../components/common.vue';
|
||||
import MyTable from '@/views/smartFarm/components/myTable.vue';
|
||||
import ProduceDevices from '@/views/smartFarm/components/produceDevices.vue';
|
||||
|
||||
const devices = ref([
|
||||
{
|
||||
name: 'A-001',
|
||||
serial: 'YM20250101001', // 设备序列号
|
||||
icon: 'plant', // plant育苗 gogga病虫害 water喷灌
|
||||
isOpen: 1, // 0:关闭 1:开启
|
||||
isOperation: 0, // 0:待机中 1:运作中
|
||||
status: '1', // -1:故障 0:离线 1:正常
|
||||
id: 0,
|
||||
},
|
||||
{
|
||||
name: 'A-002',
|
||||
serial: 'YM20250101002',
|
||||
icon: 'plant',
|
||||
isOpen: 0,
|
||||
isOperation: 1,
|
||||
status: '1',
|
||||
id: 1,
|
||||
},
|
||||
{
|
||||
name: 'A-003',
|
||||
serial: 'YM20250101003',
|
||||
icon: 'gogga',
|
||||
isOpen: 0,
|
||||
isOperation: 0,
|
||||
status: '-1',
|
||||
id: 2,
|
||||
},
|
||||
{
|
||||
name: 'A-004',
|
||||
serial: 'YM20250101004',
|
||||
icon: 'water',
|
||||
isOpen: 1,
|
||||
isOperation: 0,
|
||||
status: '0',
|
||||
id: 3,
|
||||
},
|
||||
{
|
||||
name: 'A-005',
|
||||
serial: 'YM20250101005',
|
||||
icon: 'gogga',
|
||||
isOpen: 0,
|
||||
isOperation: 1,
|
||||
status: '1',
|
||||
id: 4,
|
||||
},
|
||||
{
|
||||
name: 'A-006',
|
||||
serial: 'YM20250101006',
|
||||
icon: 'water',
|
||||
isOpen: 1,
|
||||
isOperation: 0,
|
||||
status: '1',
|
||||
id: 5,
|
||||
},
|
||||
]);
|
||||
|
||||
const leftTableData = ref([
|
||||
{
|
||||
name: '温度',
|
||||
value: '>25',
|
||||
device: '制冷机',
|
||||
behavior: '开启',
|
||||
time: 10,
|
||||
},
|
||||
{
|
||||
name: '湿度',
|
||||
value: '<24',
|
||||
device: '喷洒机',
|
||||
behavior: '关闭',
|
||||
time: 15,
|
||||
},
|
||||
{
|
||||
name: 'PH值',
|
||||
value: '>8',
|
||||
device: '配肥机',
|
||||
behavior: '开启',
|
||||
time: 5,
|
||||
},
|
||||
{
|
||||
name: '风速',
|
||||
value: '>中风',
|
||||
device: '通风窗',
|
||||
behavior: '关闭',
|
||||
time: '/',
|
||||
},
|
||||
{
|
||||
name: '光照',
|
||||
value: '>强光',
|
||||
device: '幕布',
|
||||
behavior: '开启',
|
||||
time: '/',
|
||||
},
|
||||
]);
|
||||
const leftTableTitle = ref([
|
||||
{
|
||||
label: '参数名称',
|
||||
prop: 'name',
|
||||
width: 'auto',
|
||||
},
|
||||
{
|
||||
label: '参数值',
|
||||
prop: 'value',
|
||||
width: 'auto',
|
||||
},
|
||||
{
|
||||
label: '智能设备',
|
||||
prop: 'device',
|
||||
width: 'auto',
|
||||
},
|
||||
{
|
||||
label: '机械行为',
|
||||
prop: 'behavior',
|
||||
width: 'auto',
|
||||
},
|
||||
{
|
||||
label: '持续时间(min)',
|
||||
prop: 'time',
|
||||
width: 'auto',
|
||||
},
|
||||
]);
|
||||
|
||||
const rightTableData = ref([
|
||||
{
|
||||
date: '2025-01-01 10:36',
|
||||
device: '制冷机',
|
||||
behavior: '开启',
|
||||
},
|
||||
{
|
||||
date: '2025-01-01 10:30',
|
||||
device: '喷洒机',
|
||||
behavior: '关闭',
|
||||
},
|
||||
{
|
||||
date: '2025-01-01 10:22',
|
||||
device: '配肥机',
|
||||
behavior: '开启',
|
||||
},
|
||||
{
|
||||
date: '2025-01-01 10:10',
|
||||
device: '通风窗',
|
||||
behavior: '关闭',
|
||||
},
|
||||
{
|
||||
date: '2025-01-01 10:00',
|
||||
device: '幕布',
|
||||
behavior: '开启',
|
||||
},
|
||||
]);
|
||||
const rightTableTitle = ref([
|
||||
{
|
||||
label: '执行时间',
|
||||
prop: 'date',
|
||||
width: 'auto',
|
||||
},
|
||||
{
|
||||
label: '智能设备',
|
||||
prop: 'device',
|
||||
width: 'auto',
|
||||
},
|
||||
{
|
||||
label: '机械行为',
|
||||
prop: 'behavior',
|
||||
width: 'auto',
|
||||
},
|
||||
]);
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.plantStatus {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
font-size: 14px;
|
||||
margin: 7px 0;
|
||||
.leftKey {
|
||||
color: #000000;
|
||||
}
|
||||
.rightValue {
|
||||
color: #25bf82;
|
||||
}
|
||||
}
|
||||
</style>
|
@ -4417,6 +4417,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"hls.js@npm:^1.6.2":
|
||||
version: 1.6.2
|
||||
resolution: "hls.js@npm:1.6.2"
|
||||
checksum: 10c0/c8700d88610afa85bf441cd624f6d548c1fea59c0e510fb05be02f9a33660b8a46cb17910ea5179b9d1307ce9242f4e904d8aa98d7f63d0df750d6d0f6e85134
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"hookified@npm:^1.6.0":
|
||||
version: 1.6.0
|
||||
resolution: "hookified@npm:1.6.0"
|
||||
@ -8512,6 +8519,7 @@ __metadata:
|
||||
eslint-config-prettier: "npm:^9.1.0"
|
||||
eslint-plugin-prettier: "npm:^5.1.3"
|
||||
eslint-plugin-vue: "npm:^9.20.1"
|
||||
hls.js: "npm:^1.6.2"
|
||||
js-base64: "npm:^3.7.6"
|
||||
lodash: "npm:^4.17.21"
|
||||
mockjs: "npm:^1.1.0"
|
||||
|
Loading…
x
Reference in New Issue
Block a user