index.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <script setup>
  2. import { Page } from '@vben/common-ui';
  3. import { requestClient } from '#/api/request';
  4. import { Button, message, Form, InputNumber, Drawer, Switch } from 'ant-design-vue';
  5. import { ref, reactive, computed, onMounted, onUnmounted, watch } from 'vue';
  6. const initialFormState = {
  7. innerDefaultAmount: 10000,
  8. minProfitAmount: 0,
  9. innerRebateRatio: 0,
  10. obRebateRatio: 0,
  11. hgRebateRatio: 0,
  12. runWorkerEnabled: false
  13. };
  14. const formState = reactive({ ...initialFormState });
  15. const isFormChanged = ref(false);
  16. const checkFormChanged = () => {
  17. isFormChanged.value = Object.keys(initialFormState).some(key =>
  18. formState[key] !== initialFormState[key]
  19. );
  20. };
  21. watch(formState, () => {
  22. checkFormChanged();
  23. }, { deep: true });
  24. const getSetting = async () => {
  25. try {
  26. const data = await requestClient.get('/system/get_setting');
  27. return data;
  28. }
  29. catch (error) {
  30. console.error('Failed to fetch setting:', error);
  31. message.error('获取参数设置失败');
  32. return {};
  33. }
  34. }
  35. const saveSetting = async () => {
  36. try {
  37. await requestClient.post('/system/update_setting', formState);
  38. message.success('保存成功');
  39. syncSetting();
  40. }
  41. catch (error) {
  42. console.error('Failed to save setting:', error);
  43. message.error('保存失败');
  44. }
  45. }
  46. const syncSetting = () => {
  47. getSetting().then(data => {
  48. if (data) {
  49. Object.assign(formState, data);
  50. Object.assign(initialFormState, data);
  51. isFormChanged.value = false;
  52. }
  53. });
  54. }
  55. onMounted(() => {
  56. syncSetting();
  57. });
  58. onUnmounted(() => {
  59. });
  60. </script>
  61. <template>
  62. <Page title="参数设置">
  63. <Form
  64. :model="formState"
  65. layout="horizontal"
  66. :label-col="{ span: 6 }"
  67. :wrapper-col="{ span: 18 }"
  68. class="parameter-form"
  69. >
  70. <Form.Item
  71. label="内盘默认注额"
  72. name="innerDefaultAmount"
  73. >
  74. <InputNumber
  75. v-model:value="formState.innerDefaultAmount"
  76. :min="0"
  77. :step="1000"
  78. style="width: 200px"
  79. />
  80. </Form.Item>
  81. <Form.Item
  82. label="最小利润额"
  83. name="minProfitAmount"
  84. >
  85. <InputNumber
  86. v-model:value="formState.minProfitAmount"
  87. :min="-99999"
  88. :step="1"
  89. style="width: 200px"
  90. />
  91. </Form.Item>
  92. <Form.Item
  93. label="内盘返点比例(%)"
  94. name="innerRebateRatio"
  95. >
  96. <InputNumber
  97. v-model:value="formState.innerRebateRatio"
  98. :min="0"
  99. :max="100"
  100. :step="0.1"
  101. style="width: 200px"
  102. />
  103. </Form.Item>
  104. <Form.Item
  105. label="OB返点比例(%)"
  106. name="obRebateRatio"
  107. >
  108. <InputNumber
  109. v-model:value="formState.obRebateRatio"
  110. :min="0"
  111. :max="100"
  112. :step="0.1"
  113. style="width: 200px"
  114. />
  115. </Form.Item>
  116. <Form.Item
  117. label="HG返点比例(%)"
  118. name="hgRebateRatio"
  119. >
  120. <InputNumber
  121. v-model:value="formState.hgRebateRatio"
  122. :min="0"
  123. :max="100"
  124. :step="0.1"
  125. style="width: 200px"
  126. />
  127. </Form.Item>
  128. <Form.Item
  129. label="后台 Worker 开关"
  130. name="runWorkerEnabled"
  131. >
  132. <Switch v-model:checked="formState.runWorkerEnabled" />
  133. </Form.Item>
  134. <Form.Item :wrapper-col="{ offset: 6, span: 18 }">
  135. <Button type="primary" @click="saveSetting" :disabled="!isFormChanged">保存设置</Button>
  136. </Form.Item>
  137. </Form>
  138. </Page>
  139. </template>
  140. <style scoped>
  141. .parameter-form {
  142. max-width: 600px;
  143. }
  144. </style>