ProxyCacheConfig.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. <script setup lang="ts">
  2. import type { ProxyCacheConfig } from '@/api/ngx'
  3. import { reactive } from 'vue'
  4. const value = defineModel<ProxyCacheConfig>({
  5. default: reactive({
  6. enabled: false,
  7. path: '/var/cache/nginx/proxy_cache',
  8. levels: '1:2',
  9. use_temp_path: 'off',
  10. keys_zone: 'proxy_cache:10m',
  11. inactive: '60m',
  12. max_size: '1g',
  13. min_free: '',
  14. manager_files: '',
  15. manager_sleep: '',
  16. manager_threshold: '',
  17. loader_files: '',
  18. loader_sleep: '',
  19. loader_threshold: '',
  20. purger: 'off',
  21. purger_files: '',
  22. purger_sleep: '',
  23. purger_threshold: '',
  24. }),
  25. })
  26. const timeUnitOptions = [
  27. { value: 'ms', label: 'ms' },
  28. { value: 's', label: 's' },
  29. { value: 'm', label: 'm' },
  30. { value: 'h', label: 'h' },
  31. { value: 'd', label: 'd' },
  32. { value: 'w', label: 'w' },
  33. { value: 'M', label: 'M' },
  34. { value: 'y', label: 'y' },
  35. ]
  36. const sizeUnitOptions = [
  37. { value: 'k', label: 'K' },
  38. { value: 'm', label: 'M' },
  39. { value: 'g', label: 'G' },
  40. ]
  41. const timeValues = reactive({
  42. inactive: { value: '60', unit: 'm' },
  43. manager_sleep: { value: '', unit: 'ms' },
  44. manager_threshold: { value: '', unit: 'ms' },
  45. loader_sleep: { value: '', unit: 'ms' },
  46. loader_threshold: { value: '', unit: 'ms' },
  47. purger_sleep: { value: '', unit: 'ms' },
  48. purger_threshold: { value: '', unit: 'ms' },
  49. })
  50. const sizeValues = reactive({
  51. max_size: { value: '1', unit: 'g' },
  52. min_free: { value: '', unit: 'm' },
  53. })
  54. function initTimeValues() {
  55. const timeFields = ['inactive', 'manager_sleep', 'manager_threshold', 'loader_sleep', 'loader_threshold', 'purger_sleep', 'purger_threshold']
  56. timeFields.forEach(field => {
  57. const fieldValue = value.value[field]
  58. if (fieldValue) {
  59. const match = fieldValue.match(/^(\d+)([a-z]+)$/i)
  60. if (match) {
  61. timeValues[field].value = match[1]
  62. timeValues[field].unit = match[2]
  63. }
  64. }
  65. })
  66. }
  67. function initSizeValues() {
  68. const sizeFields = ['max_size', 'min_free']
  69. sizeFields.forEach(field => {
  70. const fieldValue = value.value[field]
  71. if (fieldValue) {
  72. const match = fieldValue.match(/^(\d+)([kmg])$/i)
  73. if (match) {
  74. sizeValues[field].value = match[1]
  75. sizeValues[field].unit = match[2].toLowerCase()
  76. }
  77. }
  78. })
  79. }
  80. function updateTimeValue(field) {
  81. if (timeValues[field].value) {
  82. value.value[field] = `${timeValues[field].value}${timeValues[field].unit}`
  83. }
  84. else {
  85. value.value[field] = ''
  86. }
  87. }
  88. function updateSizeValue(field) {
  89. if (sizeValues[field].value) {
  90. value.value[field] = `${sizeValues[field].value}${sizeValues[field].unit}`
  91. }
  92. else {
  93. value.value[field] = ''
  94. }
  95. }
  96. initTimeValues()
  97. initSizeValues()
  98. </script>
  99. <template>
  100. <AForm layout="vertical">
  101. <AFormItem :label="$gettext('Enable Proxy Cache')" name="enabled">
  102. <ASwitch v-model:checked="value.enabled" />
  103. </AFormItem>
  104. <div v-if="value.enabled" class="pt-4">
  105. <ADivider>{{ $gettext('Basic Settings') }}</ADivider>
  106. <ARow :gutter="16">
  107. <ACol :span="12">
  108. <AFormItem
  109. :label="$gettext('Cache Path')"
  110. name="path"
  111. required
  112. :help="$gettext('Directory path to store cache files')"
  113. >
  114. <AInput v-model:value="value.path" placeholder="/var/cache/nginx/proxy_cache" />
  115. </AFormItem>
  116. </ACol>
  117. <ACol :span="12">
  118. <AFormItem
  119. :label="$gettext('Directory Levels')"
  120. name="levels"
  121. :help="$gettext('Cache subdirectory levels structure, e.g. 1:2')"
  122. >
  123. <AInput v-model:value="value.levels" placeholder="1:2" />
  124. </AFormItem>
  125. </ACol>
  126. </ARow>
  127. <ARow :gutter="16">
  128. <ACol :span="12">
  129. <AFormItem
  130. :label="$gettext('Shared Memory Zone')"
  131. name="keys_zone"
  132. required
  133. :help="$gettext('Define shared memory zone name and size, e.g. proxy_cache:10m')"
  134. >
  135. <AInput v-model:value="value.keys_zone" placeholder="proxy_cache:10m" />
  136. </AFormItem>
  137. </ACol>
  138. <ACol :span="12">
  139. <AFormItem
  140. :label="$gettext('Use Temporary Path')"
  141. name="use_temp_path"
  142. :help="$gettext('Whether to use a temporary path when writing temporary files')"
  143. >
  144. <ASwitch
  145. v-model:checked="value.use_temp_path"
  146. :checked-children="$gettext('On')"
  147. :un-checked-children="$gettext('Off')"
  148. checked-value="on"
  149. un-checked-value="off"
  150. />
  151. </AFormItem>
  152. </ACol>
  153. </ARow>
  154. <ARow :gutter="16">
  155. <ACol :span="12">
  156. <AFormItem
  157. :label="$gettext('Inactive Time')"
  158. name="inactive"
  159. :help="$gettext('Cache items not accessed within this time will be removed')"
  160. >
  161. <AInputGroup compact>
  162. <AInput
  163. v-model:value="timeValues.inactive.value"
  164. style="width: 65%"
  165. placeholder="60"
  166. @change="updateTimeValue('inactive')"
  167. />
  168. <ASelect
  169. v-model:value="timeValues.inactive.unit"
  170. style="width: 35%"
  171. :options="timeUnitOptions"
  172. @change="updateTimeValue('inactive')"
  173. />
  174. </AInputGroup>
  175. </AFormItem>
  176. </ACol>
  177. <ACol :span="12">
  178. <AFormItem
  179. :label="$gettext('Maximum Cache Size')"
  180. name="max_size"
  181. :help="$gettext('Maximum total size of the cache')"
  182. >
  183. <AInputGroup compact>
  184. <AInput
  185. v-model:value="sizeValues.max_size.value"
  186. style="width: 65%"
  187. placeholder="1"
  188. @change="updateSizeValue('max_size')"
  189. />
  190. <ASelect
  191. v-model:value="sizeValues.max_size.unit"
  192. style="width: 35%"
  193. :options="sizeUnitOptions"
  194. @change="updateSizeValue('max_size')"
  195. />
  196. </AInputGroup>
  197. </AFormItem>
  198. </ACol>
  199. </ARow>
  200. <ARow :gutter="16">
  201. <ACol :span="12">
  202. <AFormItem
  203. :label="$gettext('Minimum Free Space')"
  204. name="min_free"
  205. :help="$gettext('Minimum free space in the cache directory')"
  206. >
  207. <AInputGroup compact>
  208. <AInput
  209. v-model:value="sizeValues.min_free.value"
  210. style="width: 65%"
  211. placeholder="100"
  212. @change="updateSizeValue('min_free')"
  213. />
  214. <ASelect
  215. v-model:value="sizeValues.min_free.unit"
  216. style="width: 35%"
  217. :options="sizeUnitOptions"
  218. @change="updateSizeValue('min_free')"
  219. />
  220. </AInputGroup>
  221. </AFormItem>
  222. </ACol>
  223. </ARow>
  224. <ADivider>{{ $gettext('Cache Manager Settings') }}</ADivider>
  225. <ARow :gutter="16">
  226. <ACol :span="12">
  227. <AFormItem
  228. :label="$gettext('Manager Files')"
  229. name="manager_files"
  230. :help="$gettext('Number of files processed by cache manager at once')"
  231. >
  232. <AInput v-model:value="value.manager_files" placeholder="e.g. 100" />
  233. </AFormItem>
  234. </ACol>
  235. <ACol :span="12">
  236. <AFormItem
  237. :label="$gettext('Manager Sleep')"
  238. name="manager_sleep"
  239. :help="$gettext('Sleep time between cache manager iterations')"
  240. >
  241. <AInputGroup compact>
  242. <AInput
  243. v-model:value="timeValues.manager_sleep.value"
  244. style="width: 65%"
  245. placeholder="50"
  246. @change="updateTimeValue('manager_sleep')"
  247. />
  248. <ASelect
  249. v-model:value="timeValues.manager_sleep.unit"
  250. style="width: 35%"
  251. :options="timeUnitOptions"
  252. @change="updateTimeValue('manager_sleep')"
  253. />
  254. </AInputGroup>
  255. </AFormItem>
  256. </ACol>
  257. </ARow>
  258. <ARow :gutter="16">
  259. <ACol :span="12">
  260. <AFormItem
  261. :label="$gettext('Manager Threshold')"
  262. name="manager_threshold"
  263. :help="$gettext('Cache manager processing time threshold')"
  264. >
  265. <AInputGroup compact>
  266. <AInput
  267. v-model:value="timeValues.manager_threshold.value"
  268. style="width: 65%"
  269. placeholder="200"
  270. @change="updateTimeValue('manager_threshold')"
  271. />
  272. <ASelect
  273. v-model:value="timeValues.manager_threshold.unit"
  274. style="width: 35%"
  275. :options="timeUnitOptions"
  276. @change="updateTimeValue('manager_threshold')"
  277. />
  278. </AInputGroup>
  279. </AFormItem>
  280. </ACol>
  281. </ARow>
  282. <ADivider>{{ $gettext('Loader Settings') }}</ADivider>
  283. <ARow :gutter="16">
  284. <ACol :span="12">
  285. <AFormItem
  286. :label="$gettext('Loader Files')"
  287. name="loader_files"
  288. :help="$gettext('Number of files processed by cache loader at once')"
  289. >
  290. <AInput v-model:value="value.loader_files" placeholder="e.g. 100" />
  291. </AFormItem>
  292. </ACol>
  293. <ACol :span="12">
  294. <AFormItem
  295. :label="$gettext('Loader Sleep')"
  296. name="loader_sleep"
  297. :help="$gettext('Sleep time between cache loader iterations')"
  298. >
  299. <AInputGroup compact>
  300. <AInput
  301. v-model:value="timeValues.loader_sleep.value"
  302. style="width: 65%"
  303. placeholder="50"
  304. @change="updateTimeValue('loader_sleep')"
  305. />
  306. <ASelect
  307. v-model:value="timeValues.loader_sleep.unit"
  308. style="width: 35%"
  309. :options="timeUnitOptions"
  310. @change="updateTimeValue('loader_sleep')"
  311. />
  312. </AInputGroup>
  313. </AFormItem>
  314. </ACol>
  315. </ARow>
  316. <ARow :gutter="16">
  317. <ACol :span="12">
  318. <AFormItem
  319. :label="$gettext('Loader Threshold')"
  320. name="loader_threshold"
  321. :help="$gettext('Cache loader processing time threshold')"
  322. >
  323. <AInputGroup compact>
  324. <AInput
  325. v-model:value="timeValues.loader_threshold.value"
  326. style="width: 65%"
  327. placeholder="200"
  328. @change="updateTimeValue('loader_threshold')"
  329. />
  330. <ASelect
  331. v-model:value="timeValues.loader_threshold.unit"
  332. style="width: 35%"
  333. :options="timeUnitOptions"
  334. @change="updateTimeValue('loader_threshold')"
  335. />
  336. </AInputGroup>
  337. </AFormItem>
  338. </ACol>
  339. </ARow>
  340. <!-- <ADivider>{{ $gettext('Purger Settings') }}</ADivider>
  341. <ARow :gutter="16">
  342. <ACol :span="12">
  343. <AFormItem
  344. :label="$gettext('Enable Purger')"
  345. name="purger"
  346. :help="$gettext('Whether to enable the cache purger')"
  347. >
  348. <ASwitch
  349. v-model:checked="value.purger"
  350. :checked-children="$gettext('On')"
  351. :un-checked-children="$gettext('Off')"
  352. checked-value="on"
  353. un-checked-value="off"
  354. />
  355. </AFormItem>
  356. </ACol>
  357. <ACol :span="12">
  358. <AFormItem
  359. :label="$gettext('Purger Files')"
  360. name="purger_files"
  361. :help="$gettext('Number of files processed by purger at once')"
  362. >
  363. <AInput v-model:value="value.purger_files" placeholder="e.g. 10" />
  364. </AFormItem>
  365. </ACol>
  366. </ARow>
  367. <ARow :gutter="16">
  368. <ACol :span="12">
  369. <AFormItem
  370. :label="$gettext('Purger Sleep')"
  371. name="purger_sleep"
  372. :help="$gettext('Sleep time between purger iterations')"
  373. >
  374. <AInputGroup compact>
  375. <AInput
  376. v-model:value="timeValues.purger_sleep.value"
  377. style="width: 65%"
  378. placeholder="50"
  379. @change="updateTimeValue('purger_sleep')"
  380. />
  381. <ASelect
  382. v-model:value="timeValues.purger_sleep.unit"
  383. style="width: 35%"
  384. :options="timeUnitOptions"
  385. @change="updateTimeValue('purger_sleep')"
  386. />
  387. </AInputGroup>
  388. </AFormItem>
  389. </ACol>
  390. <ACol :span="12">
  391. <AFormItem
  392. :label="$gettext('Purger Threshold')"
  393. name="purger_threshold"
  394. :help="$gettext('Purger processing time threshold')"
  395. >
  396. <AInputGroup compact>
  397. <AInput
  398. v-model:value="timeValues.purger_threshold.value"
  399. style="width: 65%"
  400. placeholder="200"
  401. @change="updateTimeValue('purger_threshold')"
  402. />
  403. <ASelect
  404. v-model:value="timeValues.purger_threshold.unit"
  405. style="width: 35%"
  406. :options="timeUnitOptions"
  407. @change="updateTimeValue('purger_threshold')"
  408. />
  409. </AInputGroup>
  410. </AFormItem>
  411. </ACol>
  412. </ARow> -->
  413. </div>
  414. </AForm>
  415. </template>