Preference.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <script setup lang="ts">
  2. import type { Settings } from '@/api/settings'
  3. import type { Ref } from 'vue'
  4. import settings from '@/api/settings'
  5. import FooterToolBar from '@/components/FooterToolbar/FooterToolBar.vue'
  6. import use2FAModal from '@/components/TwoFA/use2FAModal'
  7. import { useSettingsStore } from '@/pinia'
  8. import AuthSettings from '@/views/preference/AuthSettings.vue'
  9. import BasicSettings from '@/views/preference/BasicSettings.vue'
  10. import CertSettings from '@/views/preference/CertSettings.vue'
  11. import LogrotateSettings from '@/views/preference/LogrotateSettings.vue'
  12. import NginxSettings from '@/views/preference/NginxSettings.vue'
  13. import OpenAISettings from '@/views/preference/OpenAISettings.vue'
  14. import { message } from 'ant-design-vue'
  15. import { storeToRefs } from 'pinia'
  16. const data = ref<Settings>({
  17. app: {
  18. page_size: 10,
  19. jwt_secret: '',
  20. },
  21. server: {
  22. host: '0.0.0.0',
  23. port: 9000,
  24. run_mode: 'debug',
  25. },
  26. database: {
  27. name: '',
  28. },
  29. auth: {
  30. ip_white_list: [],
  31. ban_threshold_minutes: 10,
  32. max_attempts: 10,
  33. },
  34. casdoor: {
  35. endpoint: '',
  36. client_id: '',
  37. client_secret: '',
  38. certificate_path: '',
  39. organization: '',
  40. application: '',
  41. redirect_uri: '',
  42. },
  43. cert: {
  44. email: '',
  45. ca_dir: '',
  46. renewal_interval: 7,
  47. recursive_nameservers: [],
  48. http_challenge_port: '9180',
  49. },
  50. http: {
  51. github_proxy: '',
  52. insecure_skip_verify: false,
  53. },
  54. logrotate: {
  55. enabled: false,
  56. cmd: '',
  57. interval: 1440,
  58. },
  59. nginx: {
  60. access_log_path: '',
  61. error_log_path: '',
  62. config_dir: '',
  63. log_dir_white_list: [],
  64. pid_path: '',
  65. reload_cmd: '',
  66. restart_cmd: '',
  67. },
  68. node: {
  69. name: '',
  70. secret: '',
  71. icp_number: '',
  72. public_security_number: '',
  73. },
  74. openai: {
  75. model: '',
  76. base_url: '',
  77. proxy: '',
  78. token: '',
  79. },
  80. terminal: {
  81. start_cmd: '',
  82. },
  83. webauthn: {
  84. rp_display_name: '',
  85. rpid: '',
  86. rp_origins: [],
  87. },
  88. })
  89. settings.get().then(r => {
  90. data.value = r
  91. })
  92. const settingsStore = useSettingsStore()
  93. const { server_name } = storeToRefs(settingsStore)
  94. const errors = ref({}) as Ref<Record<string, Record<string, string>>>
  95. const refAuthSettings = useTemplateRef('refAuthSettings')
  96. async function save() {
  97. // fix type
  98. data.value.cert.http_challenge_port = data.value.cert.http_challenge_port.toString()
  99. const otpModal = use2FAModal()
  100. otpModal.open().then(() => {
  101. settings.save(data.value).then(r => {
  102. if (!settingsStore.is_remote)
  103. server_name.value = r?.server?.name ?? ''
  104. data.value = r
  105. refAuthSettings.value?.getBannedIPs?.()
  106. message.success($gettext('Save successfully'))
  107. errors.value = {}
  108. }).catch(e => {
  109. errors.value = e.errors
  110. message.error(e?.message ?? $gettext('Server error'))
  111. })
  112. })
  113. }
  114. provide('data', data)
  115. provide('errors', errors)
  116. const router = useRouter()
  117. const route = useRoute()
  118. const activeKey = ref('basic')
  119. watch(activeKey, () => {
  120. router.push({
  121. query: {
  122. tab: activeKey.value,
  123. },
  124. })
  125. })
  126. onMounted(() => {
  127. if (route.query?.tab)
  128. activeKey.value = route.query.tab.toString()
  129. })
  130. </script>
  131. <template>
  132. <ACard :title="$gettext('Preference')">
  133. <div class="preference-container">
  134. <ATabs v-model:active-key="activeKey">
  135. <ATabPane
  136. key="basic"
  137. :tab="$gettext('Basic')"
  138. >
  139. <BasicSettings />
  140. </ATabPane>
  141. <ATabPane
  142. key="auth"
  143. :tab="$gettext('Auth')"
  144. >
  145. <AuthSettings ref="refAuthSettings" />
  146. </ATabPane>
  147. <ATabPane
  148. key="cert"
  149. :tab="$gettext('Cert')"
  150. >
  151. <CertSettings />
  152. </ATabPane>
  153. <ATabPane
  154. key="nginx"
  155. :tab="$gettext('Nginx')"
  156. >
  157. <NginxSettings />
  158. </ATabPane>
  159. <ATabPane
  160. key="openai"
  161. :tab="$gettext('OpenAI')"
  162. >
  163. <OpenAISettings />
  164. </ATabPane>
  165. <ATabPane
  166. key="logrotate"
  167. :tab="$gettext('Logrotate')"
  168. >
  169. <LogrotateSettings />
  170. </ATabPane>
  171. </ATabs>
  172. </div>
  173. <FooterToolBar>
  174. <AButton
  175. type="primary"
  176. @click="save"
  177. >
  178. {{ $gettext('Save') }}
  179. </AButton>
  180. </FooterToolBar>
  181. </ACard>
  182. </template>
  183. <style lang="less" scoped>
  184. .preference-container {
  185. width: 100%;
  186. max-width: 600px;
  187. margin: 0 auto;
  188. padding: 0 10px;
  189. }
  190. </style>