index.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <div class="deviceUpgrade">
  3. <div class="version">{{ currentVersion }}</div>
  4. <div class="action">
  5. <a-select
  6. v-model:value="selectValue"
  7. placeholder="请选择"
  8. style="width: 100px"
  9. size="small"
  10. :options="otaList"
  11. />
  12. <a-button type="link" size="small" :disabled="!selectValue" @click="upgradeHandler"
  13. >升级</a-button
  14. >
  15. </div>
  16. </div>
  17. </template>
  18. <script setup lang="ts">
  19. import { ref, watch } from 'vue'
  20. import * as deviceApi from '@/api/device'
  21. import { filterAndSortOtaList } from '@/utils/ota'
  22. defineOptions({
  23. name: 'DeviceUpgrade',
  24. })
  25. const emit = defineEmits(['success'])
  26. const props = withDefaults(
  27. defineProps<{
  28. version: string
  29. }>(),
  30. {
  31. version: '',
  32. }
  33. )
  34. const selectValue = ref<string | undefined>(undefined)
  35. const currentVersion = ref<string>(props.version)
  36. const otaList = ref<{ label: string; value: string }[]>([])
  37. const fetchOTAList = async (): Promise<void> => {
  38. try {
  39. const resp = await deviceApi.getOtaList()
  40. if (Array.isArray(resp?.data)) {
  41. otaList.value = filterAndSortOtaList(resp.data, currentVersion.value).map((item) => ({
  42. label: item.label,
  43. value: item.value,
  44. }))
  45. } else {
  46. otaList.value = []
  47. }
  48. } catch (err) {
  49. console.error('获取 OTA 列表失败', err)
  50. otaList.value = []
  51. }
  52. }
  53. fetchOTAList()
  54. watch(
  55. () => props.version,
  56. (newVersion) => {
  57. currentVersion.value = newVersion
  58. fetchOTAList()
  59. },
  60. {
  61. immediate: true,
  62. }
  63. )
  64. const upgradeHandler = async (): Promise<void> => {
  65. if (!selectValue.value) return
  66. try {
  67. const payload = { clientIds: [currentVersion.value], ossUrl: selectValue.value }
  68. await deviceApi.updateOta(payload)
  69. emit('success')
  70. } catch (err) {
  71. console.error('升级失败', err)
  72. }
  73. }
  74. </script>
  75. <style scoped lang="less">
  76. .deviceUpgrade {
  77. display: flex;
  78. align-items: center;
  79. justify-content: space-between;
  80. .version {
  81. font-size: 14px;
  82. }
  83. .action {
  84. display: flex;
  85. align-items: center;
  86. gap: 5px;
  87. }
  88. }
  89. </style>