yzp 2 лет назад
Родитель
Сommit
39dec6bb96

+ 4 - 1
Admin.NET/Admin.NET.Application/Configuration/Cache.json

@@ -3,6 +3,9 @@
 
   "Cache": {
     "CacheType": "Memory", // Memory、Redis
-    "RedisConnectionString": "server=127.0.0.1:6379;password=;db=5;" // Redis连接字符串
+    "Redis": {
+      "Configuration": "server=127.0.0.1:6379;password=;db=5;", // Redis连接字符串
+      "Prefix": "adminnet_" // Redis前缀
+    }
   }
 }

+ 5 - 3
Admin.NET/Admin.NET.Core/Cache/CacheSetup.cs

@@ -22,9 +22,11 @@ public static class CacheSetup
         var cacheOptions = App.GetOptions<CacheOptions>();
         if (cacheOptions.CacheType == CacheTypeEnum.Redis.ToString())
         {
-            var redis = new FullRedis();
-            redis.Init(cacheOptions.RedisConnectionString);
-            cache = redis;
+            cache = new FullRedis(new RedisOptions
+            {
+                Configuration = cacheOptions.Redis.Configuration,
+                Prefix = cacheOptions.Redis.Prefix
+            });
         }
 
         services.AddSingleton(cache);

+ 5 - 1
Admin.NET/Admin.NET.Core/Cache/SqlSugarCache.cs

@@ -14,7 +14,11 @@ namespace Admin.NET.Core;
 /// </summary>
 public class SqlSugarCache : ICacheService
 {
-    private static readonly ICache _cache = App.GetService(typeof(ICache)) as ICache;
+    /// <summary>
+    /// 内存缓存
+    /// </summary>
+    //private static readonly ICache _cache = App.GetService(typeof(ICache)) as ICache;
+    private static readonly ICache _cache = Cache.Default;
 
     public void Add<V>(string key, V value)
     {

+ 9 - 2
Admin.NET/Admin.NET.Core/Option/CacheOptions.cs

@@ -20,7 +20,14 @@ public sealed class CacheOptions : IConfigurableOptions
     public string CacheType { get; set; }
 
     /// <summary>
-    /// Redis连接字符串
+    /// Redis缓存
     /// </summary>
-    public string RedisConnectionString { get; set; }
+    public RedisOption Redis { get; set; }
+}
+
+/// <summary>
+/// Redis缓存
+/// </summary>
+public sealed class RedisOption : RedisOptions
+{
 }

+ 2 - 2
Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs

@@ -123,9 +123,9 @@ public class SysCacheService : IDynamicApiController, ISingleton
     /// <param name="key"></param>
     /// <returns></returns>
     [DisplayName("获取缓存值")]
-    public dynamic GetValue(string key)
+    public object GetValue(string key)
     {
-        return _cache.Get<dynamic>(key);
+        return _cache.Get<object>(key);
     }
 
     /// <summary>

+ 2 - 1
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs

@@ -36,8 +36,9 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
             .Select<CodeGenConfig>()
             .Mapper(u =>
             {
-                u.NetType = (u.EffectType == "EnumSelector" ? u.DictTypeCode : u.NetType);
+                u.NetType = (u.EffectType == "EnumSelector" || u.EffectType == "ConstSelector" ? u.DictTypeCode : u.NetType);
             })
+
             .OrderBy(u => u.OrderNo)
             .ToListAsync();
     }

+ 3 - 2
Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs

@@ -165,12 +165,13 @@ public class SysFileService : IDynamicApiController, ITransient
         if (file == null) throw Oops.Oh(ErrorCodeEnum.D8000);
 
         // 判断是否重复上传的文件
-        string? fileMd5 = null;
+        var fileMd5 = string.Empty;
         if (_uploadOptions.EnableMd5)
         {
             using var fileStream = file.OpenReadStream();
             fileMd5 = OssUtils.ComputeContentMd5(fileStream, fileStream.Length);
-            if (await _sysFileRep.IsAnyAsync(q => q.FileMd5 == fileMd5)) throw Oops.Oh(ErrorCodeEnum.D8004);
+            var sysFile = await _sysFileRep.GetFirstAsync(q => q.FileMd5 == fileMd5);
+            if (sysFile != null) return sysFile;
         }
 
         var path = savePath;

+ 2 - 2
Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs

@@ -61,14 +61,14 @@ public class SysOrgService : IDynamicApiController, ITransient
                 .ToListAsync();
         }
 
+        var sysOrg = await _sysOrgRep.GetSingleAsync(u => u.Id == input.Id);
         var orgTree = new List<SysOrg>();
         if (_userManager.SuperAdmin)
         {
-            orgTree = await iSugarQueryable.ToTreeAsync(u => u.Children, u => u.Pid, 0);
+            orgTree = await iSugarQueryable.ToTreeAsync(u => u.Children, u => u.Pid, sysOrg?.Pid);
         }
         else
         {
-            var sysOrg = await _sysOrgRep.GetSingleAsync(u => u.Id == input.Id);
             orgTree = await iSugarQueryable.ToTreeAsync(u => u.Children, u => u.Pid, sysOrg?.Pid, userOrgIdList.Select(d => (object)d).ToArray());
             // 递归禁用没权限的机构(防止用户修改或创建无权的机构和用户)
             HandlerOrgTree(orgTree, userOrgIdList);

+ 59 - 7
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue.vm

@@ -1,4 +1,5 @@
-<template>
+@{Dictionary<string, int> definedObjects = new Dictionary<string, int>();}
+<template>
 	<div class="@(@Model.LowerClassName)-container">
 		<el-dialog v-model="isShowDialog" :title="props.title" :width="800" draggable="">
 			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="130px" :rules="rules">
@@ -21,6 +22,26 @@
 						</el-form-item>
 						@:
 					</el-col>
+					}else if(@column.EffectType == "ApiTreeSelect"){
+					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						@:<el-form-item label="@column.ColumnComment" prop="@(@column.LowerColumnName)">
+							<el-cascader
+								@:options="@LowerFirstLetter(@column.FkEntityName)TreeData"
+								@:props="{ checkStrictly: true, emitPath: false, value: '@LowerFirstLetter(@column.ValueColumn)', label: '@LowerFirstLetter(@column.DisplayColumn)' }"
+								placeholder="请选择@(column.ColumnComment)"
+								clearable=""
+								class="w100"
+								@:v-model="ruleForm.@(column.LowerColumnName)"
+							>
+								<template #default="{ node, data }">
+									<span>{{ data.name }}</span>
+									<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+								</template>
+							</el-cascader>
+							@:
+						</el-form-item>
+						@:
+					</el-col>
 					}else if(@column.EffectType == "Input"){
 					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						@:<el-form-item label="@column.ColumnComment" prop="@(@column.LowerColumnName)">
@@ -60,7 +81,7 @@
 					@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						@:<el-form-item label="@column.ColumnComment" prop="@(@column.LowerColumnName)">
 							@:<el-select clearable v-model="ruleForm.@(@column.LowerColumnName)" placeholder="请选择@(@column.ColumnComment)">
-								@:<el-option v-for="(item,index) in getSelectorList('@column.DictTypeCode')" :key="index" :value="item.code">{{ item.name }}</el-option>
+								@:<el-option v-for="(item,index) in @LowerFirstLetter(@column.DictTypeCode)DropdownList" :key="index" :label="item.name" :value="item.code">{{ item.name }}</el-option>
 								@:
 							</el-select>
 							@:
@@ -124,13 +145,20 @@
 	import { ref,onMounted } from "vue";
 	import { ElMessage } from "element-plus";
 	import type { FormRules } from "element-plus";
-	@if(@Model.TableField.Any(x=>x.EffectType == "Upload")){
-	@:import { Plus } from "@@element-plus/icons-vue";
-	@:import { UploadRequestOptions } from "element-plus";
-	@:import {@string.Join(",",Model.TableField.Where(x=>x.EffectType == "Upload").Select(x=>"upload"+x.ColumnName).ToList())} from '/@@/api/main/@(@Model.LowerClassName)';
+@if(@Model.TableField.Any(x=>x.EffectType == "ConstSelector")){
+	@:import { getConstSelectorList } from "/@@/utils/constHelper";
 	}
+@if(@Model.TableField.Any(x=>x.EffectType == "Upload")){
+    @:import { Plus } from "@@element-plus/icons-vue";
+    @:import { UploadRequestOptions } from "element-plus";
+    @:import {@string.Join(",",Model.TableField.Where(x=>x.EffectType == "Upload").Select(x=>"upload"+x.ColumnName).ToList())} from '/@@/api/main/@(@Model.LowerClassName)';
+}
 	import { add@(@Model.ClassName), update@(@Model.ClassName) } from "/@@/api/main/@(@Model.LowerClassName)";
 	@foreach (var column in Model.TableField){
+	if(@column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("import__@(@column.FkEntityName)Tree")){
+	@{definedObjects.Add("import__@(@column.FkEntityName)Tree", 1);}
+	@:import { get@(@column.FkEntityName)Tree } from '/@@/api/main/@(@Model.LowerClassName)';
+	}
 	if(@column.EffectType == "fk"){
 	@:import { get@(@column.FkEntityName)@(@column.ColumnName)Dropdown } from '/@@/api/main/@(@Model.LowerClassName)';
 	}
@@ -228,6 +256,30 @@ const submit = async () => {
   }
 }
 
+@foreach (var column in Model.TableField){
+  if(@column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("define_get@(@column.FkEntityName)TreeData")){
+	@{definedObjects.Add("define_get@(@column.FkEntityName)TreeData", 1);}
+@:const @LowerFirstLetter(@column.FkEntityName)TreeData = ref<any>([]); 
+@:const get@(@column.FkEntityName)TreeData = async () => {
+    @:let list = await get@(@column.FkEntityName)Tree();
+    @:@LowerFirstLetter(@column.FkEntityName)TreeData.value = list.data.result ?? [];
+@:};
+@:get@(@column.FkEntityName)TreeData();
+@:
+  }
+  else if(@column.EffectType == "ConstSelector"){   
+@:const @LowerFirstLetter(@column.DictTypeCode)DropdownList = ref<any>([]); 
+@:const get@(@column.DictTypeCode)DropdownList = async () => {
+	@:let list = await getConstSelectorList("@column.DictTypeCode");
+	@:@LowerFirstLetter(@column.DictTypeCode)DropdownList.value = list.data.result ?? [];
+@:};
+@:get@(@column.DictTypeCode)DropdownList();
+@:
+  }
+}
+
+
+
 @foreach (var column in Model.TableField){ 
 if(column.WhetherAddUpdate=="N") continue;
 if(@column.EffectType == "Upload"){
@@ -243,7 +295,7 @@ if(@column.EffectType == "Upload"){
 onMounted(async () => {
 	@foreach (var column in Model.TableField){
 	if(@column.EffectType == "Select"){
-	     @:getEdit@(@column.LowerColumnName)Data.value= await dictTypeDataList('@(@column.DictTypeCode)');
+	@:getEdit@(@column.LowerColumnName)Data.value= await dictTypeDataList('@(@column.DictTypeCode)');
 	 }
 	}
 });

+ 1 - 1
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm

@@ -95,7 +95,7 @@
             @:<el-tag v-if="scope.row.@(@column.LowerColumnName)"> 是 </el-tag>
             @:<el-tag type="danger" v-else=""> 否 </el-tag>
             }else if(@column.EffectType == "ConstSelector"){
-            @:<span>{{codeToName(scope.row.@(@column.LowerColumnName), '@(@column.DictTypeCode)')}</span>
+            @:<span>{{codeToName(scope.row.@(@column.LowerColumnName), '@(@column.DictTypeCode)')}}</span>
             }
             @:
           </template>

+ 1 - 1
Web/src/layout/navBars/topBar/user.vue

@@ -55,7 +55,7 @@
 		<el-dropdown :show-timeout="70" :hide-timeout="50" @command="onHandleCommandClick">
 			<span class="layout-navbars-breadcrumb-user-link">
 				<img :src="userInfos.avatar" class="layout-navbars-breadcrumb-user-link-photo mr5" />
-				{{ userInfos.account === '' ? 'common' : userInfos.account }}
+				{{ userInfos.realName == '' ? userInfos.account: userInfos.realName }}
 				<el-icon class="el-icon--right">
 					<ele-ArrowDown />
 				</el-icon>

+ 8 - 0
Web/src/utils/constHelper.ts

@@ -1,5 +1,6 @@
 import type { App } from 'vue';
 import { useUserInfo } from '/@/stores/userInfo';
+import request from '/@/utils/request';
 
 export function setupConstFilter(app: App) {
 	// 全局过滤器  在vue文件中调用  $filters.codeToName(code,type)
@@ -30,3 +31,10 @@ export function getConstType(type: any) {
 	const constType = userStore.constList.filter((x: any) => x.code === type)[0].data;
 	return constType;
 }
+
+export function getConstSelectorList(typeName: string) {
+	return request({
+		url: `/api/sysConst/data/${typeName}`,
+		method: 'get',
+	});
+}

+ 14 - 2
Web/src/views/system/cache/index.vue

@@ -29,7 +29,7 @@
 				<el-card shadow="hover" header="缓存数据" v-loading="state.loading1" class="mt8">
 					<template #header>
 						<div class="card-header">
-							<span>{{ `缓存数据${state.cacheKey ? ` - ${state.cacheKey}` : ''}` }}</span>
+							<span>{{ `缓存数据${state.cacheKey ? `【${state.cacheKey}】` : ''}` }}</span>
 							<el-button icon="ele-Delete" size="small" type="danger" @click="delCache" v-auth="'sysCache:delete'"> 删除缓存 </el-button>
 						</div>
 					</template>
@@ -56,7 +56,7 @@ const state = reactive({
 	loading: false,
 	loading1: false,
 	cacheData: [] as any,
-	cacheValue: undefined,
+	cacheValue: undefined as any,
 	cacheKey: undefined,
 });
 
@@ -127,6 +127,18 @@ const nodeClick = async (node: any) => {
 	state.cacheValue = res.data.result;
 	state.cacheKey = node.id;
 	state.loading1 = false;
+
+	// var result = res.data.result;
+	// try {
+	// 	var obj = JSON.parse(result);
+	// 	if (typeof obj === 'object' && obj) {
+	// 		state.cacheValue = obj;
+	// 	} else {
+	// 		state.cacheValue = result;
+	// 	}
+	// } catch (e) {
+	// 	state.cacheValue = result;
+	// }
 };
 </script>