columns.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import {
  2. getNameDescriptionTableColumn,
  3. getEnabledTableColumn,
  4. getCopyWithContentTableColumn,
  5. } from '@/utils/common/tableColumn'
  6. import { REGEXP } from '@/utils/validate'
  7. import i18n from '@/locales'
  8. const { IPv4, domain } = REGEXP
  9. const RECORD_TYPE_MAP = {
  10. A: 'A/AAAA',
  11. AAAA: 'A/AAAA',
  12. CNAME: 'CNAME',
  13. PTR: 'PTR',
  14. SRV: 'SRV',
  15. }
  16. const classify = (recordStr) => {
  17. const initArr = recordStr.split(',')
  18. const recordList = initArr.map(keyValue => {
  19. const arr = keyValue.split(':')
  20. const key = arr[0]
  21. if (key === 'SRV') {
  22. return {
  23. key,
  24. host: arr[1],
  25. port: arr[2],
  26. weight: arr[3],
  27. priority: arr[4],
  28. }
  29. } else {
  30. const record = keyValue
  31. .split(':')
  32. .slice(1)
  33. .join(':')
  34. return { key, record }
  35. }
  36. })
  37. const key = recordList[0].key // 拿第一个 key 做判断
  38. return {
  39. recordType: RECORD_TYPE_MAP[key],
  40. recordList,
  41. }
  42. }
  43. const checkName = (row) => {
  44. return (rule, value, callback) => {
  45. if (!value) {
  46. return callback(new Error(i18n.t('network.text_158')))
  47. }
  48. if (IPv4.regexp.test(value) || !domain.regexp.test(value)) {
  49. return callback(new Error(i18n.t('network.text_178')))
  50. }
  51. const { recordType } = classify(row.records)
  52. if (recordType === 'SRV') {
  53. const parts = value.split('.')
  54. if (parts.length < 3) {
  55. return callback(new Error(i18n.t('network.text_179')))
  56. }
  57. for (let i = 0; i < parts.length; i++) {
  58. if (i < 2 && (parts[i].length < 2 || parts[i][0] !== '_')) {
  59. return callback(new Error(i18n.t('network.text_180')))
  60. } else if (i >= 2 && parts[i].length === 0) {
  61. return callback(new Error(i18n.t('network.text_180')))
  62. }
  63. }
  64. }
  65. callback()
  66. }
  67. }
  68. export default {
  69. created () {
  70. this.columns = [
  71. getNameDescriptionTableColumn({
  72. onManager: this.onManager,
  73. hideField: true,
  74. title: i18n.t('network.text_156'),
  75. edit: false,
  76. formRules: function (row) {
  77. return [
  78. { required: true, message: i18n.t('network.text_173') },
  79. { validator: checkName(row) },
  80. ]
  81. },
  82. slotCallback: row => {
  83. return (
  84. <side-page-trigger onTrigger={ () => this.handleOpenSidepage(row) }>{ row.name }</side-page-trigger>
  85. )
  86. },
  87. }),
  88. getEnabledTableColumn(),
  89. getCopyWithContentTableColumn({
  90. field: 'records',
  91. title: i18n.t('network.text_152'),
  92. }),
  93. {
  94. field: 'ttl',
  95. title: 'TTL',
  96. formatter: ({ cellValue, row }) => {
  97. const ttlTime = parseInt(cellValue / 60)
  98. if (ttlTime >= 1440) { // 一天是 1440 分钟
  99. return i18n.t('network.text_185', [parseInt(ttlTime / 1440)])
  100. } else if (ttlTime >= 60) {
  101. return i18n.t('network.text_186', [parseInt(ttlTime / 60)])
  102. } else if (ttlTime > 1) {
  103. return i18n.t('network.text_187', [ttlTime])
  104. } else {
  105. return i18n.t('network.text_188', [cellValue || 0])
  106. }
  107. },
  108. },
  109. ]
  110. },
  111. }