feat: 添加同步按钮到合约品种和风控模板页面

This commit is contained in:
2026-05-26 14:50:56 +08:00
parent 71c241585a
commit 681c5e12dd
6 changed files with 112 additions and 13 deletions

View File

@ -12,3 +12,8 @@ export const addRiskApi = (params: any) => {
export const editRiskApi = (params: any) => { export const editRiskApi = (params: any) => {
return request.post('/riskControl/editRiskControlSetting', params) return request.post('/riskControl/editRiskControlSetting', params)
} }
//同步风控模板
export const syncRiskControlApi = () => {
return request.post('/riskControl/syncRiskControlSetting', {})
}

View File

@ -17,4 +17,9 @@ export async function createVarietyApi(params: any): Promise<any> {
//编辑合约品种 //编辑合约品种
export async function editVarietyApi(params: any): Promise<any> { export async function editVarietyApi(params: any): Promise<any> {
return request.post<any>('/contractVariety/editVariety', {...params}) return request.post<any>('/contractVariety/editVariety', {...params})
}
//同步合约品种
export async function syncVarietyApi(): Promise<any> {
return request.post<any>('/contractVariety/syncVariety', {})
} }

View File

@ -4,26 +4,26 @@
<div class="header-left"> <div class="header-left">
<div class="logo-section"> <div class="logo-section">
<img src="@/assets/images/logo.webp" alt="logo" class="logo-img" /> <img src="@/assets/images/logo.webp" alt="logo" class="logo-img" />
<span class="system-name">Admin System</span> <span class="system-name" v-if="!isSmallScreen">Admin System</span>
</div> </div>
</div> </div>
<!-- 菜单收缩按钮 - 在标题右边 --> <!-- 菜单收缩按钮 - 在标题右边仅在大屏幕显示 -->
<el-button <el-button
v-if="!isSmallScreen"
class="collapse-btn" class="collapse-btn"
:icon="sidebarCollapsed ? Expand : Fold" :icon="sidebarCollapsed ? Expand : Fold"
@click="toggleSidebar" @click="toggleSidebar"
text text
/> />
<!-- 中间面包屑导航和搜索框 --> <!-- 中间面包屑导航和搜索框仅在大屏幕显示 -->
<div class="header-center"> <div v-if="!isSmallScreen" class="header-center">
<Breadcrumb /> <Breadcrumb />
</div> </div>
<!-- 右侧功能按钮和用户信息 --> <!-- 右侧功能按钮和用户信息 -->
<div class="header-right"> <div class="header-right">
<!-- 菜单搜索 --> <!-- 菜单搜索 -->
<div class="menu-search-wrapper"> <div class="menu-search-wrapper" :class="{ 'is-small': isSmallScreen }">
<el-input <el-input
v-model="searchQuery" v-model="searchQuery"
placeholder="搜索菜单..." placeholder="搜索菜单..."
@ -67,7 +67,8 @@
</el-tooltip> </el-tooltip>
<!-- 语言选择 --> <!-- 语言选择 -->
<LanguageSelect v-model="languageStore.lang" @change="languageStore.changeLang" /> <LanguageSelect v-model="languageStore.lang"
v-if="!isSmallScreen" @change="languageStore.changeLang" />
<!-- 用户信息下拉菜单 --> <!-- 用户信息下拉菜单 -->
<el-dropdown @command="handleCommand" class="user-dropdown"> <el-dropdown @command="handleCommand" class="user-dropdown">
@ -100,7 +101,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, ref } from 'vue' import { computed, ref, onMounted, onUnmounted } from 'vue'
import { import {
FullScreen, FullScreen,
Crop, Crop,
@ -118,6 +119,10 @@ import LanguageSelect from '@/components/LanguageSelect/index.vue'
import Breadcrumb from './Breadcrumb.vue' import Breadcrumb from './Breadcrumb.vue'
import { getStorage } from '@/utils/storage' import { getStorage } from '@/utils/storage'
defineProps<{
isSmallScreen?: boolean
}>()
const emit = defineEmits(['toggle-sidebar']) const emit = defineEmits(['toggle-sidebar'])
const router = useRouter() const router = useRouter()
@ -366,7 +371,7 @@ const handleLogout = () => {
.menu-search-input { .menu-search-input {
width: 180px; width: 180px;
transition: width 0.3s ease; transition: none;
&:hover, &:hover,
&:focus-within { &:focus-within {
@ -379,6 +384,18 @@ const handleLogout = () => {
} }
} }
//
&.is-small {
.menu-search-input {
width: 120px;
&:hover,
&:focus-within {
width: 140px;
}
}
}
.search-results-dropdown { .search-results-dropdown {
position: absolute; position: absolute;
top: calc(100% + 4px); top: calc(100% + 4px);

View File

@ -1,7 +1,7 @@
<template> <template>
<section class="layout"> <section class="layout">
<!-- 顶部导航栏固定在顶部 --> <!-- 顶部导航栏固定在顶部 -->
<Header @toggle-sidebar="handleToggleSidebar" /> <Header :isSmallScreen="screenWidth < COLLAPSE_BREAKPOINT" @toggle-sidebar="handleToggleSidebar" />
<!-- 主体内容区域 --> <!-- 主体内容区域 -->
<section class="main-container" :class="{ 'is-collapsed': sidebarCollapsed }"> <section class="main-container" :class="{ 'is-collapsed': sidebarCollapsed }">
@ -61,6 +61,33 @@ const refreshKey = computed(() => {
// //
const sidebarCollapsed = ref(false) const sidebarCollapsed = ref(false)
//
const screenWidth = ref(window.innerWidth)
// px
const COLLAPSE_BREAKPOINT = 992
//
const handleResize = () => {
screenWidth.value = window.innerWidth
//
if (screenWidth.value < COLLAPSE_BREAKPOINT) {
sidebarCollapsed.value = true
}else {
sidebarCollapsed.value = false
}
}
onMounted(() => {
//
handleResize()
window.addEventListener('resize', handleResize)
})
onUnmounted(() => {
window.removeEventListener('resize', handleResize)
})
// //
const handleToggleSidebar = (collapsed: boolean) => { const handleToggleSidebar = (collapsed: boolean) => {
sidebarCollapsed.value = collapsed sidebarCollapsed.value = collapsed
@ -104,6 +131,19 @@ const handleToggleSidebar = (collapsed: boolean) => {
} }
} }
//
@media screen and (max-width: 992px) {
.layout {
.main-container {
&.is-collapsed {
.content-container {
margin-left: 64px;
}
}
}
}
}
// //
.fade-transform-enter-active, .fade-transform-enter-active,
.fade-transform-leave-active { .fade-transform-leave-active {

View File

@ -8,6 +8,9 @@
v-auth="'riskControl_editRiskControlSetting'">停用</el-button> v-auth="'riskControl_editRiskControlSetting'">停用</el-button>
<el-button type="primary" @click="handleChangeStatus(1)" <el-button type="primary" @click="handleChangeStatus(1)"
v-auth="'riskControl_editRiskControlSetting'">启用</el-button> v-auth="'riskControl_editRiskControlSetting'">启用</el-button>
<el-button type="primary" :loading="syncLoading" @click="handleSyncRiskControl()" v-auth="'riskControl_editRiskControlSetting'">
同步风控模板
</el-button>
</div> </div>
<!-- 表格 --> <!-- 表格 -->
<div class="risk-table-content"> <div class="risk-table-content">
@ -45,12 +48,14 @@ import RiskTableSwitch from '@/components/common/Table.vue'
import RiskTableContent from '@/components/common/Table.vue' import RiskTableContent from '@/components/common/Table.vue'
import RiskDialog from '@/components/common/Dialog.vue' import RiskDialog from '@/components/common/Dialog.vue'
import RiskForm from '@/components/common/Form.vue' import RiskForm from '@/components/common/Form.vue'
import { ElMessage } from 'element-plus'
// //
import { tableColumnsSwitch, tableColumnsContent, formItem } from './options' import { tableColumnsSwitch, tableColumnsContent, formItem } from './options'
import { rules } from './rules' import { rules } from './rules'
// //
import { getRiskListApi, addRiskApi, editRiskApi } from '@/api/modules/risk' import { getRiskListApi, addRiskApi, editRiskApi, syncRiskControlApi } from '@/api/modules/risk'
// //
@ -184,6 +189,17 @@ onMounted(() => {
getRiskList() getRiskList()
}) })
//
const syncLoading = ref(false)
const handleSyncRiskControl = async () => {
syncLoading.value = true
try {
await syncRiskControlApi()
} finally {
syncLoading.value = false
}
}
/** /**
* @description: 定义bar方法 * @description: 定义bar方法
*/ */

View File

@ -10,6 +10,9 @@
<el-button type="primary" @click="handleAdd()" v-auth="'contractVariety_createVariety'"> <el-button type="primary" @click="handleAdd()" v-auth="'contractVariety_createVariety'">
添加 添加
</el-button> </el-button>
<el-button type="primary" :loading="syncLoading" @click="handleSyncVariety()" v-auth="'contractVariety_createVariety'">
同步合约品种
</el-button>
</template> </template>
</VarietySearch> </VarietySearch>
@ -64,6 +67,7 @@ import VarietySearch from '@/components/common/Search.vue'
import VarietyTable from '@/components/common/Table.vue' import VarietyTable from '@/components/common/Table.vue'
import VarietyDialog from '@/components/common/Dialog.vue' import VarietyDialog from '@/components/common/Dialog.vue'
import VarietyForm from '@/components/common/Form.vue' import VarietyForm from '@/components/common/Form.vue'
import { ElMessage } from 'element-plus'
// //
import { search, tableColumns, DialogFormItem } from './options' import { search, tableColumns, DialogFormItem } from './options'
@ -75,6 +79,7 @@ import {
getTradeGroupListApi, getTradeGroupListApi,
editVarietyApi, editVarietyApi,
createVarietyApi, createVarietyApi,
syncVarietyApi,
} from '@/api/modules/trade/variety' } from '@/api/modules/trade/variety'
// //
import { uploadImageApi } from '@/api/modules/upload' import { uploadImageApi } from '@/api/modules/upload'
@ -261,6 +266,17 @@ const handleReset = () => {
handleSearch() handleSearch()
} }
//
const syncLoading = ref(false)
const handleSyncVariety = async () => {
syncLoading.value = true
try {
await syncVarietyApi()
} finally {
syncLoading.value = false
}
}
const handleEdit = () => { const handleEdit = () => {
getTradeGroupList() getTradeGroupList()
const row = selectedRow.value const row = selectedRow.value