This commit is contained in:
2025-03-19 16:43:17 +08:00
parent 824f0ed09d
commit f097902e8c
31 changed files with 2733 additions and 30 deletions

View File

@@ -1,10 +1,129 @@
<script setup>
import Filter from "../../../../components/Filter/index.vue";
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
const columns = [
{
title: '商家ID',
dataIndex: 'key',
},
{
title: '渠道',
dataIndex: 'key',
},
{
title: '达人ID',
dataIndex: 'key',
},
{
title: '推广账号ID',
dataIndex: 'image',
slotName: 'image',
},
{
title: '推广账号',
dataIndex: 'image',
slotName: 'image',
},
{
title: '拉黑原因',
dataIndex: 'key',
},
{
title: '拉黑效果',
dataIndex: 'key',
},
{
title: '开始日期',
dataIndex: 'key',
},
{
title: '结束日期',
dataIndex: 'key',
},
{
title: '关联任务ID',
dataIndex: 'key',
},
{
title: '关联子任务ID',
dataIndex: 'key',
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 90,
},
];
const FilterConfig = [
{
key: 'wd',
type: 'input',
label: '达人ID',
placeholder: '请输入达人ID',
},
{
key: 'wd',
type: 'input',
label: '账号',
placeholder: '请输入账号',
},
{
key: 'wd',
type: 'input',
label: '推广账号',
placeholder: '请输入推广账号',
},
{
key: 'wd',
type: 'datetime',
label: '推广日期',
},
];
const po = reactive({
wd: null,
});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<!-- 拉黑记录 -->
拉黑记录
<a-card>
<Filter
v-model:from="po"
:config="FilterConfig">
</Filter>
<a-table
:data="vo.rows"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:loading="loading"
:columns="columns"
class="flex-grow">
<template v-slot:action>
<div class="flex gap-[20px]">
<a-link :hoverable="false">取消拉黑</a-link>
</div>
</template>
</a-table>
</a-card>
</template>
<style scoped>

View File

@@ -1,10 +1,168 @@
<script setup>
import Filter from "../../../../components/Filter/index.vue";
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
const columns = [
{
title: '商家ID',
dataIndex: 'key',
},
{
title: '昵称',
dataIndex: 'key',
},
{
title: '头像',
dataIndex: 'key',
},
{
title: '手机号',
dataIndex: 'key',
},
{
title: '微信号',
dataIndex: 'image',
slotName: 'image',
},
{
title: '状态',
dataIndex: 'status',
slotName: 'status',
},
{
title: '邀请人',
dataIndex: 'key',
},
{
title: '上上',
dataIndex: 'key',
},
{
title: '上上上',
dataIndex: 'key',
},
{
title: '等级',
dataIndex: 'key',
},
{
title: '入驻日期',
dataIndex: 'key',
},
{
title: '分佣比例',
dataIndex: 'key',
},
{
title: '任务收益',
dataIndex: 'key',
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 140,
},
];
const FilterConfig = [
{
key: 'wd',
type: 'input',
label: '达人ID',
placeholder: '请输入达人ID',
},
{
key: 'wd',
type: 'input',
label: '邀请人',
placeholder: '请输入邀请人',
},
{
key: 'wd',
type: 'input',
label: '手机号',
placeholder: '请输入手机号',
},
{
key: 'wd',
type: 'select',
label: '状态',
placeholder: '请选择状态',
api: async () => ({
data: [
{
name: '选项一',
id: 1,
},
{
name: '选项二',
id: 2,
},
{
name: '选项三',
id: 3,
},
]
}),
},
{
key: 'wd',
type: 'datetime',
label: '入驻时间',
},
{
key: 'wd',
type: 'datetime',
label: '任务收益所属日期',
},
];
const po = reactive({
wd: null,
});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<!-- 达人账号 -->
达人账号
<a-card>
<Filter
v-model:from="po"
:config="FilterConfig">
</Filter>
<a-table
:data="vo.rows"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:loading="loading"
:columns="columns"
class="flex-grow">
<template v-slot:status>
状态
</template>
<template v-slot:action>
<div class="flex gap-[20px]">
<a-link :hoverable="false">编辑</a-link>
<a-link :hoverable="false">快速进入</a-link>
</div>
</template>
</a-table>
</a-card>
</template>
<style scoped>

View File

@@ -11,6 +11,16 @@
</div>
</template>
<style scoped>
<style lang="scss" scoped>
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s;
position: relative;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
position: absolute;
}
</style>

View File

@@ -1,10 +1,148 @@
<script setup>
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
import Filter from "../../../../components/Filter/index.vue";
const columns = [
{
title: '商家ID',
dataIndex: 'key',
},
{
title: '昵称',
dataIndex: 'key',
},
{
title: '头像',
dataIndex: 'key',
},
{
title: '手机号',
dataIndex: 'key',
},
{
title: '微信号',
dataIndex: 'image',
slotName: 'image',
},
{
title: '状态',
dataIndex: 'status',
slotName: 'status',
},
{
title: '邀请人',
dataIndex: 'key',
},
{
title: '入驻日期',
dataIndex: 'key',
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 120,
},
];
const FilterConfig = [
{
key: 'wd',
type: 'input',
label: '商家ID',
placeholder: '请输入商家ID',
},
{
key: 'wd',
type: 'input',
label: '邀请人',
placeholder: '请输入邀请人',
},
{
key: 'wd',
type: 'input',
label: '手机号',
placeholder: '请输入手机号',
},
{
key: 'wd',
type: 'select',
label: '状态',
placeholder: '请选择状态',
api: async () => ({
data: [
{
name: '选项一',
id: 1,
},
{
name: '选项二',
id: 2,
},
{
name: '选项三',
id: 3,
},
]
}),
},
{
key: 'wd',
type: 'datetime',
label: '入驻时间',
},
{
key: 'wd',
type: 'datetime',
label: '确认结算金额所属日期',
},
];
const po = reactive({
wd: null,
});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<!-- 商家账号 -->
商家账号
<a-card>
<Filter
v-model:from="po"
:config="FilterConfig">
</Filter>
<a-table
:data="vo.rows"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:loading="loading"
:columns="columns"
class="flex-grow">
<template v-slot:status>
状态
</template>
<template v-slot:action>
<div class="flex gap-[20px]">
<a-link :hoverable="false">编辑</a-link>
<a-link :hoverable="false">卡密</a-link>
</div>
</template>
</a-table>
</a-card>
</template>
<style scoped>

View File

@@ -1,10 +1,122 @@
<script setup>
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
import Filter from "../../../../components/Filter/index.vue";
const columns = [
{
title: '账号ID',
dataIndex: 'key',
},
{
title: '达人ID',
dataIndex: 'key',
},
{
title: '渠道',
dataIndex: 'key',
},
{
title: '主页截图',
dataIndex: 'image',
slotName: 'image',
},
{
title: '主页二维码',
dataIndex: 'image',
slotName: 'image',
},
{
title: '账号',
dataIndex: 'key',
},
{
title: '昵称',
dataIndex: 'key',
},
{
title: '推广账号状态',
dataIndex: 'status',
slotName: 'status',
},
{
title: '添加日期',
dataIndex: 'key',
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 160,
},
];
const FilterConfig = [
{
key: 'wd',
type: 'input',
label: '达人ID',
placeholder: '请输入达人ID',
},
{
key: 'wd',
type: 'input',
label: '账号',
placeholder: '请输入账号',
},
{
key: 'wd',
type: 'datetime',
label: '推广日期',
},
];
const po = reactive({
wd: null,
});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<!-- 推广账号 -->
推广账号
<a-card>
<Filter
v-model:from="po"
:config="FilterConfig"
:button-col="false">
</Filter>
<a-table
:data="vo.rows"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:loading="loading"
:columns="columns"
class="flex-grow">
<template v-slot:status>
状态
</template>
<template v-slot:action>
<div class="flex gap-[20px]">
<a-link :hoverable="false">编辑</a-link>
<a-link :hoverable="false" status="success">通过</a-link>
<a-link :hoverable="false" status="danger">拒绝</a-link>
</div>
</template>
</a-table>
</a-card>
</template>
<style scoped>

View File

@@ -0,0 +1,49 @@
<script setup>
import {ref} from "vue";
import XSelect from '../../../../../components/XSelect/index.vue';
import Api from "../../../../../api/index.js";
const visible = ref(false);
const success = () => {
}
</script>
<template>
<a-link :hover="false" @click="visible=true">编辑</a-link>
<a-modal
@ok="success"
ok-text="确定修改"
title-align="start"
title="编辑"
v-model:visible="visible">
<a-form layout="vertical">
<a-form-item label="提现方式">
<XSelect :api="Api.system.getSelect" placeholder="请选择提现方式"></XSelect>
</a-form-item>
<a-form-item label="卡号">
<a-input placeholder="请输入卡号"></a-input>
</a-form-item>
<a-form-item label="姓名">
<a-input placeholder="请输入姓名"></a-input>
</a-form-item>
<a-form-item label="身份证号">
<a-input placeholder="请输入身份证号"></a-input>
</a-form-item>
<a-form-item label="手机号">
<a-input placeholder="请输入手机号"></a-input>
</a-form-item>
<a-form-item label="费率">
<a-input-number placeholder="请输入费率">
<template #suffix>%</template>
</a-input-number>
</a-form-item>
</a-form>
</a-modal>
</template>
<style scoped>
</style>

View File

@@ -1,12 +1,328 @@
<script setup>
const RADIO_LIST = [
{
label: '累计',
value: 1,
},
{
label: '今日',
value: 2,
},
{
label: '昨日',
value: 3,
},
{
label: '本周',
value: 4,
},
{
label: '本月',
value: 5,
},
{
label: '自定义',
value: 6,
},
];
</script>
<template>
<!-- 资金概览 -->
资金概览
<div class="mock-card mb-[20px]">
<div class="flex justify-between mb-[16px]">
<div class="title">
资金概览
</div>
<div>
<a-radio-group type="button">
<a-radio
v-for="item in RADIO_LIST"
:key="item.value"
:value="item.value">
{{ item.label }}
</a-radio>
</a-radio-group>
</div>
</div>
<div class="grid grid-cols-6 gap-[20px]" id="statistic-card">
<div
class="bg-[rgb(var(--arcoblue-1))] hover:bg-[rgb(var(--arcoblue-5))] duration-500 p-[20px] statistic-item">
<a-statistic
:value="8.06"
:precision="2"
:value-from="0"
animation>
<template #title>
商家充值含服务款
</template>
</a-statistic>
</div>
<div
class="bg-[rgb(var(--arcoblue-1))] hover:bg-[rgb(var(--arcoblue-5))] duration-500 p-[20px] statistic-item">
<a-statistic
:value="8.06"
:precision="2"
:value-from="0"
animation>
<template #title>
进行中的任务款
</template>
</a-statistic>
</div>
<div
class="bg-[rgb(var(--arcoblue-1))] hover:bg-[rgb(var(--arcoblue-5))] duration-500 p-[20px] statistic-item">
<a-statistic
:value="8.06"
:precision="2"
:value-from="0"
animation>
<template #title>
商家未提现资金
</template>
</a-statistic>
</div>
<div
class="bg-[rgb(var(--arcoblue-1))] hover:bg-[rgb(var(--arcoblue-5))] duration-500 p-[20px] statistic-item">
<a-statistic
:value="8.06"
:precision="2"
:value-from="0"
animation>
<template #title>
达人未提现资金
</template>
</a-statistic>
</div>
<div class="bg-[rgb(var(--orange-1))] hover:bg-[rgb(var(--orange-5))] duration-500 p-[20px] statistic-item">
<a-statistic
:value="8.06"
:precision="2"
:value-from="0"
animation>
<template #title>
毛利算法1
</template>
</a-statistic>
</div>
<div class="bg-[rgb(var(--orange-1))] hover:bg-[rgb(var(--orange-5))] duration-500 p-[20px] statistic-item">
<a-statistic
:value="8.06"
:precision="2"
:value-from="0"
animation>
<template #title>
毛利算法2
</template>
</a-statistic>
</div>
</div>
</div>
<div class="mock-card mb-[20px]">
<div class="title mb-[16px]">
资金概览
</div>
<div class="grid grid-cols-6 gap-[20px]">
<div class="bg-[var(--color-neutral-1)] p-[20px]">
<a-statistic
:value="8.06"
:precision="2"
:value-from="0"
animation>
<template #title>
商家充值含服务款
</template>
</a-statistic>
</div>
<div class="bg-[var(--color-neutral-1)] p-[20px]">
<a-statistic
:value="8.06"
:precision="2"
:value-from="0"
animation>
<template #title>
商家充值含服务款
</template>
</a-statistic>
</div>
</div>
</div>
<div class="flex gap-[20px] box-border mb-[20px]">
<div class="mock-card flex-grow">
<div class="title mb-[16px]">
资金概览
</div>
<a-descriptions table-layout="fixed" :column="1">
<a-descriptions-item>
<template #label>
<div class="label">任务款已消耗</div>
</template>
<div class="value">60.00</div>
</a-descriptions-item>
<a-descriptions-item>
<template #label>
<div class="label">任务服务费盈利</div>
</template>
<div class="value">6.00</div>
</a-descriptions-item>
<a-descriptions-item>
<template #label>
<div class="label">任务差额盈利</div>
</template>
<div class="value">30.00</div>
</a-descriptions-item>
</a-descriptions>
</div>
<div class="mock-card flex-grow">
<div class="title mb-[16px]">
商家
</div>
<a-descriptions table-layout="fixed" :column="1">
<a-descriptions-item>
<template #label>
<div class="label">商家发起提现</div>
</template>
<div class="value">60.00</div>
</a-descriptions-item>
<a-descriptions-item>
<template #label>
<div class="label">商家提现手续费</div>
</template>
<div class="value">6.00</div>
</a-descriptions-item>
<a-descriptions-item>
<template #label>
<div class="label">商家提现到手</div>
</template>
<div class="value">30.00</div>
</a-descriptions-item>
</a-descriptions>
</div>
</div>
<a-card>
<div class="title mb-[16px]">
达人
</div>
<a-descriptions table-layout="fixed" :column="2">
<a-descriptions-item>
<template #label>
<div class="label">商家发起提现</div>
</template>
<div class="value">60.00</div>
</a-descriptions-item>
<a-descriptions-item>
<template #label>
<div class="label">商家提现手续费</div>
</template>
<div class="value">6.00</div>
</a-descriptions-item>
<a-descriptions-item>
<template #label>
<div class="label">商家提现到手</div>
</template>
<div class="value">30.00</div>
</a-descriptions-item>
<a-descriptions-item>
<template #label>
<div class="label">商家发起提现</div>
</template>
<div class="value">60.00</div>
</a-descriptions-item>
<a-descriptions-item>
<template #label>
<div class="label">商家提现手续费</div>
</template>
<div class="value">6.00</div>
</a-descriptions-item>
<a-descriptions-item>
<template #label>
<div class="label">商家提现到手</div>
</template>
<div class="value">30.00</div>
</a-descriptions-item>
</a-descriptions>
</a-card>
</template>
<style scoped>
<style lang="scss" scoped>
#statistic-card {
.statistic-item {
cursor: pointer;
&:hover {
:deep(.arco-statistic) {
.arco-statistic-title,
.arco-statistic-content>.arco-statistic-value {
color: #fff;
}
}
}
:deep(.arco-statistic) {
.arco-statistic-title,
.arco-statistic-content>.arco-statistic-value {
transition: 500ms;
}
}
@for $i from 1 through 6 {
&:nth-child(#{$i}) {
:deep(.arco-statistic) .arco-statistic-value {
color: rgb(var(--#{if($i < 5, 'arcoblue-6', 'orange-5')}));
}
}
}
}
}
.value {
color: rgb(29, 33, 41);
font-family: Nunito Sans, serif;
font-size: 20px;
font-weight: 600;
line-height: 32px;
letter-spacing: 0;
text-align: left;
}
.label {
$color: rgb(78, 89, 105);
color: $color;
font-size: 14px;
font-weight: 400;
line-height: 22px;
letter-spacing: 0;
text-align: left;
display: flex;
align-items: center;
gap: 6px;
padding-left: 12px;
&::before {
content: '';
width: 4px;
height: 4px;
display: block;
background-color: $color;
border-radius: 50%;
}
}
.title {
color: rgb(29, 33, 41);
font-size: 18px;
font-weight: 500;
line-height: 24px;
letter-spacing: 0;
text-align: left;
}
</style>

View File

@@ -1,10 +1,181 @@
<script setup>
import Filter from "../../../../components/Filter/index.vue";
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
const columns = [
{
title: '动账日期',
dataIndex: 'key',
},
{
title: '动账时间',
dataIndex: 'key',
},
{
title: '交易流水号',
dataIndex: 'key',
},
{
title: '动账渠道',
dataIndex: 'key',
},
{
title: '状态',
dataIndex: 'image',
slotName: 'image',
},
{
title: '动账用途',
dataIndex: 'key',
},
{
title: '动账金额(元)',
dataIndex: 'key',
},
{
title: '类型',
dataIndex: 'key',
},
{
title: '付款人账户',
dataIndex: 'key',
},
{
title: '收款人账户',
dataIndex: 'key',
},
{
title: '商家ID',
dataIndex: 'key',
},
{
title: '关联任务ID',
dataIndex: 'key',
},
{
title: '子任务ID',
dataIndex: 'key',
},
{
title: '达人iD',
dataIndex: 'key',
},
{
title: '推广账号iD',
dataIndex: 'key',
},
{
title: '推广账号',
dataIndex: 'key',
},
];
const FilterConfig = [
{
key: 'wd',
type: 'input',
label: '商家ID',
placeholder: '请输入商家ID',
},
{
key: 'wd',
type: 'input',
label: '关联任务ID',
placeholder: '请输入关联任务ID',
},
{
key: 'wd',
type: 'input',
label: '达人ID',
placeholder: '请输入达人ID',
},
{
key: 'wd',
type: 'select',
label: '动账渠道',
placeholder: '请选择动账渠道',
api: async () => ({
data: [
{
name: '选项一',
id: 1,
},
{
name: '选项二',
id: 2,
},
{
name: '选项三',
id: 3,
},
]
}),
},
{
key: 'wd',
type: 'select',
label: '动账用途',
placeholder: '请选择动账用途',
api: async () => ({
data: [
{
name: '选项一',
id: 1,
},
{
name: '选项二',
id: 2,
},
{
name: '选项三',
id: 3,
},
]
}),
},
{
key: 'wd',
type: 'datetime',
label: '动账日期',
}
];
const po = reactive({
wd: null,
});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<!-- 资金管理() -->
资金管理()
<a-card>
<Filter
v-model:from="po"
:config="FilterConfig">
</Filter>
<a-table
:data="vo.rows"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:loading="loading"
:columns="columns"
class="flex-grow">
</a-table>
</a-card>
</template>
<style scoped>

View File

@@ -1,10 +1,181 @@
<script setup>
import Filter from "../../../../components/Filter/index.vue";
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
const columns = [
{
title: '动账日期',
dataIndex: 'key',
},
{
title: '动账时间',
dataIndex: 'key',
},
{
title: '交易流水号',
dataIndex: 'key',
},
{
title: '动账渠道',
dataIndex: 'key',
},
{
title: '状态',
dataIndex: 'image',
slotName: 'image',
},
{
title: '动账用途',
dataIndex: 'key',
},
{
title: '动账金额(元)',
dataIndex: 'key',
},
{
title: '付款人账户',
dataIndex: 'key',
},
{
title: '收款人账户',
dataIndex: 'key',
},
{
title: '商家ID',
dataIndex: 'key',
},
{
title: '关联任务ID',
dataIndex: 'key',
},
{
title: '子任务ID',
dataIndex: 'key',
},
{
title: '达人iD',
dataIndex: 'key',
},
{
title: '推广账号iD',
dataIndex: 'key',
},
{
title: '推广账号',
dataIndex: 'key',
},
{
title: '关联活动ID',
dataIndex: 'key',
},
];
const FilterConfig = [
{
key: 'wd',
type: 'input',
label: '达人ID',
placeholder: '请输入达人ID',
},
{
key: 'wd',
type: 'input',
label: '关联任务ID',
placeholder: '请输入关联任务ID',
},
{
key: 'wd',
type: 'input',
label: '子任务ID',
placeholder: '请输入子任务ID',
},
{
key: 'wd',
type: 'select',
label: '动账渠道',
placeholder: '请选择动账渠道',
api: async () => ({
data: [
{
name: '选项一',
id: 1,
},
{
name: '选项二',
id: 2,
},
{
name: '选项三',
id: 3,
},
]
}),
},
{
key: 'wd',
type: 'select',
label: '动账用途',
placeholder: '请选择动账用途',
api: async () => ({
data: [
{
name: '选项一',
id: 1,
},
{
name: '选项二',
id: 2,
},
{
name: '选项三',
id: 3,
},
]
}),
},
{
key: 'wd',
type: 'datetime',
label: '动账日期',
}
];
const po = reactive({
wd: null,
});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<!-- 资金管理() -->
资金管理()
<a-card>
<Filter
v-model:from="po"
:config="FilterConfig">
</Filter>
<a-table
:data="vo.rows"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:loading="loading"
:columns="columns"
class="flex-grow">
</a-table>
</a-card>
</template>
<style scoped>

View File

@@ -1,12 +1,249 @@
<script setup>
import Filter from "../../../../components/Filter/index.vue";
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
const columns = [
{
title: 'ID',
dataIndex: 'key',
},
{
title: '身份',
dataIndex: 'key',
},
{
title: '提现方式',
dataIndex: 'key',
},
{
title: '姓名',
dataIndex: 'key',
},
{
title: '卡号',
dataIndex: 'image',
slotName: 'image',
},
{
title: '金额',
dataIndex: 'key',
},
{
title: '申请日期',
dataIndex: 'key',
},
{
title: '状态',
dataIndex: 'status',
slotName: 'status',
},
{
title: '到账日期',
dataIndex: 'key',
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 80,
},
{
title: '备注',
dataIndex: 'remark',
slotName: 'remark',
width: 250,
},
];
const FilterConfig = [
{
key: 'wd',
type: 'input',
label: 'ID',
placeholder: '请输入ID',
},
{
key: 'wd',
type: 'input',
label: '姓名',
placeholder: '请输入姓名',
},
{
key: 'wd',
type: 'input',
label: '卡号',
placeholder: '请输入卡号',
},
{
key: 'wd',
type: 'select',
label: '身份',
placeholder: '请选择身份',
api: async () => ({
data: [
{
name: '选项一',
id: 1,
},
{
name: '选项二',
id: 2,
},
{
name: '选项三',
id: 3,
},
]
}),
},
{
key: 'wd',
type: 'datetime',
label: '申请时间',
},
{
key: 'wd',
type: 'select',
label: '状态',
placeholder: '请选择状态',
api: async () => ({
data: [
{
name: '选项一',
id: 1,
},
{
name: '选项二',
id: 2,
},
{
name: '选项三',
id: 3,
},
]
}),
},
];
const po = reactive({
wd: null,
});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<!-- 打款管理 -->
打款管理
<div class="mock-card mb-[20px]">
<div class="title mb-[16px]">打款商户</div>
<div class="grid grid-cols-6 gap-[20px]" id="statistic-card">
<div
class="bg-[rgb(var(--arcoblue-1))] hover:bg-[rgb(var(--arcoblue-5))] duration-500 p-[20px] statistic-item">
<a-statistic
show-group-separator
:value="5436.24"
:precision="2"
:value-from="0"
animation>
<template #title>
商户1剩余
</template>
</a-statistic>
</div>
<div
class="bg-[rgb(var(--arcoblue-1))] hover:bg-[rgb(var(--arcoblue-5))] duration-500 p-[20px] statistic-item">
<a-statistic
show-group-separator
:value="12790.58"
:precision="2"
:value-from="0"
animation>
<template #title>
商户2剩余
</template>
</a-statistic>
</div>
</div>
</div>
<div class="mock-card mb-[20px]">
<Filter
v-model:from="po"
:config="FilterConfig">
</Filter>
</div>
<a-card>
<a-table
:data="vo.rows"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:loading="loading"
:columns="columns"
class="flex-grow">
<template v-slot:status>
状态
</template>
<template v-slot:action>
<a-link :hoverable="false">打款</a-link>
</template>
<template v-slot:remark>
<a-input class="w-full" placeholder="请输入备注信息"></a-input>
</template>
</a-table>
</a-card>
</template>
<style scoped>
<style lang="scss" scoped>
#statistic-card {
.statistic-item {
cursor: pointer;
&:hover {
:deep(.arco-statistic) {
.arco-statistic-title,
.arco-statistic-content > .arco-statistic-value {
color: #fff;
}
}
}
:deep(.arco-statistic) {
.arco-statistic-title,
.arco-statistic-content > .arco-statistic-value {
transition: 500ms;
}
}
@for $i from 1 through 6 {
&:nth-child(#{$i}) {
:deep(.arco-statistic) .arco-statistic-value {
color: rgb(var(--arcoblue-6));
}
}
}
}
}
.title {
color: rgb(29, 33, 41);
font-size: 20px;
font-weight: 500;
line-height: 24px;
letter-spacing: 0;
text-align: left;
}
</style>

View File

@@ -1,10 +1,168 @@
<script setup>
import Filter from "../../../../components/Filter/index.vue";
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
import EditWithdrawalModal from "./components/EditWithdrawalModal.vue";
const columns = [
{
title: 'ID',
dataIndex: 'key',
},
{
title: '身份',
dataIndex: 'key',
},
{
title: '身份ID',
dataIndex: 'key',
},
{
title: '提现方式',
dataIndex: 'key',
},
{
title: '卡号',
dataIndex: 'key',
slotName: 'key',
},
{
title: '姓名',
dataIndex: 'key',
},
{
title: '身份证',
dataIndex: 'key',
},
{
title: '电话',
dataIndex: 'key',
},
{
title: '费率',
dataIndex: 'key',
},
{
title: '添加日期',
dataIndex: 'key',
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 70,
},
];
const FilterConfig = [
{
key: 'wd',
type: 'select',
label: '身份',
placeholder: '请选择身份',
api: async () => ({
data: [
{
name: '选项一',
id: 1,
},
{
name: '选项二',
id: 2,
},
{
name: '选项三',
id: 3,
},
]
}),
},
{
key: 'wd',
type: 'input',
label: '身份ID',
placeholder: '请输入身份ID',
},
{
key: 'wd',
type: 'input',
label: '身份证号',
placeholder: '请输入身份证号',
},
{
key: 'wd',
type: 'input',
label: '卡号',
placeholder: '请输入卡号',
},
{
key: 'wd',
type: 'input',
label: '电话号',
placeholder: '请输入电话号',
},
{
key: 'wd',
type: 'select',
label: '提现方式',
placeholder: '请选择提现方式',
api: async () => ({
data: [
{
name: '选项一',
id: 1,
},
{
name: '选项二',
id: 2,
},
{
name: '选项三',
id: 3,
},
]
}),
},
];
const po = reactive({
wd: null,
});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<!-- 提现信息 -->
提现信息
<a-card>
<Filter
v-model:from="po"
:config="FilterConfig">
</Filter>
<a-table
:data="vo.rows"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:loading="loading"
:columns="columns"
class="flex-grow">
<template v-slot:action>
<EditWithdrawalModal></EditWithdrawalModal>
</template>
</a-table>
</a-card>
</template>
<style scoped>

View File

@@ -0,0 +1,87 @@
<script setup>
import SequenceAdjustment from "../../../../../components/SequenceAdjustment/index.vue";
import {reactive} from "vue";
import useTableQuery from "../../../../../hooks/useTableQuery.js";
import Api from "../../../../../api/index.js";
const columns = [
{
title: 'ID',
dataIndex: 'key',
width: 120,
},
{
title: '封面',
dataIndex: 'key',
},
{
title: '跳转方式',
dataIndex: 'key',
},
{
title: '是否启用',
dataIndex: 'isA',
slotName: 'isA',
width: 100,
align: 'center',
},
{
title: '排序',
dataIndex: 'sort',
slotName: 'sort',
width: 140,
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 60,
},
];
const po = reactive({});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<a-button type="primary">
<template #icon>
<icon-plus/>
</template>
新建
</a-button>
<a-table
:loading="loading"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:data="vo.rows"
:columns="columns"
class="flex-grow mt-[20px] w-full">
<template v-slot:isA>
<a-switch></a-switch>
</template>
<template v-slot:sort>
<SequenceAdjustment></SequenceAdjustment>
</template>
<template v-slot:action>
<a-link :hoverable="false" status="danger">删除</a-link>
</template>
</a-table>
</template>
<style scoped lang="scss">
</style>

View File

@@ -0,0 +1,85 @@
<script setup>
import {reactive} from "vue";
import useTableQuery from "../../../../../hooks/useTableQuery.js";
import Api from "../../../../../api/index.js";
import SequenceAdjustment from "../../../../../components/SequenceAdjustment/index.vue";
const columns = [
{
title: 'ID',
dataIndex: 'key',
width: 120,
},
{
title: '内容',
dataIndex: 'content',
slotName: 'content',
},
{
title: '排序',
dataIndex: 'sort',
slotName: 'sort',
width: 140,
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 60,
},
];
const po = reactive({});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
const success = async (item) => {
}
</script>
<template>
<a-button type="primary">
<template #icon>
<icon-plus/>
</template>
新建
</a-button>
<a-table
:loading="loading"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:data="vo.rows"
:columns="columns"
class="flex-grow mt-[20px] w-full">
<template v-slot:content="{record}">
<a-textarea
@blur="success(record)"
v-model:model-value="record.key"
auto-size>
</a-textarea>
</template>
<template v-slot:sort>
<SequenceAdjustment></SequenceAdjustment>
</template>
<template v-slot:action>
<a-link :hoverable="false" status="danger">删除</a-link>
</template>
</a-table>
</template>
<style scoped lang="scss">
</style>

View File

@@ -0,0 +1,131 @@
<script setup>
import {reactive, ref} from "vue";
import SequenceAdjustment from "../../../../../components/SequenceAdjustment/index.vue";
import useTableQuery from "../../../../../hooks/useTableQuery.js";
import Api from "../../../../../api/index.js";
const tabs = [
{
title: '常见问题',
key: '1',
},
{
title: '基础教学',
key: '2',
},
{
title: 'banner管理',
key: '3',
},
{
title: '二级分类管理',
key: '4',
},
];
const columns = [
{
title: 'ID',
dataIndex: 'key',
width: 120,
},
{
title: '二级分类',
dataIndex: 'key',
},
{
title: '标题',
dataIndex: 'key',
},
{
title: '简介',
dataIndex: 'key',
},
{
title: '是否启用',
dataIndex: 'isA',
slotName: 'isA',
width: 100,
align: 'center',
},
{
title: '是否置顶',
dataIndex: 'isTop',
slotName: 'isTop',
width: 100,
align: 'center',
},
{
title: '排序',
dataIndex: 'sort',
slotName: 'sort',
width: 140,
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 120,
},
];
const activeKey = ref('1');
const po = reactive({});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<a-tabs v-model:active-key="activeKey" type="text">
<a-tab-pane
v-for="item in tabs"
:key="item.key"
:title="item.title">
</a-tab-pane>
</a-tabs>
<a-button type="primary">
<template #icon>
<icon-plus/>
</template>
新建
</a-button>
<a-table
:loading="loading"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:data="vo.rows"
:columns="columns"
class="flex-grow mt-[20px] w-full">
<template v-slot:isA>
<a-switch></a-switch>
</template>
<template v-slot:isTop>
<a-switch></a-switch>
</template>
<template v-slot:sort>
<SequenceAdjustment></SequenceAdjustment>
</template>
<template v-slot:action>
<div class="flex gap-[20px]">
<a-link :hoverable="false">编辑</a-link>
<a-link :hoverable="false" status="danger">删除</a-link>
</div>
</template>
</a-table>
</template>
<style scoped lang="scss">
</style>

View File

@@ -0,0 +1,87 @@
<script setup>
import SequenceAdjustment from "../../../../../components/SequenceAdjustment/index.vue";
import {reactive} from "vue";
import useTableQuery from "../../../../../hooks/useTableQuery.js";
import Api from "../../../../../api/index.js";
const columns = [
{
title: 'ID',
dataIndex: 'key',
width: 120,
},
{
title: '封面',
dataIndex: 'key',
},
{
title: '跳转方式',
dataIndex: 'key',
},
{
title: '是否启用',
dataIndex: 'isA',
slotName: 'isA',
width: 100,
align: 'center',
},
{
title: '排序',
dataIndex: 'sort',
slotName: 'sort',
width: 140,
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 60,
},
];
const po = reactive({});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<a-button type="primary">
<template #icon>
<icon-plus/>
</template>
新建
</a-button>
<a-table
:loading="loading"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:data="vo.rows"
:columns="columns"
class="flex-grow mt-[20px] w-full">
<template v-slot:isA>
<a-switch></a-switch>
</template>
<template v-slot:sort>
<SequenceAdjustment></SequenceAdjustment>
</template>
<template v-slot:action>
<a-link :hoverable="false" status="danger">删除</a-link>
</template>
</a-table>
</template>
<style scoped lang="scss">
</style>

View File

@@ -0,0 +1,108 @@
<script setup>
import {reactive} from "vue";
import useTableQuery from "../../../../../hooks/useTableQuery.js";
import Api from "../../../../../api/index.js";
import SequenceAdjustment from "../../../../../components/SequenceAdjustment/index.vue";
const columns = [
{
title: 'ID',
dataIndex: 'key',
width: 120,
},
{
title: '标题',
dataIndex: 'key',
},
{
title: '简介',
dataIndex: 'key',
},
{
title: '跳转方式',
dataIndex: 'key',
},
{
title: '发布时间',
dataIndex: 'key',
},
{
title: '是否启用',
dataIndex: 'isA',
slotName: 'isA',
width: 100,
align: 'center',
},
{
title: '是否置顶',
dataIndex: 'isTop',
slotName: 'isTop',
width: 100,
align: 'center',
},
{
title: '排序',
dataIndex: 'sort',
slotName: 'sort',
width: 140,
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 120,
},
];
const po = reactive({});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<a-button type="primary">
<template #icon>
<icon-plus/>
</template>
新建
</a-button>
<a-table
:loading="loading"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:data="vo.rows"
:columns="columns"
class="flex-grow mt-[20px] w-full">
<template v-slot:isA>
<a-switch></a-switch>
</template>
<template v-slot:isTop>
<a-switch></a-switch>
</template>
<template v-slot:sort>
<SequenceAdjustment></SequenceAdjustment>
</template>
<template v-slot:action>
<div class="flex gap-[20px]">
<a-link :hoverable="false">编辑</a-link>
<a-link :hoverable="false" status="danger">删除</a-link>
</div>
</template>
</a-table>
</template>
<style scoped lang="scss">
</style>

View File

@@ -0,0 +1,69 @@
<script setup>
import {reactive} from "vue";
import useTableQuery from "../../../../../hooks/useTableQuery.js";
import Api from "../../../../../api/index.js";
const columns = [
{
title: 'ID',
dataIndex: 'key',
width: 100,
},
{
title: '位置',
dataIndex: 'key',
},
{
title: '二维码',
dataIndex: 'qrcode',
slotName: 'qrcode',
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 60,
},
];
const po = reactive({});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<a-table
:loading="loading"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:data="vo.rows"
:columns="columns"
class="flex-grow mt-[20px] w-full">
<template v-slot:qrcode>
<a-image
width="48px"
height="48px"
src="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp">
</a-image>
</template>
<template v-slot:action>
<a-link :hoverable="false">编辑</a-link>
</template>
</a-table>
</template>
<style scoped lang="scss">
</style>

View File

@@ -0,0 +1,76 @@
<script setup>
import TinyMCEModal from "../../../../../components/TinyMCE/modal.vue";
import {reactive} from "vue";
import useTableQuery from "../../../../../hooks/useTableQuery.js";
import Api from "../../../../../api/index.js";
const columns = [
{
title: 'ID',
dataIndex: 'key',
width: 120,
},
{
title: '标题',
dataIndex: 'key',
},
{
title: '预览',
dataIndex: 'preview',
slotName: 'preview',
width: 100,
},
{
title: '操作',
dataIndex: 'action',
slotName: 'action',
width: 120,
},
];
const po = reactive({});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<a-button type="primary">
<template #icon>
<icon-plus/>
</template>
新建
</a-button>
<a-table
:loading="loading"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:data="vo.rows"
:columns="columns"
class="flex-grow mt-[20px] w-full">
<template v-slot:preview>
<a-link :hoverable="false"><icon-eye />预览</a-link>
</template>
<template v-slot:action>
<div class="flex gap-[20px]">
<TinyMCEModal></TinyMCEModal>
<a-link :hoverable="false" status="danger">删除</a-link>
</div>
</template>
</a-table>
</template>
<style scoped lang="scss">
</style>

View File

@@ -1,12 +1,90 @@
<script setup>
import {defineAsyncComponent} from "vue";
// 懒加载组件
const HomepageBannerMessage = defineAsyncComponent(() => import('./components/HomepageBannerMessage.vue'));
const PlatformNews = defineAsyncComponent(() => import('./components/PlatformNews.vue'));
const HomeBanner = defineAsyncComponent(() => import('./components/HomeBanner.vue'));
const PersonalCenterBanner = defineAsyncComponent(() => import('./components/PersonalCenterBanner.vue'));
const QRCode = defineAsyncComponent(() => import('./components/QRCode.vue'));
const NoviceTeaching = defineAsyncComponent(() => import('./components/NoviceTeaching.vue'));
const RichTextContentLibrary = defineAsyncComponent(() => import('./components/RichTextContentLibrary.vue'));
const tabs = [
{
key: '1',
title: '首页横幅消息',
component: HomepageBannerMessage,
},
{
key: '2',
title: '平台消息',
component: PlatformNews,
},
{
key: '3',
title: '首页banner',
component: HomeBanner,
},
{
key: '4',
title: '个人中心banner',
component: PersonalCenterBanner,
},
{
key: '5',
title: '二维码',
component: QRCode,
},
{
key: '6',
title: '新手教学',
component: NoviceTeaching,
},
{
key: '7',
title: '富文本内容库',
component: RichTextContentLibrary,
},
];
</script>
<template>
<!-- 达人端物料 -->
达人端物料
<a-card>
<div class="title">
达人端物料
</div>
<a-tabs
:justify="true"
:destroy-on-hide="true"
type="rounded">
<a-tab-pane v-for="item in tabs" :key="item.key" :title="item.title">
<Suspense>
<template #default>
<div class="h-full flex flex-col items-start">
<component :is="item.component"></component>
</div>
</template>
<template #fallback>
加载中...
</template>
</Suspense>
</a-tab-pane>
</a-tabs>
</a-card>
</template>
<style scoped>
<style lang="scss" scoped>
.title {
color: rgb(29, 33, 41);
font-size: 20px;
font-weight: 500;
line-height: 28px;
letter-spacing: 0;
text-align: left;
margin-bottom: 16px;
}
</style>

View File

@@ -1,12 +1,102 @@
<script setup>
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
import SequenceAdjustment from "../../../../components/SequenceAdjustment/index.vue";
const columns = [
{
title: '任务编号',
dataIndex: 'key',
},
{
title: '任务名称',
dataIndex: 'key',
},
{
title: '发布渠道',
dataIndex: 'key',
},
{
title: '创建时间',
dataIndex: 'key',
},
{
title: '子任务数',
dataIndex: 'key',
},
{
title: '子任务报价',
dataIndex: 'key',
},
{
title: '商家ID',
dataIndex: 'key',
},
{
title: '平台报价',
dataIndex: 'key',
},
{
title: '是否置顶',
dataIndex: 'topUp',
slotName: 'topUp',
width: 100,
align: 'center',
},
{
title: '排序',
dataIndex: 'action',
slotName: 'action',
width: 130,
},
];
const po = reactive({});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<!-- 任务排序 -->
任务排序
<a-card>
<div class="title">任务排序</div>
<a-table
:loading="loading"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:data="vo.rows"
:columns="columns"
class="flex-grow">
<template v-slot:topUp>
<a-switch></a-switch>
</template>
<template v-slot:action>
<SequenceAdjustment></SequenceAdjustment>
</template>
</a-table>
</a-card>
</template>
<style scoped>
<style lang="scss" scoped>
.title {
color: rgb(29, 33, 41);
font-size: 20px;
font-weight: 500;
line-height: 28px;
letter-spacing: 0;
text-align: left;
margin-bottom: 16px;
}
</style>

View File

@@ -1,12 +1,100 @@
<script setup>
import {reactive} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js";
const columns = [
{
title: 'ID',
dataIndex: 'key',
width: 120,
},
{
title: '达人ID',
dataIndex: 'key',
width: 120,
},
{
title: '投诉截图',
dataIndex: 'key',
},
{
title: '投诉内容',
dataIndex: 'key',
},
{
title: '联系方式',
dataIndex: 'key',
width: 150,
},
{
title: '状态',
dataIndex: 'action',
slotName: 'action',
width: 120,
},
];
const po = reactive({});
const vo = reactive({
page: '',
rows: [],
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
parameter: po,
api: Api.system.getData,
callback: (data) => {
Object.assign(vo, data);
}
});
</script>
<template>
<!-- 团队投诉 -->
团队投诉
<a-card>
<div class="title">
团队投诉
</div>
<div class="flex gap-[16px] mb-[16px]">
<a-button type="primary">
<template #icon>
<icon-check/>
</template>
批量已处理
</a-button>
<a-button type="primary">
<template #icon>
<icon-clock-circle/>
</template>
批量已处理
</a-button>
</div>
<a-table
:loading="loading"
@page-change="(e) => pagination.current = e"
:pagination="pagination"
:data="vo.rows"
:columns="columns"
class="flex-grow">
<template v-slot:action>
</template>
</a-table>
</a-card>
</template>
<style scoped>
<style lang="scss" scoped>
.title {
color: rgb(29, 33, 41);
font-size: 20px;
font-weight: 500;
line-height: 28px;
letter-spacing: 0;
text-align: left;
margin-bottom: 16px;
}
</style>