deotalandAi/.trae/documents/重新设计 AdminCommissionManagem...

289 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 重新设计 AdminCommissionManagement 页面
### 需求分析
1. 页面现有结构:包含佣金比例设置和佣金列表两个部分
2. 需要使用 `index.js` 中的 API 方法:
- `updateCommissionConfig()`:更新佣金配置
- `viewCommissionConfig()`:获取佣金配置信息
3. 目前只有佣金配置没有佣金列表(需要移除或调整佣金列表部分)
4. 需要按照项目技术规范和设计风格重新设计页面
### 解决方案
1. 移除或调整佣金列表部分,专注于佣金配置功能
2. 使用 `index.js` 中的 API 方法替换当前的模拟数据
3. 实现完整的佣金配置表单,包含所有必要的配置项
4. 确保页面设计符合项目的技术规范和设计风格
### 实现步骤
1. 修改 `AdminCommissionManagement.vue` 页面:
- 调整页面结构,移除或简化佣金列表部分
- 实现完整的佣金配置表单,包含所有必要的配置项
- 使用 `viewCommissionConfig()` 方法获取佣金配置数据
- 使用 `updateCommissionConfig()` 方法保存佣金配置
- 确保页面支持中英文切换
- 确保页面响应式设计,适配不同设备尺寸
2. 确保页面设计符合项目的技术规范和设计风格:
- 使用 Vue3 Composition API
- 使用 Scoped CSS + CSS 变量实现组件样式隔离与主题定制
- 使用 Element Plus 组件库
- 实现响应式布局,适配移动端、平板端和桌面端
### 代码修改点
**文件**`d:/work/Aiproject/DeotalandAi/apps/FrontendDesigner/src/views/admin/AdminCommissionManagement/AdminCommissionManagement.vue`
**核心修改**
1. **页面结构调整**
- 移除或简化佣金列表部分
- 实现完整的佣金配置表单
2. **数据绑定**
- 使用 `viewCommissionConfig()` 方法获取佣金配置数据
- 将数据绑定到表单控件
3. **表单提交**
- 使用 `updateCommissionConfig()` 方法保存佣金配置
- 实现表单验证
4. **响应式设计**
- 确保页面适配不同设备尺寸
- 实现响应式布局
5. **中英文支持**
- 确保页面所有文本都支持中英文切换
### 实现细节
1. **佣金配置表单**
- 佣金比例commissionRate1-100%,整数
- 最低提现金额minWithdrawAmount数字
- 提现费率withdrawFeeRate0-100%,小数
- 结算周期settlementCycle下拉选择
- 状态status开关控制
- 备注remark文本输入
2. **API调用**
- 在页面挂载时调用 `viewCommissionConfig()` 获取佣金配置数据
- 在表单提交时调用 `updateCommissionConfig()` 保存佣金配置
- 处理API调用的成功和失败情况
3. **表单验证**
- 实现表单验证规则
- 确保所有必填字段都已填写
- 确保字段值符合要求
4. **响应式设计**
- 使用 Flexbox/Grid 实现响应式布局
- 使用媒体查询适配不同设备尺寸
- 确保表单控件在不同设备上都能正常显示和使用
5. **中英文支持**
- 使用 `t()` 函数包裹所有文本
- 确保所有文本都在国际化配置中定义
### 预期效果
1. 页面只包含佣金配置部分,移除或简化佣金列表部分
2. 页面使用 `index.js` 中的 API 方法获取和保存佣金配置
3. 页面支持中英文切换
4. 页面适配不同设备尺寸
5. 页面设计符合项目的技术规范和设计风格
### 实现示例
```vue
<template>
<div class="admin-commission-management">
<h1 class="page-title">{{ t('admin.commissionManagement.title') }}</h1>
<!-- 佣金配置表单 -->
<el-card class="commission-config-card">
<template #header>
<div class="card-header">
<h2 class="card-title">{{ t('admin.commissionManagement.configTitle') }}</h2>
</div>
</template>
<div class="commission-config-content">
<el-form :model="commissionConfig" label-width="120px" :rules="rules" ref="commissionConfigRef">
<!-- 佣金比例 -->
<el-form-item :label="t('admin.commissionManagement.commissionRate')" prop="commissionRate">
<div class="rate-input-wrapper">
<el-input-number
v-model="commissionConfig.commissionRate"
:min="1"
:max="100"
:step="1"
:precision="0"
style="width: 200px"
/>
<span class="rate-suffix">%</span>
</div>
</el-form-item>
<!-- 最低提现金额 -->
<el-form-item :label="t('admin.commissionManagement.minWithdrawAmount')" prop="minWithdrawAmount">
<el-input-number
v-model="commissionConfig.minWithdrawAmount"
:min="0"
:step="10"
:precision="0"
style="width: 200px"
/>
</el-form-item>
<!-- 提现费率 -->
<el-form-item :label="t('admin.commissionManagement.withdrawFeeRate')" prop="withdrawFeeRate">
<div class="rate-input-wrapper">
<el-input-number
v-model="commissionConfig.withdrawFeeRate"
:min="0"
:max="100"
:step="0.1"
:precision="1"
style="width: 200px"
/>
<span class="rate-suffix">%</span>
</div>
</el-form-item>
<!-- 结算周期 -->
<el-form-item :label="t('admin.commissionManagement.settlementCycle')" prop="settlementCycle">
<el-select
v-model="commissionConfig.settlementCycle"
placeholder="{{ t('admin.commissionManagement.selectSettlementCycle') }}"
style="width: 200px"
>
<el-option
v-for="cycle in settlementCycles"
:key="cycle.value"
:label="cycle.label"
:value="cycle.value"
/>
</el-select>
</el-form-item>
<!-- 状态 -->
<el-form-item :label="t('admin.commissionManagement.status')" prop="status">
<el-switch
v-model="commissionConfig.status"
:active-value="1"
:inactive-value="0"
/>
</el-form-item>
<!-- 备注 -->
<el-form-item :label="t('admin.commissionManagement.remark')" prop="remark">
<el-input
v-model="commissionConfig.remark"
type="textarea"
:rows="3"
placeholder="{{ t('admin.commissionManagement.enterRemark') }}"
style="width: 400px"
/>
</el-form-item>
<!-- 保存按钮 -->
<el-form-item>
<el-button type="primary" @click="saveCommissionConfig">{{ t('admin.commissionManagement.saveConfig') }}</el-button>
</el-form-item>
</el-form>
</div>
</el-card>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus'
import { AdminCommissionManagement } from './index.js'
const { t } = useI18n()
const adminCommissionManagement = new AdminCommissionManagement()
// 佣金配置表单
const commissionConfigRef = ref()
const commissionConfig = reactive({
commissionRate: 0,
minWithdrawAmount: 0,
withdrawFeeRate: 0,
settlementCycle: 0,
status: 1,
remark: ''
})
// 结算周期选项
const settlementCycles = [
{ value: 1, label: t('admin.commissionManagement.daily') },
{ value: 7, label: t('admin.commissionManagement.weekly') },
{ value: 30, label: t('admin.commissionManagement.monthly') }
]
// 表单验证规则
const rules = {
commissionRate: [
{ required: true, message: t('admin.commissionManagement.requiredCommissionRate'), trigger: 'blur' },
{ type: 'number', min: 1, max: 100, message: t('admin.commissionManagement.invalidCommissionRate'), trigger: 'blur' }
],
minWithdrawAmount: [
{ required: true, message: t('admin.commissionManagement.requiredMinWithdrawAmount'), trigger: 'blur' },
{ type: 'number', min: 0, message: t('admin.commissionManagement.invalidMinWithdrawAmount'), trigger: 'blur' }
]
}
// 获取佣金配置数据
const getCommissionConfig = async () => {
try {
const response = await adminCommissionManagement.viewCommissionConfig()
if (response.success) {
const data = response.data
commissionConfig.commissionRate = data.commissionRate
commissionConfig.minWithdrawAmount = data.minWithdrawAmount
commissionConfig.withdrawFeeRate = data.withdrawFeeRate
commissionConfig.settlementCycle = data.settlementCycle
commissionConfig.status = data.status
commissionConfig.remark = data.remark
}
} catch (error) {
console.error('获取佣金配置失败:', error)
ElMessage.error(t('admin.commissionManagement.getConfigFailed'))
}
}
// 保存佣金配置
const saveCommissionConfig = async () => {
try {
await commissionConfigRef.value.validate()
const response = await adminCommissionManagement.updateCommissionConfig(commissionConfig)
if (response.success) {
ElMessage.success(t('admin.commissionManagement.saveConfigSuccess'))
}
} catch (error) {
console.error('保存佣金配置失败:', error)
ElMessage.error(t('admin.commissionManagement.saveConfigFailed'))
}
}
// 页面挂载时获取佣金配置数据
onMounted(() => {
getCommissionConfig()
})
</script>
<style scoped>
/* 样式省略,按照项目设计风格实现 */
</style>
```
### 实现预期
1. 页面只包含佣金配置部分,移除或简化佣金列表部分
2. 页面使用 `index.js` 中的 API 方法获取和保存佣金配置
3. 页面支持中英文切换
4. 页面适配不同设备尺寸
5. 页面设计符合项目的技术规范和设计风格