index.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <template>
  2. <ContentWrap>
  3. <el-form
  4. ref="formRef"
  5. :model="formData"
  6. :rules="formRules"
  7. label-width="120px"
  8. v-loading="formLoading"
  9. >
  10. <el-form-item label="hideId" v-show="false">
  11. <el-input v-model="formData.id" />
  12. </el-form-item>
  13. <el-tabs>
  14. <el-tab-pane label="积分">
  15. <el-form-item label="积分抵扣" prop="pointTradeDeductEnable">
  16. <el-switch v-model="formData.pointTradeDeductEnable" style="user-select: none" />
  17. <el-text class="w-full" size="small" type="info">下单积分是否抵用订单金额</el-text>
  18. </el-form-item>
  19. <el-form-item label="积分抵扣" prop="pointTradeDeductUnitPrice">
  20. <el-input-number
  21. v-model="computedPointTradeDeductUnitPrice"
  22. placeholder="请输入积分抵扣金额"
  23. :precision="2"
  24. />
  25. <el-text class="w-full" size="small" type="info">
  26. 积分抵用比例(1 积分抵多少金额),单位:元
  27. </el-text>
  28. </el-form-item>
  29. <el-form-item label="积分抵扣最大值" prop="pointTradeDeductMaxPrice">
  30. <el-input-number
  31. v-model="formData.pointTradeDeductMaxPrice"
  32. placeholder="请输入积分抵扣最大值"
  33. />
  34. <el-text class="w-full" size="small" type="info">
  35. 单次下单积分使用上限,0 不限制
  36. </el-text>
  37. </el-form-item>
  38. <el-form-item label="1 元赠送多少分" prop="pointTradeGivePoint">
  39. <el-input-number
  40. v-model="formData.pointTradeGivePoint"
  41. placeholder="请输入 1 元赠送多少积分"
  42. />
  43. <el-text class="w-full" size="small" type="info">
  44. 下单支付金额按比例赠送积分(实际支付 1 元赠送多少积分)
  45. </el-text>
  46. </el-form-item>
  47. </el-tab-pane>
  48. </el-tabs>
  49. <el-form-item>
  50. <el-button type="primary" @click="onSubmit">保存</el-button>
  51. </el-form-item>
  52. </el-form>
  53. </ContentWrap>
  54. </template>
  55. <script lang="ts" setup>
  56. import * as ConfigApi from '@/api/member/config'
  57. defineOptions({ name: 'MemberConfig' })
  58. const { t } = useI18n() // 国际化
  59. const message = useMessage() // 消息弹窗
  60. const dialogVisible = ref(false) // 弹窗的是否展示
  61. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  62. const formData = ref({
  63. id: undefined,
  64. pointTradeDeductEnable: true,
  65. pointTradeDeductUnitPrice: 0,
  66. pointTradeDeductMaxPrice: 0,
  67. pointTradeGivePoint: 0
  68. })
  69. // 创建一个计算属性,用于将 pointTradeDeductUnitPrice 显示为带两位小数的形式
  70. const computedPointTradeDeductUnitPrice = computed({
  71. get: () => (formData.value.pointTradeDeductUnitPrice / 100).toFixed(2),
  72. set: (newValue: number) => {
  73. formData.value.pointTradeDeductUnitPrice = Math.round(newValue * 100)
  74. }
  75. })
  76. const formRules = reactive({})
  77. const formRef = ref() // 表单 Ref
  78. /** 修改积分配置 */
  79. const onSubmit = async () => {
  80. // 校验表单
  81. if (!formRef) return
  82. const valid = await formRef.value.validate()
  83. if (!valid) return
  84. // 提交请求
  85. formLoading.value = true
  86. try {
  87. const data = formData.value as unknown as ConfigApi.ConfigVO
  88. await ConfigApi.saveConfig(data)
  89. message.success(t('common.updateSuccess'))
  90. dialogVisible.value = false
  91. } finally {
  92. formLoading.value = false
  93. }
  94. }
  95. /** 获得积分配置 */
  96. const getConfig = async () => {
  97. try {
  98. const data = await ConfigApi.getConfig()
  99. if (data === null) {
  100. return
  101. }
  102. formData.value = data
  103. } finally {
  104. }
  105. }
  106. onMounted(() => {
  107. getConfig()
  108. })
  109. </script>