Preference.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <script setup lang="ts">
  2. import {useGettext} from 'vue3-gettext'
  3. import {reactive, ref} from 'vue'
  4. import FooterToolBar from '@/components/FooterToolbar/FooterToolBar.vue'
  5. import {useSettingsStore} from '@/pinia'
  6. import {dark_mode} from '@/lib/theme'
  7. import settings from '@/api/settings'
  8. import {message} from 'ant-design-vue'
  9. const {$gettext} = useGettext()
  10. const settingsStore = useSettingsStore()
  11. const theme = ref(settingsStore.theme)
  12. const data = ref({
  13. server: {
  14. http_port: 9000,
  15. run_mode: 'debug',
  16. jwt_secret: '',
  17. start_cmd: '',
  18. email: '',
  19. http_challenge_port: 9180
  20. },
  21. nginx_log: {
  22. access_log_path: '',
  23. error_log_path: ''
  24. },
  25. openai: {
  26. model: '',
  27. base_url: '',
  28. proxy: '',
  29. token: ''
  30. }
  31. })
  32. settings.get().then(r => {
  33. data.value = r
  34. })
  35. function save() {
  36. settingsStore.set_theme(theme.value)
  37. settingsStore.set_preference_theme(theme.value)
  38. dark_mode(theme.value === 'dark')
  39. settings.save(data.value).then(r => {
  40. data.value = r
  41. message.success($gettext('Save successfully'))
  42. }).catch(e => {
  43. message.error(e?.message ?? $gettext('Server error'))
  44. })
  45. }
  46. </script>
  47. <template>
  48. <a-card :title="$gettext('Preference')">
  49. <div class="preference-container">
  50. <a-form layout="vertical">
  51. <h4>{{ $gettext('Basic') }}</h4>
  52. <a-form-item :label="$gettext('HTTP Port')">
  53. <p>{{ data.server.http_port }}</p>
  54. </a-form-item>
  55. <a-form-item :label="$gettext('Run Mode')">
  56. <p>{{ data.server.run_mode }}</p>
  57. </a-form-item>
  58. <a-form-item :label="$gettext('Jwt Secret')">
  59. <p>{{ data.server.jwt_secret }}</p>
  60. </a-form-item>
  61. <a-form-item :label="$gettext('Terminal Start Command')">
  62. <p>{{ data.server.start_cmd }}</p>
  63. </a-form-item>
  64. <a-form-item :label="$gettext('HTTP Challenge Port')">
  65. <a-input-number v-model:value="data.server.http_challenge_port"/>
  66. </a-form-item>
  67. <a-form-item :label="$gettext('Theme')">
  68. <a-select v-model:value="theme">
  69. <a-select-option value="auto">
  70. {{ $gettext('Auto') }}
  71. </a-select-option>
  72. <a-select-option value="light">
  73. {{ $gettext('Light') }}
  74. </a-select-option>
  75. <a-select-option value="dark">
  76. {{ $gettext('Dark') }}
  77. </a-select-option>
  78. </a-select>
  79. </a-form-item>
  80. <h4>{{ $gettext('Nginx Log') }}</h4>
  81. <a-form-item :label="$gettext('Nginx Access Log Path')">
  82. <a-input v-model:value="data.nginx_log.access_log_path"/>
  83. </a-form-item>
  84. <a-form-item :label="$gettext('Nginx Error Log Path')">
  85. <a-input v-model:value="data.nginx_log.error_log_path"/>
  86. </a-form-item>
  87. <h4>{{ $gettext('OpenAI') }}</h4>
  88. <a-form-item :label="$gettext('ChatGPT Model')">
  89. <a-select v-model:value="data.openai.model">
  90. <a-select-option value="gpt-4">
  91. {{ $gettext('GPT-4') }}
  92. </a-select-option>
  93. <a-select-option value="gpt-4-32k">
  94. {{ $gettext('GPT-4-32K') }}
  95. </a-select-option>
  96. <a-select-option value="gpt-3.5-turbo">
  97. {{ $gettext('GPT-3.5-Turbo') }}
  98. </a-select-option>
  99. </a-select>
  100. </a-form-item>
  101. <a-form-item :label="$gettext('API Base Url')">
  102. <a-input v-model:value="data.openai.base_url"
  103. :placeholder="$gettext('Leave blank for the default: https://api.openai.com/')"/>
  104. </a-form-item>
  105. <a-form-item :label="$gettext('API Proxy')">
  106. <a-input v-model:value="data.openai.proxy" placeholder="http://127.0.0.1:1087"/>
  107. </a-form-item>
  108. <a-form-item :label="$gettext('API Token')">
  109. <a-input-password v-model:value="data.openai.token"/>
  110. </a-form-item>
  111. </a-form>
  112. </div>
  113. </a-card>
  114. <footer-tool-bar>
  115. <a-button type="primary" @click="save">
  116. {{ $gettext('Save') }}
  117. </a-button>
  118. </footer-tool-bar>
  119. </template>
  120. <style lang="less" scoped>
  121. .preference-container {
  122. width: 100%;
  123. max-width: 600px;
  124. margin: 0 auto;
  125. padding: 0 10px;
  126. }
  127. </style>