index.vue 4.3 KB

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