Просмотр исходного кода

😎优化系统logo设置和上传

zuohuaijun 1 год назад
Родитель
Сommit
b1194c6f6f

+ 131 - 131
Admin.NET/Admin.NET.Core/Entity/EntityBase.cs

@@ -1,148 +1,148 @@
-// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
-//
-// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
-//
-// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
-
-namespace Admin.NET.Core;
-
-/// <summary>
-/// 框架实体基类Id
-/// </summary>
-public abstract class EntityBaseId
-{
-    /// <summary>
-    /// 雪花Id
-    /// </summary>
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 框架实体基类Id
+/// </summary>
+public abstract class EntityBaseId
+{
+    /// <summary>
+    /// 雪花Id
+    /// </summary>
     [SugarColumn(ColumnName = "Id", ColumnDescription = "主键Id", IsPrimaryKey = true, IsIdentity = false)]
-    public virtual long Id { get; set; }
-}
-
-/// <summary>
-/// 框架实体基类
-/// </summary>
-[SugarIndex("index_{table}_CT", nameof(CreateTime), OrderByType.Asc)]
-public abstract class EntityBase : EntityBaseId, IDeletedFilter
-{
-    /// <summary>
-    /// 创建时间
-    /// </summary>
+    public virtual long Id { get; set; }
+}
+
+/// <summary>
+/// 框架实体基类
+/// </summary>
+[SugarIndex("index_{table}_CT", nameof(CreateTime), OrderByType.Asc)]
+public abstract class EntityBase : EntityBaseId, IDeletedFilter
+{
+    /// <summary>
+    /// 创建时间
+    /// </summary>
     [SugarColumn(ColumnDescription = "创建时间", IsNullable = true, IsOnlyIgnoreUpdate = true, InsertServerTime = true)]
-    public virtual DateTime CreateTime { get; set; }
-
-    /// <summary>
-    /// 更新时间
-    /// </summary>
+    public virtual DateTime CreateTime { get; set; }
+
+    /// <summary>
+    /// 更新时间
+    /// </summary>
     [SugarColumn(ColumnDescription = "更新时间", IsOnlyIgnoreInsert = true, UpdateServerTime = true)]
-    public virtual DateTime? UpdateTime { get; set; }
-
-    /// <summary>
-    /// 创建者Id
-    /// </summary>
+    public virtual DateTime? UpdateTime { get; set; }
+
+    /// <summary>
+    /// 创建者Id
+    /// </summary>
     [SugarColumn(ColumnDescription = "创建者Id", IsOnlyIgnoreUpdate = true)]
     [OwnerUser]
-    public virtual long CreateUserId { get; set; }
-
-    ///// <summary>
-    ///// 创建者
-    ///// </summary>
-    //[Newtonsoft.Json.JsonIgnore]
-    //[System.Text.Json.Serialization.JsonIgnore]
-    //[Navigate(NavigateType.OneToOne, nameof(CreateUserId))]
-    //public virtual SysUser CreateUser { get; set; }
-
-    /// <summary>
-    /// 创建者姓名
-    /// </summary>
+    public virtual long? CreateUserId { get; set; }
+
+    ///// <summary>
+    ///// 创建者
+    ///// </summary>
+    //[Newtonsoft.Json.JsonIgnore]
+    //[System.Text.Json.Serialization.JsonIgnore]
+    //[Navigate(NavigateType.OneToOne, nameof(CreateUserId))]
+    //public virtual SysUser CreateUser { get; set; }
+
+    /// <summary>
+    /// 创建者姓名
+    /// </summary>
     [SugarColumn(ColumnDescription = "创建者姓名", Length = 64, IsOnlyIgnoreUpdate = true)]
-    public virtual string? CreateUserName { get; set; }
-
-    /// <summary>
-    /// 修改者Id
-    /// </summary>
+    public virtual string? CreateUserName { get; set; }
+
+    /// <summary>
+    /// 修改者Id
+    /// </summary>
     [SugarColumn(ColumnDescription = "修改者Id")]
-    public virtual long? UpdateUserId { get; set; }
-
-    ///// <summary>
-    ///// 修改者
-    ///// </summary>
-    //[Newtonsoft.Json.JsonIgnore]
-    //[System.Text.Json.Serialization.JsonIgnore]
-    //[Navigate(NavigateType.OneToOne, nameof(UpdateUserId))]
-    //public virtual SysUser UpdateUser { get; set; }
-
-    /// <summary>
-    /// 修改者姓名
-    /// </summary>
+    public virtual long? UpdateUserId { get; set; }
+
+    ///// <summary>
+    ///// 修改者
+    ///// </summary>
+    //[Newtonsoft.Json.JsonIgnore]
+    //[System.Text.Json.Serialization.JsonIgnore]
+    //[Navigate(NavigateType.OneToOne, nameof(UpdateUserId))]
+    //public virtual SysUser UpdateUser { get; set; }
+
+    /// <summary>
+    /// 修改者姓名
+    /// </summary>
     [SugarColumn(ColumnDescription = "修改者姓名", Length = 64)]
-    public virtual string? UpdateUserName { get; set; }
-
-    /// <summary>
-    /// 软删除
-    /// </summary>
+    public virtual string? UpdateUserName { get; set; }
+
+    /// <summary>
+    /// 软删除
+    /// </summary>
     [SugarColumn(ColumnDescription = "软删除")]
-    public virtual bool IsDelete { get; set; } = false;
-}
-
-/// <summary>
-/// 业务数据实体基类(数据权限)
-/// </summary>
-public abstract class EntityBaseData : EntityBase, IOrgIdFilter
-{
-    /// <summary>
-    /// 创建者部门Id
-    /// </summary>
+    public virtual bool IsDelete { get; set; } = false;
+}
+
+/// <summary>
+/// 业务数据实体基类(数据权限)
+/// </summary>
+public abstract class EntityBaseData : EntityBase, IOrgIdFilter
+{
+    /// <summary>
+    /// 创建者部门Id
+    /// </summary>
     [SugarColumn(ColumnDescription = "创建者部门Id", IsOnlyIgnoreUpdate = true)]
     [OwnerOrg]
-    public virtual long CreateOrgId { get; set; }
-
-    /// <summary>
-    /// 创建者部门
-    /// </summary>
-    [Newtonsoft.Json.JsonIgnore]
-    [System.Text.Json.Serialization.JsonIgnore]
+    public virtual long? CreateOrgId { get; set; }
+
+    /// <summary>
+    /// 创建者部门
+    /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(CreateOrgId))]
-    public virtual SysOrg CreateOrg { get; set; }
-
-    /// <summary>
-    /// 创建者部门名称
-    /// </summary>
+    public virtual SysOrg CreateOrg { get; set; }
+
+    /// <summary>
+    /// 创建者部门名称
+    /// </summary>
     [SugarColumn(ColumnDescription = "创建者部门名称", Length = 64, IsOnlyIgnoreUpdate = true)]
-    public virtual string? CreateOrgName { get; set; }
-}
-
-/// <summary>
-/// 租户实体基类
-/// </summary>
-public abstract class EntityTenant : EntityBase, ITenantIdFilter
-{
-    /// <summary>
-    /// 租户Id
-    /// </summary>
+    public virtual string? CreateOrgName { get; set; }
+}
+
+/// <summary>
+/// 租户实体基类
+/// </summary>
+public abstract class EntityTenant : EntityBase, ITenantIdFilter
+{
+    /// <summary>
+    /// 租户Id
+    /// </summary>
     [SugarColumn(ColumnDescription = "租户Id", IsOnlyIgnoreUpdate = true)]
-    public virtual long? TenantId { get; set; }
-}
-
-/// <summary>
-/// 租户实体基类Id
-/// </summary>
-public abstract class EntityTenantId : EntityBaseId, ITenantIdFilter
-{
-    /// <summary>
-    /// 租户Id
-    /// </summary>
+    public virtual long? TenantId { get; set; }
+}
+
+/// <summary>
+/// 租户实体基类Id
+/// </summary>
+public abstract class EntityTenantId : EntityBaseId, ITenantIdFilter
+{
+    /// <summary>
+    /// 租户Id
+    /// </summary>
     [SugarColumn(ColumnDescription = "租户Id", IsOnlyIgnoreUpdate = true)]
-    public virtual long? TenantId { get; set; }
-}
-
-/// <summary>
-/// 租户实体基类 + 业务数据(数据权限)
-/// </summary>
-public abstract class EntityTenantBaseData : EntityBaseData, ITenantIdFilter
-{
-    /// <summary>
-    /// 租户Id
-    /// </summary>
+    public virtual long? TenantId { get; set; }
+}
+
+/// <summary>
+/// 租户实体基类 + 业务数据(数据权限)
+/// </summary>
+public abstract class EntityTenantBaseData : EntityBaseData, ITenantIdFilter
+{
+    /// <summary>
+    /// 租户Id
+    /// </summary>
     [SugarColumn(ColumnDescription = "租户Id", IsOnlyIgnoreUpdate = true)]
-    public virtual long? TenantId { get; set; }
+    public virtual long? TenantId { get; set; }
 }

+ 1 - 1
Admin.NET/Admin.NET.Core/Entity/IEntityFilter.cs

@@ -36,5 +36,5 @@ internal interface IOrgIdFilter
     /// <summary>
     /// 创建者部门Id
     /// </summary>
-    long CreateOrgId { get; set; }
+    long? CreateOrgId { get; set; }
 }

+ 5 - 5
Admin.NET/Admin.NET.Core/Service/Config/Dto/InfoInput.cs

@@ -16,6 +16,11 @@ public class InfoSaveInput
     /// </summary>
     public string SysLogoBase64 { get; set; }
 
+    /// <summary>
+    /// 系统图标文件名
+    /// </summary>
+    public string SysLogoFileName { get; set; }
+
     /// <summary>
     /// 系统主标题
     /// </summary>
@@ -50,9 +55,4 @@ public class InfoSaveInput
     /// ICP地址
     /// </summary>
     public string SysIcpUrl { get; set; }
-
-    /// <summary>
-    /// 上传系统图标时的文件名
-    /// </summary>
-    public string SysLogFileName { get; set; }
 }

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs

@@ -279,7 +279,7 @@ public class SysConfigService : IDynamicApiController, ITransient
             var base64Data = groups["data"].Value;
             var binData = Convert.FromBase64String(base64Data);
             // 根据文件名取扩展名
-            var ext = Path.GetExtension(input.SysLogFileName);
+            var ext = string.IsNullOrWhiteSpace(input.SysLogoFileName) ? ".png" : Path.GetExtension(input.SysLogoFileName);
             // 本地图标保存路径
             var path = "Upload";
             var absoluteFilePath = Path.Combine(App.WebHostEnvironment.WebRootPath, path, $"logo{ext}");

+ 8 - 8
Web/src/api-services/models/info-save-input.ts

@@ -28,6 +28,14 @@ export interface InfoSaveInput {
      */
     sysLogoBase64?: string | null;
 
+    /**
+     * 系统图标文件名
+     *
+     * @type {string}
+     * @memberof InfoSaveInput
+     */
+    sysLogoFileName?: string | null;
+
     /**
      * 系统主标题
      *
@@ -83,12 +91,4 @@ export interface InfoSaveInput {
      * @memberof InfoSaveInput
      */
     sysIcpUrl?: string | null;
-
-    /**
-     * 上传系统图标时的文件名
-     *
-     * @type {string}
-     * @memberof InfoSaveInput
-     */
-    sysLogFileName?: string | null;
 }

+ 11 - 6
Web/src/views/system/infoSetting/index.vue

@@ -11,7 +11,7 @@
 							<el-icon><ele-PictureRounded /></el-icon> 系统图标
 						</div>
 					</template> -->
-					<el-upload class="avatar-uploader" :name="sysfilename" :showFileList="false" :autoUpload="false" accept=".jpg,.png,.svg" action="" :limit="1" :onChange="handleUploadChange">
+					<el-upload ref="uploadRef" class="avatar-uploader" :showFileList="false" :autoUpload="false" accept=".jpg,.png,.svg" action="" :limit="1" :onChange="handleUploadChange">
 						<img v-if="state.formData.sysLogo" :src="state.formData.sysLogo" class="avatar" />
 						<SvgIcon v-else class="avatar-uploader-icon" name="ele-Plus" :size="28" />
 					</el-upload>
@@ -46,19 +46,21 @@
 </template>
 
 <script setup lang="ts" name="sysInfoSetting">
-import { nextTick, reactive } from 'vue';
-import { ElMessage } from 'element-plus';
+import { nextTick, reactive, ref } from 'vue';
+import { ElMessage, UploadInstance } from 'element-plus';
 import { fileToBase64 } from '/@/utils/base64Conver';
 
 import { getAPI } from '/@/utils/axios-utils';
 import { SysConfigApi } from '/@/api-services';
 
+const uploadRef = ref<UploadInstance>();
 const state = reactive({
 	isLoading: false,
 	file: undefined as any,
 	formData: {
 		sysLogoBlob: undefined,
 		sysLogo: '',
+		sysLogoFileName: '',
 		sysTitle: '',
 		sysViceTitle: '',
 		sysViceDesc: '',
@@ -71,9 +73,10 @@ const state = reactive({
 
 // 通过onChange方法获得文件列表
 const handleUploadChange = (file: any) => {
+	uploadRef.value!.clearFiles();
+
 	state.file = file;
-	// 改变 sysLogo,显示预览
-	state.formData.sysLogo = URL.createObjectURL(state.file.raw);
+	state.formData.sysLogo = URL.createObjectURL(state.file.raw); // 显示预览logo
 };
 
 // 保存
@@ -90,7 +93,7 @@ const onSave = async () => {
 		state.isLoading = true;
 		const res = await getAPI(SysConfigApi).apiSysConfigSaveSysInfoPost({
 			sysLogoBase64: sysLogoBase64,
-			SysLogFileName: sysLogoFileName,
+			sysLogoFileName: sysLogoFileName,
 			sysTitle: state.formData.sysTitle,
 			sysViceTitle: state.formData.sysViceTitle,
 			sysViceDesc: state.formData.sysViceDesc,
@@ -123,6 +126,7 @@ const loadData = async () => {
 		state.formData = {
 			sysLogoBlob: undefined,
 			sysLogo: result.sysLogo,
+			sysLogoFileName: '',
 			sysTitle: result.sysTitle,
 			sysViceTitle: result.sysViceTitle,
 			sysViceDesc: result.sysViceDesc,
@@ -146,6 +150,7 @@ loadData();
 	width: 100px;
 	height: 100px;
 	display: block;
+	object-fit: contain;
 }
 
 :deep(.avatar-uploader) .el-upload {