222版签名提交
This commit is contained in:
parent
c2f4217cea
commit
9e9a372959
@ -1,5 +1,5 @@
|
|||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
const imageAddress = 'F://陕西省咸阳市礼泉县心电图FTP/ecgimage/'
|
const imageAddress = 'F:/陕西省咸阳市礼泉县心电图FTP/ecgimage/'
|
||||||
const originImageAddress = 'https://zzxmc.gw12320.com/ecgimage/'
|
const originImageAddress = 'https://zzxmc.gw12320.com/ecgimage/'
|
||||||
// 超声组件 API
|
// 超声组件 API
|
||||||
export const processImageApi = {
|
export const processImageApi = {
|
||||||
@ -385,11 +385,12 @@ step:" ",
|
|||||||
return str;
|
return str;
|
||||||
},
|
},
|
||||||
addressToUrl:(address)=>{
|
addressToUrl:(address)=>{
|
||||||
|
// F:\陕西省咸阳市礼泉县心电图FTP\ecgimage\imgOcrAndProcess\\250605000=1567835=8d813b33-e7e7-4ee9-bce6-ab32526b269d.pdf
|
||||||
if (!address){
|
if (!address){
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// console.log(imageAddress)
|
// console.log(imageAddress)
|
||||||
const str = address.replace(imageAddress,originImageAddress)
|
const str = address.replace("F:\\陕西省咸阳市礼泉县心电图FTP\\ecgimage\\",originImageAddress)
|
||||||
// console.log(str)
|
// console.log(str)
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|||||||
7
src/types/ukey.d.ts
vendored
Normal file
7
src/types/ukey.d.ts
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
declare global {
|
||||||
|
interface Window {
|
||||||
|
QysUKeySdk: any;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export {}
|
||||||
1
src/utils/sdk.min.v1.0.0.js
Normal file
1
src/utils/sdk.min.v1.0.0.js
Normal file
File diff suppressed because one or more lines are too long
80
src/utils/ukey.ts
Normal file
80
src/utils/ukey.ts
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
import axios from 'axios'
|
||||||
|
// 动态加载 SDK
|
||||||
|
export const loadUKeySdk = () => {
|
||||||
|
return new Promise<void>((resolve, reject) => {
|
||||||
|
const script = document.createElement('script')
|
||||||
|
script.src = '/src/utils/sdk.min.v1.0.0.js'
|
||||||
|
script.type = 'text/javascript'
|
||||||
|
|
||||||
|
// 确保 window 对象已准备好
|
||||||
|
script.onload = () => {
|
||||||
|
if (window.QysUKeySdk) {
|
||||||
|
resolve()
|
||||||
|
} else {
|
||||||
|
reject(new Error('SDK 加载失败:QysUKeySdk 未定义'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
script.onerror = (error) => {
|
||||||
|
reject(new Error('SDK 加载失败:' + error))
|
||||||
|
}
|
||||||
|
|
||||||
|
document.head.appendChild(script)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 下载 PDF 文件
|
||||||
|
const downloadPdf = (data: any, filename: string = 'signed.pdf') => {
|
||||||
|
const blob = new Blob([data], { type: 'application/pdf' })
|
||||||
|
const url = URL.createObjectURL(blob)
|
||||||
|
const link = document.createElement('a')
|
||||||
|
link.href = url
|
||||||
|
link.download = filename
|
||||||
|
document.body.appendChild(link)
|
||||||
|
link.click()
|
||||||
|
document.body.removeChild(link)
|
||||||
|
URL.revokeObjectURL(url)
|
||||||
|
}
|
||||||
|
|
||||||
|
const uploadPdf = async (byteArray: number[], filename: string = 'signed.pdf') => {
|
||||||
|
console.log(router)
|
||||||
|
// return
|
||||||
|
try {
|
||||||
|
// 将字节数组转换为逗号分隔的字符串
|
||||||
|
const fileStream = byteArray.join(',');
|
||||||
|
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('fileStream', fileStream);
|
||||||
|
formData.append('filename', filename);
|
||||||
|
formData.append('fileType', 'pdf');
|
||||||
|
formData.append('savePath', 'D:/陕西省咸阳市礼泉县心电图FTP/ecgimage/imgOcrAndProcess/');
|
||||||
|
|
||||||
|
const response = await fetch('http://localhost:58080/uploadFile', {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = await response.json();
|
||||||
|
console.log('上传结果:', result);
|
||||||
|
return result;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('文件上传失败:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// 获取 SDK 实例
|
||||||
|
export const getUKeySdk = () => {
|
||||||
|
if (window.QysUKeySdk) {
|
||||||
|
const sdk = new window.QysUKeySdk({
|
||||||
|
signCb: async function(file) {
|
||||||
|
try {
|
||||||
|
uploadPdf(file[0].rawFileData)
|
||||||
|
console.log('签署完成,文件已上传到服务器',file);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('文件处理失败:', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return sdk
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
@ -490,7 +490,9 @@
|
|||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
</div>
|
</div>
|
||||||
</el-drawer>
|
</el-drawer>
|
||||||
|
<Dialog v-model="uKeyable" title="表单详情" >
|
||||||
|
<index2/>
|
||||||
|
</Dialog>
|
||||||
<el-dialog
|
<el-dialog
|
||||||
title=""
|
title=""
|
||||||
v-model="isdiagshow"
|
v-model="isdiagshow"
|
||||||
@ -587,6 +589,7 @@ import { PatientexamlistApi, PatientexamlistVO } from '@/api/tblist/patientexaml
|
|||||||
import QRCode from 'qrcode'
|
import QRCode from 'qrcode'
|
||||||
import ECGprint from '@/views/ECG/ECGprint.vue'
|
import ECGprint from '@/views/ECG/ECGprint.vue'
|
||||||
import ReportInfoECG from '@/views/applyregistration/reportPrintStatistics/ReportInfoECG.vue'
|
import ReportInfoECG from '@/views/applyregistration/reportPrintStatistics/ReportInfoECG.vue'
|
||||||
|
import Index2 from "@/views/ECG/translate/index2.vue";
|
||||||
import htmlToPdf from '@/utils/htmlPdf'
|
import htmlToPdf from '@/utils/htmlPdf'
|
||||||
import ECGWarningDialog from '@/views/ECG/ECGWaring/ECGWarningDialog.vue'
|
import ECGWarningDialog from '@/views/ECG/ECGWaring/ECGWarningDialog.vue'
|
||||||
import ECGReport from '@/views/ECG/ECGWaring/ECGReport.vue'
|
import ECGReport from '@/views/ECG/ECGWaring/ECGReport.vue'
|
||||||
@ -597,6 +600,8 @@ import useClipboard from 'vue-clipboard3' //复制组件
|
|||||||
import { ElLoading } from 'element-plus'
|
import { ElLoading } from 'element-plus'
|
||||||
import { processImageApi } from '@/api/processImage'
|
import { processImageApi } from '@/api/processImage'
|
||||||
import {encodeBase64} from "@/utils/base64"
|
import {encodeBase64} from "@/utils/base64"
|
||||||
|
import Dialog from "@/components/Dialog/src/Dialog.vue";
|
||||||
|
import { log } from 'console'
|
||||||
|
|
||||||
const { toClipboard } = useClipboard()
|
const { toClipboard } = useClipboard()
|
||||||
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
||||||
@ -642,7 +647,8 @@ const keyid = ref() //当前数据行的主键ID
|
|||||||
const savedisabled = ref(false) //保存按钮是否可用
|
const savedisabled = ref(false) //保存按钮是否可用
|
||||||
const isPictureVisible = ref(false) //是否显示图片
|
const isPictureVisible = ref(false) //是否显示图片
|
||||||
const loading = ref(false) // 点击审核后的加载
|
const loading = ref(false) // 点击审核后的加载
|
||||||
|
const uKeyable = ref(false) // 签名
|
||||||
|
const router = useRouter()
|
||||||
// 树配置项
|
// 树配置项
|
||||||
const treeDefaultProps = {
|
const treeDefaultProps = {
|
||||||
children: 'children',
|
children: 'children',
|
||||||
@ -678,6 +684,7 @@ const open = async (row: any) => {
|
|||||||
(queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.BMP') ||
|
(queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.BMP') ||
|
||||||
queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.JPG') ||
|
queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.JPG') ||
|
||||||
queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.PNG'))
|
queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.PNG'))
|
||||||
|
|
||||||
) {
|
) {
|
||||||
isPictureVisible.value = true
|
isPictureVisible.value = true
|
||||||
isChildVisible.value = false
|
isChildVisible.value = false
|
||||||
@ -730,44 +737,42 @@ const open = async (row: any) => {
|
|||||||
}
|
}
|
||||||
//审核功能
|
//审核功能
|
||||||
async function process() {
|
async function process() {
|
||||||
|
uKeyable.value=false
|
||||||
if (applyFormVO.value.reportstatus === '已分析') {
|
if (applyFormVO.value.reportstatus === '已分析') {
|
||||||
// 审核确认
|
// 审核确认
|
||||||
await message.delConfirm('是否进行审核操作', '审核')
|
await message.delConfirm('是否进行审核操作', '审核')
|
||||||
// loading.value = true
|
// uKeyable.value=true
|
||||||
// return
|
|
||||||
const response = await PatientexamlistApi.examine(keyid.value,Profilevo.value.doctorname,Profilevo.value.doctorID)
|
const response = await PatientexamlistApi.examine(keyid.value,Profilevo.value.doctorname,Profilevo.value.doctorID)
|
||||||
|
|
||||||
if (response) {
|
if (response) {
|
||||||
message.alertSuccess('审核成功')
|
message.alertSuccess('审核成功')
|
||||||
let data = Object.assign({},processImageApi.paramsList[rowinfo.value.orgName])
|
let data = Object.assign({},processImageApi.paramsList[rowinfo.value.orgName])
|
||||||
// data.imagePath = "F:\\陕西省咸阳市礼泉县心电图FTP\\ecgimage\\北屯中心卫生院\\K021180213001N0003_20250418161404.jpg"
|
|
||||||
data.imagePath = queryParams.value.ecgJsonDataFilePath
|
data.imagePath = queryParams.value.ecgJsonDataFilePath
|
||||||
// data.imagePath = "https://zzxmc.gw12320.com/ecgimage/%E5%8C%97%E5%B1%AF%E4%B8%AD%E5%BF%83%E5%8D%AB%E7%94%9F%E9%99%A2/K021180213001N0003_20250418162136.jpg"
|
|
||||||
data.examId = rowinfo.value.examId
|
data.examId = rowinfo.value.examId
|
||||||
data.orgId = rowinfo.value.orgId
|
data.orgId = rowinfo.value.orgId
|
||||||
data.watermarkText = data.step + queryParams.value.doctorDiagResult
|
data.watermarkText = data.step + queryParams.value.doctorDiagResult
|
||||||
// console.log(data)
|
// console.log(data)
|
||||||
data.imagePath = processImageApi.urlToAddress(data.imagePath)
|
data.imagePath = processImageApi.urlToAddress(data.imagePath)
|
||||||
// let str = JSON.stringify(data)
|
// const processResponse = await processImageApi.processImg(data,processImageApi.apiUrl111)
|
||||||
// let str64 = encodeBase64(str)
|
const processResponse = await processImageApi.processImg(data,processImageApi.apiUrl222)
|
||||||
const processResponse = await processImageApi.processImg(data,processImageApi.apiUrl111)
|
|
||||||
// await processImageApi.processImg(data,processImageApi.apiUrl222)
|
|
||||||
console.log("processResponse",processResponse)
|
|
||||||
|
|
||||||
// 1. 解析外层 JSON 的 data 字符串
|
// 1. 解析外层 JSON 的 data 字符串
|
||||||
const dataObj = JSON.parse(processResponse.data);
|
const dataObj = JSON.parse(processResponse.data.data);
|
||||||
console.log("dataObj",dataObj)
|
|
||||||
|
|
||||||
// 2. 直接获取 updateSuccess 的值
|
// 2. 直接获取 updateSuccess 的值
|
||||||
const updateSuccess = dataObj.updateSuccess;
|
const updateSuccess = dataObj.updateSuccess;
|
||||||
console.log("updateSuccess",updateSuccess)
|
|
||||||
if (!updateSuccess){
|
if (!updateSuccess){
|
||||||
message.warning('诊断图片生成异常')
|
message.warning('诊断图片生成异常')
|
||||||
|
}else{
|
||||||
|
const imageUrl = processImageApi.addressToUrl(dataObj.imagePath)
|
||||||
|
// 使用 window.open 打开新标签页
|
||||||
|
window.open(`/translate?img=${encodeURIComponent(imageUrl)}`, '_blank')
|
||||||
}
|
}
|
||||||
// loading.value = false
|
|
||||||
await getPatientexamlist(keyid.value)
|
await getPatientexamlist(keyid.value)
|
||||||
emit('success')
|
emit('success')
|
||||||
savedisabled.value = true
|
savedisabled.value = true
|
||||||
|
// loading.value = false
|
||||||
|
|
||||||
}
|
}
|
||||||
} else if (applyFormVO.value.reportstatus === '已审核') {
|
} else if (applyFormVO.value.reportstatus === '已审核') {
|
||||||
message.warning('已经审核,无需再次审核')
|
message.warning('已经审核,无需再次审核')
|
||||||
|
|||||||
221
src/views/ECG/translate/index2.vue
Normal file
221
src/views/ECG/translate/index2.vue
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
<!-- App.vue -->
|
||||||
|
<template>
|
||||||
|
<div class='App'>
|
||||||
|
<div class='header'>
|
||||||
|
<div class="upload-section">
|
||||||
|
<label htmlFor='addFile'>添加本地文件</label>
|
||||||
|
<input id='addFile' type="file" multiple @change="handleAddFile" :disabled="loading"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="network-section">
|
||||||
|
<el-input
|
||||||
|
v-model="pdfUrl"
|
||||||
|
placeholder="请输入 PDF 文件地址"
|
||||||
|
:disabled="loading"
|
||||||
|
class="pdf-url-input"
|
||||||
|
>
|
||||||
|
<template #append>
|
||||||
|
<el-button @click="handleNetworkPdf(pdfUrl)" :loading="loading">
|
||||||
|
加载网络 PDF
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-input>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-button @click="handleCloseApp" :disabled="loading" type="danger">
|
||||||
|
关闭应用
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
<div class='body'>
|
||||||
|
<div ref="container" class='container'></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, onMounted, nextTick } from 'vue'
|
||||||
|
import { loadUKeySdk, getUKeySdk } from '@/utils/ukey'
|
||||||
|
import { ElLoading, ElMessage } from 'element-plus'
|
||||||
|
import axios from 'axios'
|
||||||
|
import { log } from 'console'
|
||||||
|
|
||||||
|
const ukeySdk = ref<any>(null)
|
||||||
|
const container = ref<HTMLDivElement|null>(null)
|
||||||
|
const loading = ref(false)
|
||||||
|
const pdfUrl = ref('')
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
loading.value = true
|
||||||
|
const pdfParam = route.query.img
|
||||||
|
console.log('PDF参数:', pdfParam)
|
||||||
|
try {
|
||||||
|
await loadUKeySdk()
|
||||||
|
ukeySdk.value = getUKeySdk()
|
||||||
|
if (!ukeySdk.value) {
|
||||||
|
throw new Error('SDK 初始化失败')
|
||||||
|
}
|
||||||
|
ElMessage.success('SDK 加载成功')
|
||||||
|
|
||||||
|
// 如果有URL参数,使用URL参数;否则使用默认URL
|
||||||
|
const pdfToLoad = pdfParam ? String(pdfParam) : ''
|
||||||
|
pdfUrl.value = pdfToLoad
|
||||||
|
|
||||||
|
// 使用 nextTick 确保组件和 SDK 完全初始化
|
||||||
|
nextTick(async () => {
|
||||||
|
if (pdfToLoad) {
|
||||||
|
console.log('准备加载PDF:', pdfToLoad)
|
||||||
|
// 添加一个小延时确保 SDK 完全就绪
|
||||||
|
setTimeout(async () => {
|
||||||
|
await handleNetworkPdf(pdfToLoad)
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error('SDK加载失败:', error)
|
||||||
|
ElMessage.error(error.message || 'SDK 加载失败')
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 处理本地文件上传
|
||||||
|
const handleAddFile = (event: any) => {
|
||||||
|
if (loading.value) {
|
||||||
|
ElMessage.warning('SDK 正在加载中,请稍候...')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const files = event.target.files;
|
||||||
|
if (!files || !files.length || !ukeySdk.value) {
|
||||||
|
ElMessage.warning('请先选择文件')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
/** ukeySdk.container 可用于判断当前是否已经渲染,组件渲染后会将根 dom 元素保存在 sdk 实例中 */
|
||||||
|
if (!ukeySdk.value.container) {
|
||||||
|
ukeySdk.value.render(container.value!)
|
||||||
|
}
|
||||||
|
/** 向签章系统中添加 pdf 文件 */
|
||||||
|
ukeySdk.value.addFile(files)
|
||||||
|
ElMessage.success('文件添加成功')
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error('添加文件失败:', error)
|
||||||
|
ElMessage.error(error.message || '添加文件失败')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理网络 PDF 文件
|
||||||
|
const handleNetworkPdf = async (pdf) => {
|
||||||
|
console.log('开始处理PDF:', pdf)
|
||||||
|
|
||||||
|
if (loading.value) {
|
||||||
|
console.log('SDK正在加载中,退出处理')
|
||||||
|
ElMessage.warning('SDK 正在加载中,请稍候...')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pdf) {
|
||||||
|
console.log('PDF地址为空,退出处理')
|
||||||
|
ElMessage.warning('PDF 文件地址为空')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ukeySdk.value) {
|
||||||
|
console.log('SDK未初始化,退出处理')
|
||||||
|
ElMessage.warning('SDK 未初始化')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('开始设置loading状态')
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
console.log('开始获取PDF文件:', pdf)
|
||||||
|
// 获取 PDF 文件
|
||||||
|
const response = await axios.get(pdf, {
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 30000, // 设置超时时间
|
||||||
|
headers: {
|
||||||
|
'Cache-Control': 'no-cache',
|
||||||
|
'Pragma': 'no-cache'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log('PDF文件获取成功,响应状态:', response.status)
|
||||||
|
console.log('开始创建File对象')
|
||||||
|
// 创建 File 对象
|
||||||
|
const file = new File([response.data], 'document.pdf', {
|
||||||
|
type: 'application/pdf'
|
||||||
|
})
|
||||||
|
|
||||||
|
// 渲染容器
|
||||||
|
if (!ukeySdk.value.container) {
|
||||||
|
console.log('开始渲染容器')
|
||||||
|
ukeySdk.value.render(container.value!)
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('开始添加文件到签章系统')
|
||||||
|
// 添加文件到签章系统
|
||||||
|
await ukeySdk.value.addFile([file])
|
||||||
|
console.log('文件添加成功')
|
||||||
|
ElMessage.success('网络 PDF 文件添加成功')
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error('添加网络 PDF 失败:', error)
|
||||||
|
ElMessage.error(error.message || '添加网络 PDF 失败')
|
||||||
|
} finally {
|
||||||
|
console.log('处理完成,重置loading状态')
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 卸载当前签章应用实例 */
|
||||||
|
const handleCloseApp = () => {
|
||||||
|
if (!ukeySdk.value) {
|
||||||
|
ElMessage.warning('SDK 未初始化')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ukeySdk.value.close()
|
||||||
|
ElMessage.success('应用已关闭')
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error('关闭应用失败:', error)
|
||||||
|
ElMessage.error(error.message || '关闭应用失败')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.App {
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
overflow: hidden;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
flex-shrink: 0;
|
||||||
|
padding: 10px;
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.body {
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:disabled,
|
||||||
|
input:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Loading…
Reference in New Issue
Block a user