From b4b8acecd3619e033de7c8940778ad2955ecca0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8?= Date: Thu, 23 Apr 2026 17:03:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/index.ts | 2 +- src/api/modules/upload.ts | 3 +- src/components/common/Form.vue | 3 +- src/views/trade/variety/index.vue | 82 ++++++++++++++++++++---------- src/views/trade/variety/options.ts | 15 +++--- src/views/trade/variety/rules.ts | 10 ++-- 6 files changed, 76 insertions(+), 39 deletions(-) diff --git a/src/api/index.ts b/src/api/index.ts index 7355a6d..b7b7bb2 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -179,7 +179,7 @@ export const request = { }); }, post(url: string, data?: unknown, config?: InternalAxiosRequestConfig): Promise { - return service.post>(url, data, {config,showMessage: true,}).then((res) => { + return service.post>(url, data, { ...config, showMessage: true,}).then((res) => { return res as T; }); }, diff --git a/src/api/modules/upload.ts b/src/api/modules/upload.ts index a1e7a4c..c54a8c6 100644 --- a/src/api/modules/upload.ts +++ b/src/api/modules/upload.ts @@ -9,7 +9,6 @@ export const uploadImageApi = (file: any): Promise<{ url: string }> => { // 构建FormData(图片上传必须用FormData格式) const formData = new FormData(); formData.append('image', file); // 对应后端接收字段名image - // 使用你已封装的post请求,禁用loading(富文本自身有状态提示) return request.post<{ url: string }>( '/upload/image', @@ -17,7 +16,7 @@ export const uploadImageApi = (file: any): Promise<{ url: string }> => { { // 覆盖默认配置:图片上传需要特殊的请求头 headers: { - 'Content-Type': 'multipart/form-data', // 表单上传必须的头 + 'Content-type': 'multipart/form-data', // 表单上传必须的头 showLoading: false // 禁用全局loading,避免和编辑器loading冲突 }, timeout: 30 * 1000, // 图片上传超时时间30秒 diff --git a/src/components/common/Form.vue b/src/components/common/Form.vue index acc4b1b..8ecc687 100644 --- a/src/components/common/Form.vue +++ b/src/components/common/Form.vue @@ -63,7 +63,7 @@ :range-separator="item.rangeSeparator || '至'" :start-placeholder="item.startPlaceholder || '开始时间'" :end-placeholder="item.endPlaceholder || '结束时间'" - :value-format="item.valueFormat || 'HH:mm:ss'" is-range /> + :value-format="item.valueFormat || 'HH:mm:ss'" :is-range="item.isRange ?? true" /> @@ -98,6 +98,7 @@ interface FormItem { valueFormat?: string clearable?: boolean disabledDate?: (time: Date) => boolean + isRange?: boolean } interface Props { diff --git a/src/views/trade/variety/index.vue b/src/views/trade/variety/index.vue index 0365fae..1ea1f06 100644 --- a/src/views/trade/variety/index.vue +++ b/src/views/trade/variety/index.vue @@ -107,8 +107,8 @@ const varietyForm = ref({ minFlux: '', // 单位 unit: '', - // 交易组 - tradeGroup: '', + // 交易时间 + tradeTime: '', // 多头库存费 longStockFee: '', // 空头库存费 @@ -130,29 +130,43 @@ const varietyForm = ref({ type: '', // 上传图片地址 imageUrl: '', + // 库存费收取时间 + feeInventoryTime: '', + // 交易分组 + tradeGroup: '', }) const varietyFormRef = ref() const varietyFormRules = ref(rules()) const dialogFormItemOptions = ref(editDialogFormItem) const varietyFormOptionsMap = ref({ + tradeTime: [ + { + label: '2026-4-23', + value: '2026-4-23', + }, + ], tradeGroup: [], type: [ { - label: '金属', + label: '外汇', value: 1, }, { - label: '能源', + label: '金属', value: 2, }, { - label: '指数', + label: '能源', value: 3, }, { - label: '股票', + label: '指数', value: 4, }, + { + label: '数字货币', + value: 5, + }, ], }) // 选中行 @@ -163,10 +177,11 @@ const colSpan = ref(12) const fileList = ref([]) const typeMap: any = { - 1: '金属', - 2: '能源', - 3: '指数', - 4: '股票', + 1: '外汇', + 2: '金属', + 3: '能源', + 4: '指数', + 5: '数字货币', } /** @@ -193,7 +208,7 @@ const getVarietyList = async () => { contractSize: item.multiplier, minFlux: item.undulate_min, unit: item.unit, - tradeGroup: item.group.name, + tradeGroup: item.group, longStockFee: item.fee_inventory_long, shortStockFee: item.fee_inventory_short, profitLevel: item.stop_loss_level, @@ -202,7 +217,7 @@ const getVarietyList = async () => { })) } -//获取交易组列表 +// 获取合约品种分组列表 const getTradeGroupList = async () => { const data = await getTradeGroupListApi() varietyFormOptionsMap.value.tradeGroup = data.map((item: any) => ({ @@ -271,7 +286,7 @@ const handleAdd = () => { contractSize: '', minFlux: '', unit: '', - tradeGroup: '', + tradeTime: '', longStockFee: '', shortStockFee: '', profitLevel: '', @@ -286,6 +301,8 @@ const handleAdd = () => { type: '', // 上传图片地址 imageUrl: '', + feeInventoryTime: '', + tradeGroup: '', } fileList.value = [] } @@ -309,18 +326,30 @@ const handleUpload = async (options: any) => { // 上传前校验:格式 + 大小(20KB = 20 * 1024) const beforeUpload = (file: File) => { - const isTypeValid = file.type === 'image/jpeg' || file.type === 'image/png' - if (!isTypeValid) { - ElMessage.error('只能上传 JPG/PNG 格式!') - return false - } + // 严格校验后缀名 + const fileName = file.name.toLowerCase(); + const isJpgOrPng = fileName.endsWith('.jpg') || fileName.endsWith('.jpeg') || fileName.endsWith('.png'); + + if (!isJpgOrPng) { + ElMessage.error('上传图片只能是 JPG/PNG 格式,且必须包含后缀名!'); + return false; + } - const isSizeValid = file.size / 1024 < 20 - if (!isSizeValid) { - ElMessage.error('图片大小不能超过 20KB!') - return false - } - return true + // 校验 MIME 类型 + const isTypeValid = file.type === 'image/jpeg' || file.type === 'image/png'; + if (!isTypeValid) { + ElMessage.error('图片MIME类型不正确,请重新选择!'); + return false; + } + + // 校验大小 (20KB) + const isSizeValid = file.size / 1024 < 20; + if (!isSizeValid) { + ElMessage.error('图片大小不能超过 20KB!'); + return false; + } + + return true; } @@ -333,7 +362,7 @@ const handleSubmit = async () => { id: varietyForm.value.id, code: varietyForm.value.varietyCode, name: varietyForm.value.varietyName, - group_id: varietyForm.value.groupId, + group_id: varietyForm.value.tradeGroup, point_diff: varietyForm.value.minPoint, fee_inventory_short: varietyForm.value.shortStockFee, status: varietyForm.value.tradeStatus, @@ -350,6 +379,7 @@ const handleSubmit = async () => { online_status: varietyForm.value.onlineStatus, type: Number(varietyForm.value.type), image: varietyForm.value.imageUrl, + fee_inventory_time: varietyForm.value.feeInventoryTime, } console.log(params) @@ -358,7 +388,7 @@ const handleSubmit = async () => { await editVarietyApi(params) getVarietyList() } else { - await createVarietyApi({ ...params, group_id: varietyForm.value.tradeGroup }) + await createVarietyApi({ ...params }) getVarietyList() } dialogVisible.value = false diff --git a/src/views/trade/variety/options.ts b/src/views/trade/variety/options.ts index 9d75b76..9a0fbb4 100644 --- a/src/views/trade/variety/options.ts +++ b/src/views/trade/variety/options.ts @@ -51,12 +51,7 @@ export const editDialogFormItem = [ // 编号 { prop: 'varietyCode', label: '编号', type: 'input' as const, placeholder: '请输入编号' }, // 交易时间 - { - prop: 'tradeGroup', - label: '交易时间', - type: 'select' as const, - placeholder: '请选择交易时间', - }, + {prop: 'tradeTime',label: '交易时间',type: 'select' as const,placeholder: '请选择交易时间',}, // 最大点差 { prop: 'maxPoint', label: '最大点差', type: 'input' as const, placeholder: '请输入最大点差' }, // 最小点差 @@ -113,6 +108,14 @@ export const editDialogFormItem = [ { prop: 'minFlux', label: '最小波动', type: 'input' as const, placeholder: '请输入最小波动' }, // 类型 { prop: 'type', label: '类型', type: 'select' as const, placeholder: '请选择类型' }, + // 库存费收取时间 + { + prop: 'feeInventoryTime', label: '库存费收取时间', type: 'time' as const, + valueFormat: 'HH:mm:ss', + isRange: false, + }, + // 交易分组 + { prop: 'tradeGroup', label: '交易分组', type: 'select' as const, placeholder: '请选择交易分组' }, // 上传图片地址 { prop: 'imageUrl', slotName: 'upload', label: '上传图片', type: 'upload' as const }, // 上下线状态 diff --git a/src/views/trade/variety/rules.ts b/src/views/trade/variety/rules.ts index 701bd55..d0b2db0 100644 --- a/src/views/trade/variety/rules.ts +++ b/src/views/trade/variety/rules.ts @@ -45,9 +45,9 @@ export const rules = (): FormRules => { varietyCode: [ { required: true, message: '请输入编号', trigger: ['blur', 'change'] } ], - // 所属交易组 - tradeGroup: [ - { required: true, message: '请输入所属交易组', trigger: ['blur', 'change'] } + // 所属交易时间 + tradeTime: [ + { required: true, message: '请选择交易时间', trigger: ['blur', 'change'] } ], // 最大点差 maxPoint: [ @@ -118,5 +118,9 @@ export const rules = (): FormRules => { imageUrl: [ { required: true, message: '请上传图片', trigger: ['blur', 'change'] } ], + // 库存费收取时间 + feeInventoryTime: [ + { required: true, message: '请选择库存费收取时间', trigger: ['blur', 'change'] } + ], } } \ No newline at end of file