parent
978570f1e0
commit
1e031b35c1
12 changed files with 688 additions and 117 deletions
@ -0,0 +1,301 @@ |
||||
<template> |
||||
<!-- 个人额度模型 --> |
||||
<el-form label-width="80px" |
||||
class="form" |
||||
status-icon> |
||||
<h6 class="step-name mb-2">{{ formProcess[0]?.name }}</h6> |
||||
<el-form-item label="不超过"> |
||||
<el-select v-model="form.firstMode"> |
||||
<el-option v-for="item in formProcess[0]?.recordChildren[0]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<h6 class="step-name mt-4 mb-2">{{ formProcess[1]?.name }}</h6> |
||||
<el-form-item label="不超过"> |
||||
<el-select v-model="form.secondMode"> |
||||
<el-option v-for="item in formProcess[1]?.recordChildren[0]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<h6 class="step-name mt-4 mb-2">{{ formProcess[2]?.name }}</h6> |
||||
<el-form-item label="不超过"> |
||||
<el-select v-model="form.thirdMode"> |
||||
<el-option v-for="item in formProcess[2]?.recordChildren[0]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item label="且"></el-form-item> |
||||
<el-form-item label="不超过"> |
||||
<el-select v-model="form.andThird"> |
||||
<el-option v-for="item in formProcess[2]?.recordChildren[1]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item label="额度模型"> |
||||
<el-table class="c-table" |
||||
:data="form.individualCreditModels" |
||||
:span-method="span" |
||||
border> |
||||
<el-table-column prop="indexName" |
||||
label="指标名称" |
||||
min-width="100" |
||||
align="center"> |
||||
<template #default="{ row, $index }"> |
||||
<span :class="{'text-[#006bff]': !$index || $index === len}">{{ row?.indexName }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="描述" |
||||
min-width="150"> |
||||
<template #default="{ row, $index }"> |
||||
<span :class="{'text-[#006bff]': !$index || $index === len}">{{ row?.description }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="分值" |
||||
min-width="150"> |
||||
<template #default="{ row, $index }"> |
||||
<div v-if="$index !== len" |
||||
class="flex items-center"> |
||||
<span v-if="!$index" |
||||
class="mr-2 whitespace-nowrap">{{ row?.subject?.name }}</span> |
||||
<el-select v-model="row.score"> |
||||
<el-option v-for="item in row?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</div> |
||||
<span v-else |
||||
class="text-[#006bff]">以上分值合计</span> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
<div class="flex justify-end"> |
||||
<div class="submit" |
||||
@click="submit">确认完成配置</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script setup lang="ts"> |
||||
import { ref, onMounted } from 'vue'; |
||||
import { ElMessage } from 'element-plus'; |
||||
import { personalCreditModelDetails, personalCreditModelSaveOrUpdate } from '@/api/model'; |
||||
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
||||
import type { TableColumnCtx } from 'element-plus'; |
||||
import { useRouter, useRoute } from 'vue-router'; |
||||
import { handleId } from '@/utils/common'; |
||||
import Cookies from 'js-cookie'; |
||||
|
||||
const router = useRouter(); |
||||
const route = useRoute(); |
||||
const projectId = +Cookies.get('sand-projectId'); |
||||
const levelId = +Cookies.get('sand-level'); |
||||
const form = ref<Record<string, any>>({ |
||||
projectId, |
||||
checkpointId: levelId, |
||||
andThird: '', |
||||
firstMode: '', |
||||
secondMode: '', |
||||
thirdMode: '', |
||||
type: 1, |
||||
individualCreditModels: [], |
||||
}); |
||||
const formProcess = ref<Record<string, any>[]>([]); |
||||
const info = ref<Record<string, any>[]>([]); |
||||
const len = ref<number>(0); |
||||
// 配置项 |
||||
const getConfig = async () => { |
||||
const { process } = await getProcessInformationBasedOnRoles(772); |
||||
formProcess.value = process.slice(0, 3); |
||||
const list = process[3]?.recordChildren; |
||||
let cur = info.value.length ? info.value[0] : {}; |
||||
const result = [ |
||||
{ |
||||
modelId: cur?.modelId || '', |
||||
id: cur?.id || '', |
||||
indexName: list[0]?.name, |
||||
description: list[0]?.remark, |
||||
subject: list[0]?.recordChildren[0]?.subject, |
||||
score: cur?.score || '', |
||||
}, |
||||
]; |
||||
const length = list.length - 1; |
||||
list?.forEach((e, i) => { |
||||
if (i && i !== length) { |
||||
cur = info.value.length ? info.value[i] : {}; |
||||
let temp = { |
||||
indexName: e.name, |
||||
recordChildren: e.recordChildren, |
||||
stRecordId: e.id, |
||||
ruleId: e?.recordChildren[0]?.id || '', |
||||
description: e?.recordChildren[0]?.name || '', |
||||
subject: e?.recordChildren[0]?.subject || [], |
||||
score: '', |
||||
}; |
||||
|
||||
result.push(temp); |
||||
e?.recordChildren.forEach((n, j) => { |
||||
if (j) { |
||||
temp = JSON.parse(JSON.stringify(temp)); |
||||
temp.description = n.name; |
||||
temp.subject = n.subject; |
||||
temp.ruleId = n.id; |
||||
result.push(temp); |
||||
} |
||||
}); |
||||
} |
||||
}); |
||||
cur = info.value.length ? info.value[info.value.length - 1] : {}; |
||||
result.push({ |
||||
indexName: list[length]?.name, |
||||
description: list[length]?.remark, |
||||
subject: list[length]?.subject, |
||||
score: '', |
||||
}); |
||||
len.value = result.length - 1; |
||||
if (info.value.length) { |
||||
result.forEach((e, i) => { |
||||
result[i].score = info.value[i].score; |
||||
result[i].id = info.value[i].id; |
||||
result[i].modelId = info.value[i].modelId; |
||||
}); |
||||
} |
||||
form.value.individualCreditModels = result; |
||||
}; |
||||
// 详情 |
||||
const getDetail = async () => { |
||||
try { |
||||
const { data } = await personalCreditModelDetails(levelId, projectId); |
||||
if (data) { |
||||
form.value = data; |
||||
info.value = data.individualCreditModels; |
||||
} |
||||
getConfig(); |
||||
} finally { |
||||
} |
||||
}; |
||||
onMounted(() => { |
||||
getDetail(); |
||||
}); |
||||
|
||||
interface SpanMethodProps { |
||||
row: Record<string, any>; |
||||
column: TableColumnCtx<Record<string, any>>; |
||||
rowIndex: number; |
||||
columnIndex: number; |
||||
} |
||||
const rowMerge1 = [1, 7, 16, 23, 71, 75, 87, 98]; |
||||
const rowMerge2 = [5, 30, 59, 61, 63, 79]; |
||||
const rowMerge3 = [11, 38, 45]; |
||||
const rowMerge4 = [20, 27, 50, 53, 56, 65, 68, 81, 84, 102, 105, 108]; |
||||
const rowMerge5 = [0, 43, 44, 111]; |
||||
// 表格合并 |
||||
const span = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => { |
||||
if (columnIndex === 0) { |
||||
if (rowMerge1.includes(rowIndex)) { |
||||
return { |
||||
rowspan: 4, |
||||
colspan: 1, |
||||
}; |
||||
} else if (rowMerge2.includes(rowIndex)) { |
||||
return { |
||||
rowspan: 2, |
||||
colspan: 1, |
||||
}; |
||||
} else if (rowMerge3.includes(rowIndex)) { |
||||
return { |
||||
rowspan: 5, |
||||
colspan: 1, |
||||
}; |
||||
} else if (rowMerge4.includes(rowIndex)) { |
||||
return { |
||||
rowspan: 3, |
||||
colspan: 1, |
||||
}; |
||||
} else if (rowIndex === 32) { |
||||
return { |
||||
rowspan: 6, |
||||
colspan: 1, |
||||
}; |
||||
} else if (rowIndex === 91) { |
||||
return { |
||||
rowspan: 7, |
||||
colspan: 1, |
||||
}; |
||||
} else if (rowMerge5.includes(rowIndex)) { |
||||
return { |
||||
rowspan: 1, |
||||
colspan: 1, |
||||
}; |
||||
} else { |
||||
return { |
||||
rowspan: 0, |
||||
colspan: 0, |
||||
}; |
||||
} |
||||
} |
||||
}; |
||||
// 提交 |
||||
const submit = async () => { |
||||
let param = JSON.parse(JSON.stringify(form.value)); |
||||
param?.individualCreditModels.forEach((e, i) => { |
||||
delete e.recordChildren; |
||||
delete e.subject; |
||||
}); |
||||
await personalCreditModelSaveOrUpdate(param); |
||||
addRecord(param); |
||||
getDetail(); |
||||
ElMessage.success('提交成功!'); |
||||
}; |
||||
const getItemId = (name: string): number | string => { |
||||
if (!name) return ''; |
||||
return formProcess.value[0]?.recordChildren[0]?.subject?.itemList.find((e) => e.options === name)?.itemId; |
||||
}; |
||||
|
||||
// 新增判分记录 |
||||
const addRecord = async (data: Record<string, any>) => { |
||||
let preIds = `1,${Cookies.get('sand-level')},42,68,756,772`; // 1,关卡id,角色(这个页面是风控经理策略),其他看判分点接口 |
||||
const rule: Array<Record<string, any>> = []; |
||||
data.firstMode && rule.push(handleId(777, 236, getItemId(data.firstMode), preIds + ',774,777', 1)); |
||||
data.secondMode && rule.push(handleId(777, 236, getItemId(data.secondMode), preIds + ',775,777', 1)); |
||||
data.thirdMode && rule.push(handleId(777, 236, getItemId(data.thirdMode), preIds + ',776,777', 1)); |
||||
data.andThird && rule.push(handleId(778, 236, getItemId(data.andThird), preIds + ',776,778', 1)); |
||||
|
||||
preIds += `,788`; |
||||
form.value.individualCreditModels[0].score && |
||||
rule.push( |
||||
handleId( |
||||
790, |
||||
238, |
||||
form.value?.individualCreditModels[0]?.subject?.itemList.find((e) => e.options === form.value.individualCreditModels[0].score)?.itemId, |
||||
preIds + ',789,790', |
||||
1, |
||||
), |
||||
); |
||||
form.value.individualCreditModels.forEach((e, i) => { |
||||
if (i && i !== len.value && e.subject) { |
||||
e.score && rule.push(handleId(e.ruleId, e.subject.subjectId, e?.subject?.itemList?.find((n) => n.options === e.score)?.itemId, `${preIds},${e.stRecordId},${e.ruleId}`, 1)); |
||||
} |
||||
}); |
||||
await addOperation({ |
||||
checkpointId: levelId, |
||||
parentId: preIds, |
||||
lcJudgmentRuleReq: rule, |
||||
projectId, |
||||
}); |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
@import url(../../../styles/form.scss); |
||||
.c-table { |
||||
:deep(.el-input__inner) { |
||||
@apply px-2; |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,176 @@ |
||||
<template> |
||||
<!-- 企业额度模型 --> |
||||
<el-form label-width="80px" |
||||
class="form" |
||||
status-icon> |
||||
<h6 class="step-name mb-2">{{ info[0]?.name }}</h6> |
||||
<el-form-item class="mb-1" |
||||
label="不超过"> |
||||
<el-select v-model="form.firstMode"> |
||||
<el-option v-for="item in info[0]?.recordChildren[0]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item class="mb-1" |
||||
label="且"></el-form-item> |
||||
<el-form-item label="不超过"> |
||||
<el-select v-model="form.andFirst"> |
||||
<el-option v-for="item in info[0]?.recordChildren[1]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
|
||||
<h6 class="step-name mt-4 mb-2">{{ info[1]?.name }}</h6> |
||||
<el-form-item class="mb-1" |
||||
label="不超过"> |
||||
<el-select v-model="form.secondMode"> |
||||
<el-option v-for="item in info[0]?.recordChildren[0]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item class="mb-1" |
||||
label="且"></el-form-item> |
||||
<el-form-item label="不超过"> |
||||
<el-select v-model="form.andSecond"> |
||||
<el-option v-for="item in info[0]?.recordChildren[1]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
|
||||
<h6 class="step-name mt-4 mb-2">{{ info[2]?.name }}</h6> |
||||
<el-form-item label="不超过"> |
||||
<el-select v-model="form.thirdMode"> |
||||
<el-option v-for="item in info[0]?.recordChildren[0]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
|
||||
<h6 class="step-name mt-4 mb-2">{{ info[3]?.name }}</h6> |
||||
<el-form-item label="不超过"> |
||||
<el-select v-model="form.fourthMode"> |
||||
<el-option v-for="item in info[0]?.recordChildren[0]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
|
||||
<h6 class="step-name mt-4 mb-2">{{ info[4]?.name }}</h6> |
||||
<el-form-item label="不超过"> |
||||
<el-select v-model="form.fifthMode"> |
||||
<el-option v-for="item in info[0]?.recordChildren[0]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
|
||||
<h6 class="step-name mt-4 mb-2">{{ info[5]?.name }}</h6> |
||||
<el-form-item label="不超过"> |
||||
<el-select v-model="form.sixthMode"> |
||||
<el-option v-for="item in info[0]?.recordChildren[0]?.subject?.itemList" |
||||
:key="item" |
||||
:value="item.options" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
</el-form> |
||||
|
||||
<div class="flex justify-end"> |
||||
<div class="submit" |
||||
@click="submit">确认完成配置</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script setup lang="ts"> |
||||
import { ref, onMounted } from 'vue'; |
||||
import { ElMessage } from 'element-plus'; |
||||
import { businessQuotaModelDetails, businessQuotaModelSaveOrUpdate } from '@/api/model'; |
||||
import { getProcessInformationBasedOnRoles, addOperation } from '@/api/judgment'; |
||||
import { useRouter, useRoute } from 'vue-router'; |
||||
import { handleId } from '@/utils/common'; |
||||
import Cookies from 'js-cookie'; |
||||
|
||||
const router = useRouter(); |
||||
const route = useRoute(); |
||||
const projectId = +Cookies.get('sand-projectId'); |
||||
const levelId = +Cookies.get('sand-level'); |
||||
const form = ref<Record<string, any>>({ |
||||
projectId, |
||||
checkpointId: levelId, |
||||
andFirst: '', |
||||
andSecond: '', |
||||
andThird: '', |
||||
fifthMode: '', |
||||
firstMode: '', |
||||
fourthMode: '', |
||||
secondMode: '', |
||||
sixthMode: '', |
||||
thirdMode: '', |
||||
type: 2, |
||||
}); |
||||
const info = ref<Record<string, any>[]>([]); |
||||
// 配置项 |
||||
const getConfig = async () => { |
||||
const { process } = await getProcessInformationBasedOnRoles(773); |
||||
info.value = process; |
||||
}; |
||||
// 详情 |
||||
const getDetail = async () => { |
||||
try { |
||||
const { data } = await businessQuotaModelDetails(levelId, projectId); |
||||
if (data) { |
||||
form.value = data; |
||||
} |
||||
getConfig(); |
||||
} finally { |
||||
} |
||||
}; |
||||
onMounted(() => { |
||||
getDetail(); |
||||
}); |
||||
|
||||
// 提交 |
||||
const submit = async () => { |
||||
let param = JSON.parse(JSON.stringify(form.value)); |
||||
await businessQuotaModelSaveOrUpdate(param); |
||||
addRecord(param); |
||||
getDetail(); |
||||
ElMessage.success('提交成功!'); |
||||
}; |
||||
const getItemId = (name: string): number | string => { |
||||
if (!name) return ''; |
||||
return info.value[0]?.recordChildren[0]?.subject?.itemList.find((e) => e.options === name)?.itemId; |
||||
}; |
||||
// 新增判分记录 |
||||
const addRecord = async (data: Record<string, any>) => { |
||||
let preIds = `1,${Cookies.get('sand-level')},42,68,756,773`; // 1,关卡id,角色(这个页面是风控经理策略),其他看判分点接口 |
||||
const rule: Array<Record<string, any>> = []; |
||||
data.firstMode && rule.push(handleId(785, 237, getItemId(data.firstMode), preIds + ',779,785', 1)); |
||||
data.andFirst && rule.push(handleId(786, 237, getItemId(data.andFirst), preIds + ',779,786', 1)); |
||||
data.secondMode && rule.push(handleId(785, 237, getItemId(data.secondMode), preIds + ',780,785', 1)); |
||||
data.andSecond && rule.push(handleId(786, 237, getItemId(data.andSecond), preIds + ',780,786', 1)); |
||||
data.thirdMode && rule.push(handleId(785, 237, getItemId(data.thirdMode), preIds + ',781,785', 1)); |
||||
data.fourthMode && rule.push(handleId(787, 237, getItemId(data.fourthMode), preIds + ',782,787', 1)); |
||||
data.fifthMode && rule.push(handleId(785, 237, getItemId(data.fifthMode), preIds + ',783,785', 1)); |
||||
data.sixthMode && rule.push(handleId(785, 237, getItemId(data.sixthMode), preIds + ',784,785', 1)); |
||||
|
||||
await addOperation({ |
||||
checkpointId: levelId, |
||||
parentId: preIds, |
||||
lcJudgmentRuleReq: rule, |
||||
projectId, |
||||
}); |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
@import url(../../../styles/form.scss); |
||||
.c-table { |
||||
:deep(.el-input__inner) { |
||||
@apply px-2; |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,118 @@ |
||||
<template> |
||||
<div class="block" |
||||
style="padding-top: 0"> |
||||
<el-tabs v-model="curTab" |
||||
@tab-click="tabChange"> |
||||
<el-tab-pane label="额度模型" |
||||
name="tab1"> |
||||
<div class="flex"> |
||||
<div class="left w-[241px] min-w-[241px] pr-5 py-4"> |
||||
<ul class="products"> |
||||
<li v-for="(item, i) in list[0]?.recordChildren" |
||||
:key="i" |
||||
:class="{ active: item.id === id }" |
||||
@click="switchProduct(item.id)"> |
||||
<h6>{{ item.name }}</h6> |
||||
<p class="type">{{ item.remark }}</p> |
||||
</li> |
||||
</ul> |
||||
</div> |
||||
<div class="right flex-1 px-5 pt-2"> |
||||
<Com1 v-if="id == 772" /> |
||||
<Com2 v-else-if="id == 773" /> |
||||
</div> |
||||
</div> |
||||
</el-tab-pane> |
||||
<el-tab-pane label="利率模型" |
||||
name="tab2"> |
||||
<!-- <div class="flex"> |
||||
<div class="left w-[241px] min-w-[241px] pr-5 py-4"> |
||||
<ul class="products"> |
||||
<li v-for="(item, i) in list2" |
||||
:key="i" |
||||
:class="{ active: item.id === riskId }" |
||||
@click="switchProductRisk(item.id)"> |
||||
<h6>{{ item.name }}</h6> |
||||
<p class="mt-2 des">{{ item.remark }}</p> |
||||
</li> |
||||
</ul> |
||||
</div> |
||||
<div class="right flex-1 px-5 pt-2"> |
||||
<Risk1 v-if="riskId === 702" /> |
||||
<Risk2 v-else-if="riskId === 703" /> |
||||
<Risk3 v-else-if="riskId === 704" /> |
||||
</div> |
||||
</div> --> |
||||
</el-tab-pane> |
||||
</el-tabs> |
||||
</div> |
||||
</template> |
||||
|
||||
<script setup lang="ts"> |
||||
import { computed, onMounted, ref } from 'vue'; |
||||
import type { TabsPaneContext } from 'element-plus'; |
||||
import { getProcessInformationBasedOnRoles } from '@/api/judgment'; |
||||
import { delCredit, listCredit } from '@/api/model'; |
||||
import { useRouter, useRoute } from 'vue-router'; |
||||
import { ElMessage } from 'element-plus'; |
||||
import Cookies from 'js-cookie'; |
||||
import Com1 from './772.vue'; |
||||
import Com2 from './773.vue'; |
||||
|
||||
const router = useRouter(); |
||||
const route = useRoute(); |
||||
const projectId = +Cookies.get('sand-projectId'); |
||||
const levelId = +Cookies.get('sand-level'); |
||||
const curTab = computed(() => route.params.action); |
||||
const list = ref<Array<Record<string, any>>>([]); |
||||
const list1 = ref<Array<Record<string, any>>>([]); |
||||
const id = computed(() => +route.query.id); |
||||
const creditId = computed(() => +route.query.creditId); |
||||
|
||||
// 切换 |
||||
const switchProduct = (id: number) => { |
||||
router.push(`/product/interestRate/${route.params.action}?&i=3&role=42&id=${id}`); |
||||
}; |
||||
// 列表 |
||||
const getList = async (refresh?: number) => { |
||||
const { process } = await getProcessInformationBasedOnRoles(68); |
||||
// eslint-disable-next-line no-unused-expressions |
||||
!id.value && switchProduct(process[curTab.value === 'tab1' ? 0 : 1].recordChildren[0].id); |
||||
list.value = process; |
||||
}; |
||||
onMounted(() => { |
||||
getList(); |
||||
}); |
||||
|
||||
// tab切换回调 |
||||
const tabChange = (tab: TabsPaneContext, event: Event) => { |
||||
getList(); |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
.left { |
||||
border-right: 1px solid #e9eff2; |
||||
} |
||||
.products { |
||||
@apply max-h-[calc(100vh-205px)] pr-1 overflow-auto; |
||||
li { |
||||
@apply relative p-5 pt-7 mb-5 rounded-[10px] cursor-pointer border border-solid border-[transparent] bg-[url('@/assets/images/10.png')] bg-[length:100%_100%] bg-no-repeat; |
||||
&.active { |
||||
@apply border-[#CAE0FF]; |
||||
} |
||||
} |
||||
.del { |
||||
@apply absolute top-0 right-0; |
||||
} |
||||
h6 { |
||||
@apply text-[#14436b]; |
||||
} |
||||
.type { |
||||
@apply my-3 text-sm text-[#333]; |
||||
} |
||||
.des { |
||||
@apply text-sm text-[#8798a9]; |
||||
} |
||||
} |
||||
</style> |
Loading…
Reference in new issue