Browse Source

字典添加多语言管理

Cyrus Zhou 1 year ago
parent
commit
e2d5e7e5ef

+ 24 - 0
Admin.NET/Admin.NET.Core/Service/Dict/Dto/DictDataOutput.cs

@@ -0,0 +1,24 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Core.Service;
+
+public class DictDataOutput
+{
+    public long DictDataId { get; set; }
+    public string TypeCode { get; set; }
+    public string Label { get; set; }
+    public string Value { get; set; }
+    public string Code { get; set; }
+    public string TagType { get; set; }
+    public string StyleSetting { get; set; }
+    public string ClassSetting { get; set; }
+    public string ExtData { get; set; }
+    public string Remark { get; set; }
+    public int OrderNo { get; set; }
+    public StatusEnum Status { get; set; }
+}
+

+ 39 - 4
Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs

@@ -16,14 +16,17 @@ public class SysDictDataService : IDynamicApiController, ITransient
     public readonly ISugarQueryable<SysDictData> VSysDictData;
     private readonly SysCacheService _sysCacheService;
     private readonly UserManager _userManager;
+    private readonly SysLangTextCacheService _sysLangTextCacheService;
 
     public SysDictDataService(SqlSugarRepository<SysDictData> sysDictDataRep,
         SysCacheService sysCacheService,
-        UserManager userManager)
+        UserManager userManager,
+        SysLangTextCacheService sysLangTextCacheService)
     {
         _userManager = userManager;
         _sysDictDataRep = sysDictDataRep;
         _sysCacheService = sysCacheService;
+        _sysLangTextCacheService = sysLangTextCacheService;
         VSysDictData = _sysDictDataRep.Context.UnionAll(
             _sysDictDataRep.AsQueryable(),
             _sysDictDataRep.Change<SysDictDataTenant>().AsQueryable().WhereIF(_userManager.SuperAdmin, d => d.TenantId == _userManager.TenantId).Select<SysDictData>());
@@ -37,12 +40,29 @@ public class SysDictDataService : IDynamicApiController, ITransient
     [DisplayName("获取字典值分页列表")]
     public async Task<SqlSugarPagedList<SysDictData>> Page(PageDictDataInput input)
     {
-        return await VSysDictData
+        var langCode = _userManager.LangCode;
+        var baseQuery = VSysDictData
             .Where(u => u.DictTypeId == input.DictTypeId)
             .WhereIF(!string.IsNullOrEmpty(input.Code?.Trim()), u => u.Code.Contains(input.Code))
             .WhereIF(!string.IsNullOrEmpty(input.Label?.Trim()), u => u.Label.Contains(input.Label))
-            .OrderBy(u => new { u.OrderNo, u.Code })
-            .ToPagedListAsync(input.Page, input.PageSize);
+            .OrderBy(u => new { u.OrderNo, u.Code });
+        var pageList = await baseQuery.ToPagedListAsync(input.Page, input.PageSize);
+        var list = pageList.Items;
+        var ids = list.Select(d => d.Id).Distinct().ToList();
+        var translations = await _sysLangTextCacheService.GetTranslations(
+                               "SysDictData",
+                               "Label",
+                               ids,
+                               langCode);
+        foreach (var item in list)
+        {
+            if (translations.TryGetValue(item.Id, out var translatedLabel) && !string.IsNullOrEmpty(translatedLabel))
+            {
+                item.Label = translatedLabel;
+            }
+        }
+        pageList.Items = list;
+        return pageList;
     }
 
     /// <summary>
@@ -52,6 +72,21 @@ public class SysDictDataService : IDynamicApiController, ITransient
     [DisplayName("获取字典值列表")]
     public async Task<List<SysDictData>> GetList([FromQuery] GetDataDictDataInput input)
     {
+        var langCode = _userManager.LangCode;
+        var list =await GetDictDataListByDictTypeId(input.DictTypeId);
+        var ids = list.Select(d => d.Id).Distinct().ToList();
+        var translations = await _sysLangTextCacheService.GetTranslations(
+                               "SysDictData",
+                               "Label",
+                               ids,
+                               langCode);
+        foreach (var item in list)
+        {
+            if (translations.TryGetValue(item.Id, out var translatedLabel) && !string.IsNullOrEmpty(translatedLabel))
+            {
+                item.Label = translatedLabel;
+            }
+        }
         return await GetDictDataListByDictTypeId(input.DictTypeId);
     }
 

+ 95 - 16
Admin.NET/Admin.NET.Core/Service/Dict/SysDictTypeService.cs

@@ -4,6 +4,8 @@
 //
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
+using Aop.Api.Domain;
+
 namespace Admin.NET.Core.Service;
 
 /// <summary>
@@ -16,16 +18,19 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     private readonly SysDictDataService _sysDictDataService;
     private readonly SysCacheService _sysCacheService;
     private readonly UserManager _userManager;
+    private readonly SysLangTextCacheService _sysLangTextCacheService;
 
     public SysDictTypeService(SqlSugarRepository<SysDictType> sysDictTypeRep,
         SysDictDataService sysDictDataService,
         SysCacheService sysCacheService,
-        UserManager userManager)
+        UserManager userManager,
+        SysLangTextCacheService sysLangTextCacheService)
     {
         _sysDictTypeRep = sysDictTypeRep;
         _sysDictDataService = sysDictDataService;
         _sysCacheService = sysCacheService;
         _userManager = userManager;
+        _sysLangTextCacheService = sysLangTextCacheService;
     }
 
     /// <summary>
@@ -35,12 +40,29 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     [DisplayName("获取字典类型分页列表")]
     public async Task<SqlSugarPagedList<SysDictType>> Page(PageDictTypeInput input)
     {
-        var query = _sysDictTypeRep.AsQueryable()
+        var langCode = _userManager.LangCode;
+        var baseQuery = _sysDictTypeRep.AsQueryable()
             .WhereIF(!_userManager.SuperAdmin, u => u.IsTenant == YesNoEnum.Y)
             .WhereIF(!string.IsNullOrEmpty(input.Code?.Trim()), u => u.Code.Contains(input.Code))
             .WhereIF(!string.IsNullOrEmpty(input.Name?.Trim()), u => u.Name.Contains(input.Name));
         //.OrderBy(u => new { u.OrderNo, u.Code })
-        return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
+        var pageList = await baseQuery.ToPagedListAsync(input.Page, input.PageSize);
+        var list = pageList.Items;
+        var ids = list.Select(d => d.Id).Distinct().ToList();
+        var translations = await _sysLangTextCacheService.GetTranslations(
+                               "SysDictType",
+                               "Name",
+                               ids,
+                               langCode);
+        foreach (var item in list)
+        {
+            if (translations.TryGetValue(item.Id, out var translatedName) && !string.IsNullOrEmpty(translatedName))
+            {
+                item.Name = translatedName;
+            }
+        }
+        pageList.Items = list;
+        return pageList;
     }
 
     /// <summary>
@@ -50,7 +72,22 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     [DisplayName("获取字典类型列表")]
     public async Task<List<SysDictType>> GetList()
     {
-        return await _sysDictTypeRep.AsQueryable().OrderBy(u => new { u.OrderNo, u.Code }).ToListAsync();
+        var langCode = _userManager.LangCode;
+        var list = await _sysDictTypeRep.AsQueryable().OrderBy(u => new { u.OrderNo, u.Code }).ToListAsync();
+        var ids = list.Select(d => d.Id).Distinct().ToList();
+        var translations = await _sysLangTextCacheService.GetTranslations(
+                               "SysDictType",
+                               "Name",
+                               ids,
+                               langCode);
+        foreach (var item in list)
+        {
+            if (translations.TryGetValue(item.Id, out var translatedName) && !string.IsNullOrEmpty(translatedName))
+            {
+                item.Name = translatedName;
+            }
+        }
+        return list;
     }
 
     /// <summary>
@@ -62,7 +99,22 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     public async Task<List<SysDictData>> GetDataList([FromQuery] GetDataDictTypeInput input)
     {
         var dictType = await _sysDictTypeRep.GetFirstAsync(u => u.Code == input.Code) ?? throw Oops.Oh(ErrorCodeEnum.D3000);
-        return await _sysDictDataService.GetDictDataListByDictTypeId(dictType.Id);
+        var langCode = _userManager.LangCode;
+        var list = await _sysDictDataService.GetDictDataListByDictTypeId(dictType.Id);
+        var ids = list.Select(d => d.Id).Distinct().ToList();
+        var translations = await _sysLangTextCacheService.GetTranslations(
+                               "SysDictType",
+                               "Name",
+                               ids,
+                               langCode);
+        foreach (var item in list)
+        {
+            if (translations.TryGetValue(item.Id, out var translatedName) && !string.IsNullOrEmpty(translatedName))
+            {
+                item.Name = translatedName;
+            }
+        }
+        return list;
     }
 
     /// <summary>
@@ -161,23 +213,50 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     [DisplayName("获取所有字典集合")]
     public async Task<dynamic> GetAllDictList()
     {
+        var langCode = _userManager.LangCode;
         var ds = await _sysDictTypeRep.AsQueryable()
             .InnerJoin(_sysDictDataService.VSysDictData, (u, w) => u.Id == w.DictTypeId)
-            .Select((u, w) => new
+            .Select((u, w) => new DictDataOutput
             {
+                DictDataId = w.Id, // 给翻译用
                 TypeCode = u.Code,
-                w.Label,
-                w.Value,
-                w.Code,
-                w.TagType,
-                w.StyleSetting,
-                w.ClassSetting,
-                w.ExtData,
-                w.Remark,
-                w.OrderNo,
+                Label = w.Label,
+                Value = w.Value,
+                Code = w.Code,
+                TagType = w.TagType,
+                StyleSetting = w.StyleSetting,
+                ClassSetting = w.ClassSetting,
+                ExtData = w.ExtData,
+                Remark = w.Remark,
+                OrderNo = w.OrderNo,
                 Status = w.Status == StatusEnum.Enable && u.Status == StatusEnum.Enable ? StatusEnum.Enable : StatusEnum.Disable
             })
             .ToListAsync();
-        return ds.OrderBy(u => u.OrderNo).GroupBy(u => u.TypeCode).ToDictionary(u => u.Key, u => u);
+        var ids = ds.Select(x => x.DictDataId).Distinct().ToList();
+
+        Dictionary<long, string> translations = new();
+        if (ids.Any())
+        {
+            translations = await _sysLangTextCacheService.GetTranslations(
+                "SysDictData",
+                "Label",
+                ids,
+                langCode
+            );
+        }
+        foreach (var item in ds)
+        {
+            if (translations.TryGetValue(item.DictDataId, out var translated) && !string.IsNullOrEmpty(translated))
+            {
+                item.Label = translated;
+            }
+        }
+
+        var result = ds
+            .OrderBy(u => u.OrderNo)
+            .GroupBy(u => u.TypeCode)
+            .ToDictionary(u => u.Key, u => u.ToList());
+
+        return result;
     }
 }

+ 1 - 1
Web/src/views/system/dict/component/editDictData.vue

@@ -11,7 +11,7 @@
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="显示文本" prop="label" :rules="[{ required: true, message: '显示文本不能为空', trigger: 'blur' }]">
-							<el-input v-model="state.ruleForm.label" placeholder="字典值" :disabled="state.isSysFlag" clearable />
+							<g-multi-lang-Input entityName="SysDictData" fieldName="Label" :entityId="state.ruleForm.id" v-model="state.ruleForm.label" placeholder="显示文本" clearable />
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">

+ 2 - 2
Web/src/views/system/dict/component/editDictType.vue

@@ -10,8 +10,8 @@
 			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto">
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="字典名称" prop="name" :rules="[{ required: true, message: '字典名称不能为空', trigger: 'blur' }]">
-							<el-input v-model="state.ruleForm.name" placeholder="字典名称" clearable />
+						<el-form-item label="字典名称" prop="name" :rules="[{ required: true, message: '字典名称不能为空', trigger: 'blur' }]">							
+							<g-multi-lang-Input entityName="SysDictType" fieldName="Name" :entityId="state.ruleForm.id" v-model="state.ruleForm.name" placeholder="字典名称" clearable />
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">

+ 1 - 1
Web/src/views/system/dict/index.vue

@@ -240,7 +240,7 @@ const handleDictType = (row: any, event: any, column: any) => {
 
 // 判断是否有权限操作
 const hasPermission = (row: any) => {
-	if (row.code?.toLowerCase().endsWith('enum')) return false;
+	//if (row.code?.toLowerCase().endsWith('enum')) return false;
 	return row?.sysFlag === 2 || userInfo.accountType === AccountTypeEnum.NUMBER_999;
 };