SubscriptionGeneralTab.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <script setup>
  2. import { computed } from 'vue';
  3. import { useI18n } from 'vue-i18n';
  4. import SettingListItem from '@/components/SettingListItem.vue';
  5. const { t } = useI18n();
  6. const props = defineProps({
  7. allSetting: { type: Object, required: true },
  8. });
  9. // Sub path is constrained: no `:` or `*`, must start and end with `/`,
  10. // and no double slashes. Strip on input, normalize on blur — same
  11. // behavior as the legacy template.
  12. const subPath = computed({
  13. get: () => props.allSetting.subPath,
  14. set: (v) => {
  15. props.allSetting.subPath = String(v ?? '').replace(/[:*]/g, '');
  16. },
  17. });
  18. function normalizeSubPath() {
  19. let p = props.allSetting.subPath || '/';
  20. if (!p.startsWith('/')) p = '/' + p;
  21. if (!p.endsWith('/')) p += '/';
  22. p = p.replace(/\/+/g, '/');
  23. props.allSetting.subPath = p;
  24. }
  25. </script>
  26. <template>
  27. <a-collapse default-active-key="1">
  28. <a-collapse-panel key="1" :header="t('pages.settings.panelSettings')">
  29. <SettingListItem paddings="small">
  30. <template #title>{{ t('pages.settings.subEnable') }}</template>
  31. <template #description>{{ t('pages.settings.subEnableDesc') }}</template>
  32. <template #control>
  33. <a-switch v-model:checked="allSetting.subEnable" />
  34. </template>
  35. </SettingListItem>
  36. <SettingListItem paddings="small">
  37. <template #title>JSON subscription</template>
  38. <template #description>{{ t('pages.settings.subJsonEnable') }}</template>
  39. <template #control>
  40. <a-switch v-model:checked="allSetting.subJsonEnable" />
  41. </template>
  42. </SettingListItem>
  43. <SettingListItem paddings="small">
  44. <template #title>Clash / Mihomo subscription</template>
  45. <template #control>
  46. <a-switch v-model:checked="allSetting.subClashEnable" />
  47. </template>
  48. </SettingListItem>
  49. <SettingListItem paddings="small">
  50. <template #title>{{ t('pages.settings.subListen') }}</template>
  51. <template #description>{{ t('pages.settings.subListenDesc') }}</template>
  52. <template #control>
  53. <a-input v-model:value="allSetting.subListen" type="text" />
  54. </template>
  55. </SettingListItem>
  56. <SettingListItem paddings="small">
  57. <template #title>{{ t('pages.settings.subDomain') }}</template>
  58. <template #description>{{ t('pages.settings.subDomainDesc') }}</template>
  59. <template #control>
  60. <a-input v-model:value="allSetting.subDomain" type="text" />
  61. </template>
  62. </SettingListItem>
  63. <SettingListItem paddings="small">
  64. <template #title>{{ t('pages.settings.subPort') }}</template>
  65. <template #description>{{ t('pages.settings.subPortDesc') }}</template>
  66. <template #control>
  67. <a-input-number v-model:value="allSetting.subPort" :min="1" :max="65535" :style="{ width: '100%' }" />
  68. </template>
  69. </SettingListItem>
  70. <SettingListItem paddings="small">
  71. <template #title>{{ t('pages.settings.subPath') }}</template>
  72. <template #description>{{ t('pages.settings.subPathDesc') }}</template>
  73. <template #control>
  74. <a-input v-model:value="subPath" type="text" placeholder="/sub/" @blur="normalizeSubPath" />
  75. </template>
  76. </SettingListItem>
  77. <SettingListItem paddings="small">
  78. <template #title>{{ t('pages.settings.subURI') }}</template>
  79. <template #description>{{ t('pages.settings.subURIDesc') }}</template>
  80. <template #control>
  81. <a-input v-model:value="allSetting.subURI" type="text" placeholder="(http|https)://domain[:port]/path/" />
  82. </template>
  83. </SettingListItem>
  84. </a-collapse-panel>
  85. <a-collapse-panel key="2" :header="t('pages.settings.information')">
  86. <SettingListItem paddings="small">
  87. <template #title>{{ t('pages.settings.subEncrypt') }}</template>
  88. <template #description>{{ t('pages.settings.subEncryptDesc') }}</template>
  89. <template #control>
  90. <a-switch v-model:checked="allSetting.subEncrypt" />
  91. </template>
  92. </SettingListItem>
  93. <SettingListItem paddings="small">
  94. <template #title>{{ t('pages.settings.subShowInfo') }}</template>
  95. <template #description>{{ t('pages.settings.subShowInfoDesc') }}</template>
  96. <template #control>
  97. <a-switch v-model:checked="allSetting.subShowInfo" />
  98. </template>
  99. </SettingListItem>
  100. <a-divider>{{ t('pages.settings.subTitle') }}</a-divider>
  101. <SettingListItem paddings="small">
  102. <template #title>{{ t('pages.settings.subTitle') }}</template>
  103. <template #description>{{ t('pages.settings.subTitleDesc') }}</template>
  104. <template #control>
  105. <a-input v-model:value="allSetting.subTitle" type="text" />
  106. </template>
  107. </SettingListItem>
  108. <SettingListItem paddings="small">
  109. <template #title>{{ t('pages.settings.subSupportUrl') }}</template>
  110. <template #description>{{ t('pages.settings.subSupportUrlDesc') }}</template>
  111. <template #control>
  112. <a-input v-model:value="allSetting.subSupportUrl" type="text" placeholder="https://example.com" />
  113. </template>
  114. </SettingListItem>
  115. <SettingListItem paddings="small">
  116. <template #title>{{ t('pages.settings.subProfileUrl') }}</template>
  117. <template #description>{{ t('pages.settings.subProfileUrlDesc') }}</template>
  118. <template #control>
  119. <a-input v-model:value="allSetting.subProfileUrl" type="text" placeholder="https://example.com" />
  120. </template>
  121. </SettingListItem>
  122. <SettingListItem paddings="small">
  123. <template #title>{{ t('pages.settings.subAnnounce') }}</template>
  124. <template #description>{{ t('pages.settings.subAnnounceDesc') }}</template>
  125. <template #control>
  126. <a-textarea v-model:value="allSetting.subAnnounce" />
  127. </template>
  128. </SettingListItem>
  129. <a-divider>Happ</a-divider>
  130. <SettingListItem paddings="small">
  131. <template #title>{{ t('pages.settings.subEnableRouting') }}</template>
  132. <template #description>{{ t('pages.settings.subEnableRoutingDesc') }}</template>
  133. <template #control>
  134. <a-switch v-model:checked="allSetting.subEnableRouting" />
  135. </template>
  136. </SettingListItem>
  137. <SettingListItem paddings="small">
  138. <template #title>{{ t('pages.settings.subRoutingRules') }}</template>
  139. <template #description>{{ t('pages.settings.subRoutingRulesDesc') }}</template>
  140. <template #control>
  141. <a-textarea v-model:value="allSetting.subRoutingRules" placeholder="happ://routing/add/..." />
  142. </template>
  143. </SettingListItem>
  144. </a-collapse-panel>
  145. <a-collapse-panel key="3" :header="t('pages.settings.certs')">
  146. <SettingListItem paddings="small">
  147. <template #title>{{ t('pages.settings.subCertPath') }}</template>
  148. <template #description>{{ t('pages.settings.subCertPathDesc') }}</template>
  149. <template #control>
  150. <a-input v-model:value="allSetting.subCertFile" type="text" />
  151. </template>
  152. </SettingListItem>
  153. <SettingListItem paddings="small">
  154. <template #title>{{ t('pages.settings.subKeyPath') }}</template>
  155. <template #description>{{ t('pages.settings.subKeyPathDesc') }}</template>
  156. <template #control>
  157. <a-input v-model:value="allSetting.subKeyFile" type="text" />
  158. </template>
  159. </SettingListItem>
  160. </a-collapse-panel>
  161. <a-collapse-panel key="4" :header="t('pages.settings.intervals')">
  162. <SettingListItem paddings="small">
  163. <template #title>{{ t('pages.settings.subUpdates') }}</template>
  164. <template #description>{{ t('pages.settings.subUpdatesDesc') }}</template>
  165. <template #control>
  166. <a-input-number v-model:value="allSetting.subUpdates" :min="1" :style="{ width: '100%' }" />
  167. </template>
  168. </SettingListItem>
  169. </a-collapse-panel>
  170. </a-collapse>
  171. </template>