selectSite.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <template>
  2. <a-form-item :label="props.label" name="siteCode">
  3. <a-select
  4. showSearch
  5. :allowClear="props.allowClear"
  6. :filter-option="filterOption"
  7. v-model:value="siteCode"
  8. @change="changeUser"
  9. :style="'width:' + selectWidth"
  10. :options="siteInfo"
  11. :field-names="{ label: 'name', value: 'code' }"
  12. placeholder="请选择站点"
  13. />
  14. </a-form-item>
  15. </template>
  16. <script lang="ts" setup name="SelectSite">
  17. import { getAction } from '/@/api/manage/manage';
  18. import { useMessage } from '/@/hooks/web/useMessage';
  19. import { onBeforeMount, onMounted, reactive, ref, watch } from 'vue';
  20. const { createMessage } = useMessage();
  21. const emit = defineEmits(['setSiteInfo']);
  22. const props = defineProps({
  23. label: {
  24. type: String,
  25. default: '',
  26. },
  27. allowClear: {
  28. type: Boolean,
  29. default: false,
  30. },
  31. siteListUrl: {
  32. type: String,
  33. default: '/adweb/adwebSite/getSiteListByUid',
  34. },
  35. selectWidth: {
  36. type: String,
  37. default: '100%',
  38. },
  39. });
  40. //站点搜索
  41. const filterOption = (input: string, option: any) => {
  42. return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0;
  43. };
  44. let siteInfo = reactive([{ code: '', id: '', name: '' }]);
  45. let selectSiteInfo = reactive({ code: '', id: '', name: '' });
  46. let siteCode = ref();
  47. onBeforeMount(() => {
  48. getSiteInfo();
  49. });
  50. // 只要检测到该组件站点发生变化,就触发任何使用此组件的监听方法
  51. watch(
  52. () => siteCode,
  53. (newValue, oldValue) => {
  54. emit('setSiteInfo', selectSiteInfo); // 触发父方法
  55. },
  56. { immediate: true, deep: true }
  57. );
  58. //进入获取站点code
  59. function getSiteInfo() {
  60. getAction(props.siteListUrl, null).then(function (res) {
  61. if (res.code === 200) {
  62. siteInfo = res.result;
  63. let isInSite = false;
  64. for (let i in res.result) {
  65. if (localStorage.getItem('siteCode') !== null && res.result[i].code === localStorage.getItem('siteCode')) {
  66. isInSite = true;
  67. selectSiteInfo = res.result[i];
  68. siteCode.value = localStorage.getItem('siteCode');
  69. }
  70. }
  71. if (!isInSite) {
  72. siteCode.value = res.result[0].code;
  73. selectSiteInfo = res.result[0];
  74. localStorage.setItem('siteCode', res.result[0].code);
  75. localStorage.setItem('siteID', res.result[0].id);
  76. }
  77. } else {
  78. createMessage.error('站点获取失败,请刷新重试');
  79. }
  80. });
  81. }
  82. //改变站点
  83. function changeUser(value, e) {
  84. if (value !== undefined) {
  85. siteCode.value = value;
  86. localStorage.setItem('siteCode', value);
  87. localStorage.setItem('siteID', e.id);
  88. // 更改选中的站点对象
  89. for (let i in siteInfo) {
  90. if (siteInfo[i].code === value) {
  91. selectSiteInfo = siteInfo[i];
  92. }
  93. }
  94. } else {
  95. selectSiteInfo = reactive({ code: '', id: '', name: '' });
  96. }
  97. }
  98. </script>
  99. <style lang="less">
  100. .wp-tips {
  101. .ant-modal-header {
  102. padding: 10px;
  103. }
  104. .ant-modal-body {
  105. padding: 24px;
  106. p {
  107. margin-bottom: 10px;
  108. }
  109. }
  110. }
  111. </style>