yujialong 10 months ago
parent 2350694630
commit 8ee0664347
  1. 4
      .env
  2. 1
      src/api/finance.ts
  3. 34
      src/views/Role.vue
  4. 5
      src/views/finance/Bank.vue
  5. 78
      src/views/finance/Fund.vue
  6. 6
      src/views/finance/Insurance.vue
  7. 6
      src/views/product/bank/CardList.vue
  8. 4
      src/views/product/bank/List.vue
  9. 10
      src/views/product/fund/CardList.vue
  10. 4
      src/views/product/fund/List.vue
  11. 11
      src/views/product/insurance/CardList.vue
  12. 7
      src/views/product/insurance/List.vue

@ -2,7 +2,7 @@ VITE_APP_TITLE=金融产品设计及数字化营销沙盘
VITE_PORT=9520
VITE_PROXY=http://192.168.31.125:8080
VITE_PUBLIC_PATH=./
VITE_BASE_API=http://192.168.31.217:9000
# VITE_BASE_API=http://121.37.12.51
# VITE_BASE_API=http://192.168.31.217:9000
VITE_BASE_API=http://121.37.12.51
VITE_I18N_LOCALE=zh-cn
VITE_I18N_FALLBACK_LOCALE=zh-cn

@ -4,3 +4,4 @@ export const queryStorage = async (id: number): Promise<any> => (await axios.get
export const bankingProductMarketsList = async (data: Record<string, any>): Promise<any> =>
(await axios.post('/product/product/bank/products/market/bankingProductMarketsList', data)).data;
export const insuranceMarketList = async (data: Record<string, any>): Promise<any> => (await axios.post('/product/insurance/products/market/insuranceMarketList', data)).data;
export const fundProductMarketList = async (data: Record<string, any>): Promise<any> => (await axios.post('/product/fundProducts/market/fundProductMarketList', data)).data;

@ -59,8 +59,8 @@
</el-tooltip>
</div>
</div>
<div class="relative h-[calc(100vh-15px)] overflow-auto bg-[#e5eafe]">
<img class="w-full"
<div class="relative h-[calc(100vh-64px)] overflow-hidden bg-[#e5eafe]">
<img class="w-full h-full"
src="@/assets/images/role/bg.png"
alt="">
<div class="absolute top-5 left-[18px] w-[204px] h-[68px] bg-[url('@/assets/images/role/2.png')] bg-[length:100%_100%] bg-no-repeat"></div>
@ -68,22 +68,22 @@
<div class="date absolute top-[70px] left-[54%] w-[198px] h-[46px] pt-[10px] pl-[56px] text-base text-white bg-[url('@/assets/images/role/date.png')] bg-no-repeat transition">
{{ date }}
</div>
<div class="role top-[35%] left-[17%] xl:top-[31%] lg:top-[32%] lg:left-[15%] bg-[url('@/assets/images/role/product.png')] hover:bg-[url('@/assets/images/role/product1.png')]"
@click="selecRole(41)"></div>
<div class="role top-[26%] left-[24%] xl:top-[24%] lg:top-[25%] lg:left-[23%] bg-[url('@/assets/images/role/committee.png')] hover:bg-[url('@/assets/images/role/committee1.png')]"
@click="selecRole(43)"></div>
<div class="role top-[30%] left-[17%] xl:top-[31%] lg:top-[32%] lg:left-[15%] bg-[url('@/assets/images/role/product.png')] hover:bg-[url('@/assets/images/role/product1.png')]"
@click="selectRole(41)"></div>
<div class="role top-[22%] left-[25%] xl:top-[24%] lg:top-[25%] lg:left-[23%] bg-[url('@/assets/images/role/committee.png')] hover:bg-[url('@/assets/images/role/committee1.png')]"
@click="selectRole(43)"></div>
<div class="role top-[17%] left-[31.5%] xl:top-[16%] xl:left-[31%] lg:left-[30%] bg-[url('@/assets/images/role/riskControl.png')] hover:bg-[url('@/assets/images/role/riskControl1.png')]"
@click="selecRole(42)"></div>
<div class="role bottom-[100px] left-[100px] xl:bottom-[150px] lg:bottom-[120px] lg1:bottom-[20px] bg-[url('@/assets/images/role/insurance.png')] hover:bg-[url('@/assets/images/role/insurance1.png')]"
@click="selecRole(275)"></div>
@click="selectRole(42)"></div>
<div class="role bottom-[200px] left-[100px] xl:bottom-[150px] lg:bottom-[120px] lg1:bottom-[20px] bg-[url('@/assets/images/role/insurance.png')] hover:bg-[url('@/assets/images/role/insurance1.png')]"
@click="selectRole(275)"></div>
<div class="role relative bottom-[70px] left-[25%] bg-[url('@/assets/images/role/fund.png')] hover:bg-[url('@/assets/images/role/fund1.png')]"
@click="selecRole(1161)"></div>
<!-- <div class="role relative bottom-[255px] left-[41%] bg-[url('@/assets/images/role/market-bank.png')] hover:bg-[url('@/assets/images/role/market-bank1.png')]"
@click="selecRole('bank')"></div>
<div class="role relative bottom-[420px] left-[52%] bg-[url('@/assets/images/role/market-insurance.png')] hover:bg-[url('@/assets/images/role/market-insurance1.png')]"
@click="selecRole('insurance')"></div>
<div class="role relative bottom-[560px] left-[63%] bg-[url('@/assets/images/role/market-fund.png')] hover:bg-[url('@/assets/images/role/market-fund1.png')]"
@click="selecRole('fund')"></div> -->
@click="selectRole(1161)"></div>
<div class="role relative bottom-[220px] left-[41%] bg-[url('@/assets/images/role/market-bank.png')] hover:bg-[url('@/assets/images/role/market-bank1.png')]"
@click="selectRole('bank')"></div>
<div class="role relative bottom-[360px] left-[52%] bg-[url('@/assets/images/role/market-insurance.png')] hover:bg-[url('@/assets/images/role/market-insurance1.png')]"
@click="selectRole('insurance')"></div>
<div class="role relative bottom-[490px] left-[63%] bg-[url('@/assets/images/role/market-fund.png')] hover:bg-[url('@/assets/images/role/market-fund1.png')]"
@click="selectRole('fund')"></div>
</div>
<!-- <div class="fixed top-[80px] right-[80px]">
<div class="flex items-center h-[60px] px-4 rounded-tl-[20px] rounded-tr-[20px]"
@ -234,7 +234,7 @@ const getLevel = async () => {
levels.value = data;
};
//
const selecRole = (id: number) => {
const selectRole = (id: number) => {
let path = `/product/bank?type=0&i=1&role=${id}`;
if (id === 275) {
path = `/product/insurance`;

@ -42,6 +42,7 @@
<div class="block mt-3">
<div class="search mb-2">
<input type="text"
v-model="params.keyWord"
placeholder="搜索"
maxlength="20" />
<img src="@/assets/images/search.png"
@ -75,14 +76,14 @@
<el-table-column prop="operationTime"
label="发布日期"
min-width="80"></el-table-column>
<el-table-column prop="id"
<!-- <el-table-column prop="id"
label="操作"
width="100">
<template #default="{ row }">
<el-button type="text"
size="small"
@click="toDetail(row)">查看详情</el-button>
</template></el-table-column>
</template></el-table-column> -->
</el-table>
<el-pagination v-model:currentPage="currentPage"
v-model:pageSize="pageSize"

@ -1,14 +1,14 @@
<template>
<div>
<h6 class="pl-3 mb-4 text-lg font-semibold text-[#333] border-l-[5px] border-l-[#006BFF]">保险市场</h6>
<h6 class="pl-3 mb-4 text-lg font-semibold text-[#333] border-l-[5px] border-l-[#006BFF]">基金市场</h6>
<div class="filter block">
<dl>
<dt>申购费率</dt>
<div class="vals">
<dd v-for="(item, i) in rates"
:key="i"
:class="{ active: params.insuranceType === item.id }"
@click="filterClick(item, 'insuranceType')">{{ item.name }}</dd>
:class="{ active: params.subscriptionRate === item.name }"
@click="filterClick(item, 'subscriptionRate')">{{ item.name }}</dd>
</div>
</dl>
<dl>
@ -16,8 +16,8 @@
<div class="vals">
<dd v-for="(item, i) in times"
:key="i"
:class="{ active: params.guarantyStyleId === item.id }"
@click="filterClick(item, 'guarantyStyleId')">{{ item.name }}</dd>
:class="{ active: params.establishmentPeriod === item.name }"
@click="filterClick(item, 'establishmentPeriod')">{{ item.name }}</dd>
</div>
</dl>
<dl>
@ -25,14 +25,15 @@
<div class="vals">
<dd v-for="(item, i) in scales"
:key="i"
:class="{ active: params.loanPeriod === item.name }"
@click="filterClick(item, 'loanPeriod')">{{ item.name }}</dd>
:class="{ active: params.fundraisingScale === item.name }"
@click="filterClick(item, 'fundraisingScale')">{{ item.name }}</dd>
</div>
</dl>
</div>
<div class="block mt-3">
<div class="search mb-2">
<input type="text"
v-model="params.fundName"
placeholder="搜索"
maxlength="20" />
<img src="@/assets/images/search.png"
@ -42,47 +43,47 @@
<el-table ref="table"
v-loading="loading"
:data="list">
<el-table-column prop="productName"
<el-table-column prop="fundCode"
label="基金代码"
min-width="80"></el-table-column>
<el-table-column prop="productTypeText"
<el-table-column prop="fundName"
label="基金名称"
min-width="110"></el-table-column>
<el-table-column prop="guarantyStyle"
<el-table-column prop="dailyNetAssetValue"
label="现净值"
min-width="80"></el-table-column>
<el-table-column prop="loanPeriod"
<el-table-column prop="dailyGrowthRate"
label="日增长率(%)"
min-width="80"></el-table-column>
<el-table-column prop="loanLimit"
<el-table-column prop="weeklyGrowthRate"
label="近1周(%)"
min-width="80"></el-table-column>
<el-table-column prop="userName"
<el-table-column prop="monthlyGrowthRate"
label="近1月(%)"
min-width="80"></el-table-column>
<el-table-column prop="userName"
<el-table-column prop="growthRateInRecentMarch"
label="近3月(%)"
min-width="80"></el-table-column>
<el-table-column prop="userName"
<el-table-column prop="growthRateSinceInception"
label="成立来(%)"
min-width="80"></el-table-column>
<el-table-column prop="userName"
<el-table-column prop="fundraisingScale"
label="基金规模(万元)"
min-width="80"></el-table-column>
<el-table-column prop="operationTime"
<el-table-column prop="userName"
label="产品经理"
min-width="80"></el-table-column>
<el-table-column prop="operationTime"
label="发布日期"
min-width="80"></el-table-column>
<el-table-column prop="id"
<!-- <el-table-column prop="id"
label="操作"
width="100">
<template #default="{ row }">
<el-button type="text"
size="small"
@click="toDetail(row)">查看详情</el-button>
</template></el-table-column>
</template></el-table-column> -->
</el-table>
<el-pagination v-model:currentPage="currentPage"
v-model:pageSize="pageSize"
@ -102,7 +103,7 @@
import { onMounted, ref, reactive, watch } from 'vue';
import { ElMessage } from 'element-plus';
import { pageSizes, pageLayout, toParams } from '@/utils/common';
import { fundProductList, batchDeletion } from '@/api/fund';
import { fundProductMarketList } from '@/api/finance';
import { useRouter, useRoute } from 'vue-router';
import Cookies from 'js-cookie';
@ -111,7 +112,9 @@ const route = useRoute();
const projectId = +Cookies.get('sand-projectId');
const levelId = +Cookies.get('sand-level');
const params = reactive({
createDateSort: '',
establishmentPeriod: '不限',
fundraisingScale: '不限',
subscriptionRate: '不限',
fundName: '',
checkPointId: levelId,
projectId,
@ -122,75 +125,60 @@ const total = ref<number>(0);
const table = ref<any>();
const rates = ref<Record<string, any>[]>([
{
id: '',
name: '不限',
},
{
id: 1,
name: '0',
},
{
id: 2,
name: '0-0.5%',
},
{
id: 3,
name: '>0.5%',
},
]);
const times = ref<Record<string, any>[]>([
{
id: '',
name: '不限',
},
{
id: 1,
name: '<=1个月',
},
{
id: 2,
name: '1-6个月',
},
{
id: 3,
name: '6个月-1年',
},
{
id: 4,
name: '>1年',
},
]);
const scales = ref<Record<string, any>[]>([
{
id: '',
name: '不限',
},
{
id: 1,
name: '<=300万',
},
{
id: 2,
name: '300-500万',
},
{
id: 3,
name: '500-1000万',
},
{
id: 4,
name: '>1000万',
},
]);
const list = ref<Record<string, any>[]>([]);
const loading = ref<boolean>(false);
const stop = () => {};
//
const getList = async () => {
loading.value = true;
try {
const { data } = await fundProductList({ pageNum: currentPage.value, pageSize: pageSize.value, ...toParams(params) });
const { data } = await fundProductMarketList({ pageNum: currentPage.value, pageSize: pageSize.value, ...toParams(params) });
list.value = data.data.records;
total.value = data.data.total;
} finally {
@ -207,9 +195,9 @@ onMounted(() => {
});
watch([params, () => route.query], initList);
const handleSort = ({ column, prop, order }: { column: any; prop: string; order: string }) => {
params.createDateSort = order === 'descending' ? 'desc' : order === 'ascending' ? 'asc' : '';
getList();
//
const filterClick = (item: Record<string, any>, key: string) => {
params[key] = item.name;
};
//
const toAdd = () => {
@ -221,16 +209,6 @@ const toAdd = () => {
const toDetail = async (path: string, id: number) => {
router.push(`${path}?id=${id}&name=${params.fundName}`);
};
//
const toCardList = () => {
router.push(`/product/fund/${list.value.length ? `detail?id=${list.value[0].id}&name=${params.fundName}` : `add?name=${params.fundName}`}`);
};
const handleDelete = async (id: number) => {
await batchDeletion([id]);
getList();
ElMessage.success('删除成功!');
};
</script>
<style lang="scss" scoped>
.filter {

@ -21,7 +21,7 @@
</div>
</dl>
<dl>
<dt>期限</dt>
<dt>期限</dt>
<div class="vals">
<dd v-for="(item, i) in times"
:key="i"
@ -46,7 +46,7 @@
<el-table-column prop="insuranceName"
label="保险名称"
min-width="110"></el-table-column>
<el-table-column prop="insuranceTypeName"
<el-table-column prop="insuranceTypeText"
label="险种分类"
min-width="80"></el-table-column>
<el-table-column v-if="params.insuranceType !== 311"
@ -55,7 +55,7 @@
min-width="80">
<template #default="{ row }">
{{ row.minimumAge + '-' + row.maximumAge + '周岁' }}
{{ row.minimumAge ? row.minimumAge + '-' + row.maximumAge + '周岁' : '-' }}
</template>
</el-table-column>
<el-table-column prop="insuranceDeadline"

@ -69,7 +69,6 @@ import Cookies from 'js-cookie';
const router = useRouter();
const route = useRoute();
const action = ref<any>('');
const name = route.query.name ?? '';
const projectId = +Cookies.get('sand-projectId');
const levelId = +Cookies.get('sand-level');
@ -91,7 +90,10 @@ const getList = async (refresh?: number) => {
checkPointId: levelId,
projectId,
roleId: route.query.role,
keyWord: name,
keyWord: route.query.name ?? '',
createDateSort: route.query.createDateSort ?? '',
guarantyStyleId: route.query.guarantyStyleId ?? '',
status: route.query.status ?? '',
});
list.value = data.message.records;
((route.path !== '/product/bank/add' && list.value.length && !id.value) || refresh) && switchProduct(list.value[0], refresh);

@ -229,7 +229,9 @@ const toCardList = () => {
const row = list.value[0];
path = `/product/bank/${row.showElementsOrNot ? 'add' : row.showRiskControlOrNot ? 'config' : row.showApprovalOrNot ? 'approve' : 'detail'}`;
}
router.push(`${path}?type=${params.productType}&i=${route.query.i}&role=${route.query.role}&name=${params.keyWord}`);
router.push(
`${path}?type=${params.productType}&i=${route.query.i}&role=${route.query.role}&name=${params.keyWord}&guarantyStyleId=${params.guarantyStyleId}&status=${params.status}&createDateSort=${params.createDateSort}`,
);
};
const handleDelete = async (id: number) => {

@ -58,7 +58,6 @@ import Cookies from 'js-cookie';
const router = useRouter();
const route = useRoute();
const action = ref<any>('');
const name = route.query.name ?? '';
const projectId = +Cookies.get('sand-projectId');
const levelId = +Cookies.get('sand-level');
@ -69,7 +68,14 @@ const id = computed(() => +route.query.id);
const getList = async (refresh?: number) => {
loading.value = true;
try {
const { data } = await fundProductList({ pageNum: 1, pageSize: 1000, checkPointId: levelId, projectId, fundName: name });
const { data } = await fundProductList({
pageNum: 1,
pageSize: 1000,
checkPointId: levelId,
projectId,
fundName: route.query.name ?? '',
createDateSort: route.query.createDateSort ?? '',
});
list.value = data.data.records;
refresh && list.value.length && switchProduct(list.value[0].id);
} finally {

@ -100,7 +100,6 @@ const table = ref<any>();
const list = ref<Record<string, any>[]>([]);
const loading = ref<boolean>(false);
const stop = () => {};
//
const getList = async () => {
loading.value = true;
@ -124,7 +123,6 @@ onMounted(() => {
watch([params, () => route.query], initList);
const handleSort = ({ column, prop, order }: { column: any; prop: string; order: string }) => {
params.createDateSort = order === 'descending' ? 'desc' : order === 'ascending' ? 'asc' : '';
getList();
};
//
const toAdd = () => {
@ -138,7 +136,7 @@ const toDetail = async (path: string, id: number) => {
};
//
const toCardList = () => {
router.push(`/product/fund/${list.value.length ? `detail?id=${list.value[0].id}&name=${params.fundName}` : `add?name=${params.fundName}`}`);
router.push(`/product/fund/${list.value.length ? `detail?id=${list.value[0].id}&` : `add?`}name=${params.fundName}&createDateSort=${params.createDateSort}`);
};
const handleDelete = async (id: number) => {

@ -60,7 +60,6 @@ import Cookies from 'js-cookie';
const router = useRouter();
const route = useRoute();
const action = ref<any>('');
const name = route.query.name ?? '';
const projectId = +Cookies.get('sand-projectId');
const levelId = +Cookies.get('sand-level');
@ -71,7 +70,15 @@ const id = computed(() => +route.query.id);
const getList = async (first: any) => {
loading.value = true;
try {
const { data } = await insuranceList({ pageNum: 1, pageSize: 1000, checkPointId: levelId, projectId, insuranceName: name });
const { data } = await insuranceList({
pageNum: 1,
pageSize: 1000,
checkPointId: levelId,
projectId,
insuranceName: route.query.name ?? '',
createDateSort: route.query.createDateSort ?? '',
insuranceType: route.query.insuranceType ?? '',
});
list.value = data.records;
first && list.value.length && switchProduct(list.value[0].insuranceId);
} finally {

@ -162,7 +162,6 @@ onMounted(() => {
watch([params, () => route.query], initList);
const handleSort = ({ column, prop, order }: { column: any; prop: string; order: string }) => {
params.createDateSort = order === 'descending' ? 'desc' : order === 'ascending' ? 'asc' : '';
getList();
};
//
const toAdd = () => {
@ -176,7 +175,11 @@ const toDetail = async (path: string, id: number) => {
};
//
const toCardList = () => {
router.push(`/product/insurance/${list.value.length ? `detail?id=${list.value[0].insuranceId}&name=${params.insuranceName}` : `add?name=${params.insuranceName}`}`);
router.push(
`/product/insurance/${list.value.length ? `detail?id=${list.value[0].insuranceId}&` : `add?`}name=${params.insuranceName}&insuranceType=${
params.insuranceType
}&createDateSort=${params.createDateSort}`,
);
};
const handleDelete = async (id: number) => {

Loading…
Cancel
Save