index.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <template>
  2. <div>
  3. <el-card shadow="hover" v-loading="state.isLoading">
  4. <el-descriptions title="系统信息配置" :column="2" :border="true">
  5. <el-descriptions-item label="系统图标" :span="2">
  6. <el-upload class="avatar-uploader" :showFileList="false" :autoUpload="false" accept=".jpg,.png,.svg" action="" :limit="1" :onChange="handleUploadChange">
  7. <img v-if="state.formData.sysLogo" :src="state.formData.sysLogo" class="avatar" />
  8. <SvgIcon v-else class="avatar-uploader-icon" name="ele-Plus" :size="28" />
  9. </el-upload>
  10. </el-descriptions-item>
  11. <el-descriptions-item label="系统主标题">
  12. <el-input v-model="state.formData.sysTitle" />
  13. </el-descriptions-item>
  14. <el-descriptions-item label="系统副标题">
  15. <el-input v-model="state.formData.sysViceTitle" />
  16. </el-descriptions-item>
  17. <el-descriptions-item label="系统描述" :span="2">
  18. <el-input v-model="state.formData.sysViceDesc" />
  19. </el-descriptions-item>
  20. <el-descriptions-item label="水印内容" :span="2">
  21. <el-input v-model="state.formData.sysWatermark" />
  22. </el-descriptions-item>
  23. <el-descriptions-item label="版权说明" :span="2">
  24. <el-input v-model="state.formData.sysCopyright" />
  25. </el-descriptions-item>
  26. <template #extra>
  27. <el-button type="primary" @click="onSave">保存</el-button>
  28. </template>
  29. </el-descriptions>
  30. </el-card>
  31. </div>
  32. </template>
  33. <script setup lang="ts" name="sysInfoSetting">
  34. import { nextTick, reactive } from 'vue';
  35. import { getAPI } from '/@/utils/axios-utils';
  36. import { SysConfigApi } from '/@/api-services';
  37. import { ElMessage } from 'element-plus';
  38. import { fileToBase64 } from '/@/utils/base64Conver';
  39. const state = reactive({
  40. isLoading: false,
  41. file: undefined as any,
  42. formData: {
  43. sysLogoBlob: undefined,
  44. sysLogo: '',
  45. sysTitle: '',
  46. sysViceTitle: '',
  47. sysViceDesc: '',
  48. sysWatermark: '',
  49. sysCopyright: '',
  50. },
  51. });
  52. // 通过onChanne方法获得文件列表
  53. const handleUploadChange = (file: any) => {
  54. state.file = file;
  55. // 改变 sysLogo,显示预览
  56. state.formData.sysLogo = URL.createObjectURL(state.file.raw);
  57. };
  58. /** 保存 */
  59. const onSave = async () => {
  60. // 如果有选择图标,则转换为 base64
  61. let sysLogoBase64 = '';
  62. if (state.file) {
  63. sysLogoBase64 = (await fileToBase64(state.file.raw)) as string;
  64. }
  65. try {
  66. state.isLoading = true;
  67. const res = await getAPI(SysConfigApi).apiSysConfigSaveSysInfoPost({
  68. sysLogoBase64: sysLogoBase64,
  69. sysTitle: state.formData.sysTitle,
  70. sysViceTitle: state.formData.sysViceTitle,
  71. sysViceDesc: state.formData.sysViceDesc,
  72. sysWatermark: state.formData.sysWatermark,
  73. sysCopyright: state.formData.sysCopyright,
  74. });
  75. if (res.data!.type !== 'success') return;
  76. // 清空 file 变量
  77. state.file = undefined;
  78. await loadData();
  79. ElMessage.success('保存成功');
  80. } finally {
  81. nextTick(() => {
  82. state.isLoading = false;
  83. });
  84. }
  85. };
  86. /** 加载数据 */
  87. const loadData = async () => {
  88. try {
  89. state.isLoading = true;
  90. const res = await getAPI(SysConfigApi).apiSysConfigSysInfoGet();
  91. if (res.data!.type !== 'success') return;
  92. const result = res.data.result;
  93. state.formData = {
  94. sysLogoBlob: undefined,
  95. sysLogo: result.sysLogo,
  96. sysTitle: result.sysTitle,
  97. sysViceTitle: result.sysViceTitle,
  98. sysViceDesc: result.sysViceDesc,
  99. sysWatermark: result.sysWatermark,
  100. sysCopyright: result.sysCopyright,
  101. };
  102. } finally {
  103. nextTick(() => {
  104. state.isLoading = false;
  105. });
  106. }
  107. };
  108. loadData();
  109. </script>
  110. <style lang="scss" scoped>
  111. .avatar-uploader .avatar {
  112. width: 100px;
  113. height: 100px;
  114. display: block;
  115. }
  116. :deep(.avatar-uploader) .el-upload {
  117. border: 1px dashed var(--el-border-color);
  118. cursor: pointer;
  119. position: relative;
  120. overflow: hidden;
  121. transition: var(--el-transition-duration-fast);
  122. }
  123. :deep(.avatar-uploader) .el-upload:hover {
  124. border-color: var(--el-color-primary);
  125. }
  126. .el-icon.avatar-uploader-icon {
  127. color: #8c939d;
  128. width: 100px;
  129. height: 100px;
  130. text-align: center;
  131. }
  132. </style>