Ver Fonte

Merge branch 'v2' of https://gitee.com/zuohuaijun/Admin.NET into v2

# Conflicts:
#	Web/src/views/system/user/component/editUser.vue
Cyrus Zhou há 8 meses atrás
pai
commit
6af82569f5

+ 20 - 6
Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs

@@ -108,8 +108,18 @@ public class SysCacheService : IDynamicApiController, ISingleton
         using (_cacheProvider.Cache.AcquireLock($@"lock:AdGetAsync:{cacheName}", 1000))
         using (_cacheProvider.Cache.AcquireLock($@"lock:AdGetAsync:{cacheName}", 1000))
         {
         {
             var value = Get<T>(key);
             var value = Get<T>(key);
-            value ??= await ((dynamic)del).DynamicInvokeAsync(obs);
-            Set(key, value);
+            if (value == null)
+            {
+                value = await ((dynamic)del).DynamicInvoke(obs);
+                if (expiry == null)
+                {
+                    Set(key, value);
+                }
+                else
+                {
+                    Set(key, value, (TimeSpan)expiry);
+                }
+            }
             return value;
             return value;
         }
         }
     }
     }
@@ -131,15 +141,19 @@ public class SysCacheService : IDynamicApiController, ISingleton
 
 
     private T Get<T>(String cacheName, Object[] obs)
     private T Get<T>(String cacheName, Object[] obs)
     {
     {
-        var key = cacheName + ":" + obs.Aggregate(string.Empty, (current, o) => current + $"<{o}>");
+        var key = Key(cacheName, obs);
         return Get<T>(key);
         return Get<T>(key);
     }
     }
 
 
     private static string Key(string cacheName, object[] obs)
     private static string Key(string cacheName, object[] obs)
     {
     {
-        if (obs.OfType<TimeSpan>().Any()) throw new Exception("缓存参数类型不能能是:TimeSpan类型");
-        StringBuilder sb = new(cacheName + ":");
-        foreach (var a in obs) sb.Append($"<{KeySingle(a)}>");
+        if (obs.OfType<TimeSpan>().Any()) throw new Exception("缓存参数类型不能是:TimeSpan类型");
+        StringBuilder sb = new(cacheName);
+        if (obs is { Length: > 0 })
+        {
+            sb.Append(':');
+            foreach (var a in obs) sb.Append($"<{KeySingle(a)}>");
+        }
         return sb.ToString();
         return sb.ToString();
     }
     }
 
 

+ 1 - 1
Web/src/api-services/models/org-tree-output.ts

@@ -12,7 +12,7 @@
  * Do not edit the class manually.
  * Do not edit the class manually.
  */
  */
 
 
-import { OrgTreeOutput } from './org-tree-output';
+//import { OrgTreeOutput } from './org-tree-output';
  /**
  /**
  * 机构树形输出
  * 机构树形输出
  *
  *

+ 1 - 1
Web/src/api-services/models/sys-org.ts

@@ -13,7 +13,7 @@
  */
  */
 
 
 import { StatusEnum } from './status-enum';
 import { StatusEnum } from './status-enum';
-import { SysOrg } from './sys-org';
+//import { SysOrg } from './sys-org';
  /**
  /**
  * 系统机构表
  * 系统机构表
  *
  *

+ 1 - 1
Web/src/api-services/models/update-user-input.ts

@@ -33,7 +33,7 @@ export interface UpdateUserInput {
      * @type {number}
      * @type {number}
      * @memberof UpdateUserInput
      * @memberof UpdateUserInput
      */
      */
-    id?: number;
+    id: number;
 
 
     /**
     /**
      * 创建时间
      * 创建时间

+ 1 - 1
Web/src/components/table/search.vue

@@ -237,7 +237,7 @@ const shortcuts = [
 }
 }
 
 
 .table-search-btn {
 .table-search-btn {
-    width: 184px;
+    flex-shrink: 0;
 
 
     // 右侧查询重置按钮随展开垂直居中
     // 右侧查询重置按钮随展开垂直居中
     // .el-form--inline {
     // .el-form--inline {

+ 1 - 1
Web/src/main.ts

@@ -6,7 +6,7 @@ import router from '/@/router';
 import { directive } from '/@/directive/index';
 import { directive } from '/@/directive/index';
 import other from '/@/utils/other';
 import other from '/@/utils/other';
 import ElementPlus from 'element-plus';
 import ElementPlus from 'element-plus';
-import { ElTooltip, ElTable } from 'element-plus'
+import { ElTooltip } from 'element-plus'
 import '/@/theme/index.scss';
 import '/@/theme/index.scss';
 // 动画库
 // 动画库
 import 'animate.css';
 import 'animate.css';

+ 14 - 0
Web/src/theme/dark.scss

@@ -16,6 +16,20 @@
 	--next-color-hover: #3c3c3c;
 	--next-color-hover: #3c3c3c;
 	--next-color-hover-rgba: rgba(0, 0, 0, 0.3);
 	--next-color-hover-rgba: rgba(0, 0, 0, 0.3);
 
 
+    // Empty
+    .el-empty {
+        --el-empty-fill-color-0: var('(--el-color-black') !important;
+        --el-empty-fill-color-1: #4b4b52 !important;
+        --el-empty-fill-color-2: #36383d !important;
+        --el-empty-fill-color-3: #1e1e20 !important;
+        --el-empty-fill-color-4: #262629 !important;
+        --el-empty-fill-color-5: #202124 !important;
+        --el-empty-fill-color-6: #212224 !important;
+        --el-empty-fill-color-7: #1b1c1f !important;
+        --el-empty-fill-color-8: #1c1d1f !important;
+        --el-empty-fill-color-9: #18181a !important;
+    }
+
 	// root
 	// root
 	--next-bg-main-color: var(--next-bg-main) !important;
 	--next-bg-main-color: var(--next-bg-main) !important;
 	--next-bg-topBar: var(--next-color-disabled) !important;
 	--next-bg-topBar: var(--next-color-disabled) !important;

+ 5 - 1
Web/src/theme/element.scss

@@ -53,7 +53,7 @@
 		// 	margin-bottom: 18px !important;
 		// 	margin-bottom: 18px !important;
 		// }
 		// }
 
 
-        .el-form-item--small.el-form-item,.el-form-item:last-of-type {
+        .el-form-item,.el-form-item:last-of-type {
             margin: 5px 15px !important;
             margin: 5px 15px !important;
         }
         }
 	}
 	}
@@ -371,6 +371,10 @@
 .el-card__body {
 .el-card__body {
 	padding: 8px;
 	padding: 8px;
 }
 }
+   // 由于card没有size属性,所以通过其子元素来判断,当组件大小选择为默认时
+.el-card__body:has(.el-table--default) {
+    padding: 20px;
+}
 
 
 /* Table 表格 element plus 2.2.0 版本
 /* Table 表格 element plus 2.2.0 版本
 ------------------------------- */
 ------------------------------- */

+ 2 - 2
Web/src/views/system/codeGen/component/editCodeGenDialog.vue

@@ -207,7 +207,7 @@ onMounted(async () => {
 
 
 // db改变
 // db改变
 const dbChanged = async () => {
 const dbChanged = async () => {
-	if (state.ruleForm.configId === '') return;
+	if (!state.ruleForm.configId) return;
     state.tableData = await getAPI(SysCodeGenApi).apiSysCodeGenTableListConfigIdGet(state.ruleForm.configId as string).then(res => res.data.result ?? []);
     state.tableData = await getAPI(SysCodeGenApi).apiSysCodeGenTableListConfigIdGet(state.ruleForm.configId as string).then(res => res.data.result ?? []);
 
 
 	let db = state.dbData.filter((u: any) => u.configId == state.ruleForm.configId);
 	let db = state.dbData.filter((u: any) => u.configId == state.ruleForm.configId);
@@ -232,7 +232,7 @@ const changeTableUniqueColumn = (value: any, index: number) => {
 }
 }
 
 
 const getColumnInfoList = async () => {
 const getColumnInfoList = async () => {
-	if (state.ruleForm.configId == '' || state.ruleForm.tableName == '') return;
+	if (!state.ruleForm.configId || !state.ruleForm.tableName) return;
   state.columnData = await getAPI(SysCodeGenApi)
   state.columnData = await getAPI(SysCodeGenApi)
       .apiSysCodeGenColumnListByTableNameTableNameConfigIdGet(state.ruleForm.tableName, state.ruleForm.configId)
       .apiSysCodeGenColumnListByTableNameTableNameConfigIdGet(state.ruleForm.tableName, state.ruleForm.configId)
       .then(res => res.data.result)
       .then(res => res.data.result)

+ 1 - 1
Web/src/views/system/database/component/genSeedData.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
 	<div class="sys-dbEntity-container">
 	<div class="sys-dbEntity-container">
-		<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="700px" v-loading="state.loading">
+		<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="700px">
 			<template #header>
 			<template #header>
 				<div style="color: #fff">
 				<div style="color: #fff">
 					<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Cpu /> </el-icon>
 					<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Cpu /> </el-icon>

+ 7 - 6
Web/src/views/system/user/component/editUser.vue

@@ -63,7 +63,7 @@
 							</el-divider>
 							</el-divider>
 							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 								<el-form-item label="所属机构" prop="orgId" :rules="[{ required: true, message: '所属机构不能为空', trigger: 'blur' }]">
 								<el-form-item label="所属机构" prop="orgId" :rules="[{ required: true, message: '所属机构不能为空', trigger: 'blur' }]">
-									<el-cascader :options="state.orgData" :props="cascaderProps" placeholder="所属机构" clearable filterable class="w100" v-model="state.ruleForm.orgId">
+									<el-cascader :options="state.orgTreeData" :props="cascaderProps" placeholder="所属机构" clearable filterable class="w100" v-model="state.ruleForm.orgId">
 										<template #default="{ node, data }">
 										<template #default="{ node, data }">
 											<span>{{ data.name }}</span>
 											<span>{{ data.name }}</span>
 											<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
 											<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
@@ -109,7 +109,7 @@
 													<el-button icon="ele-Delete" type="danger" circle plain size="small" @click="deleteExtOrgRow(k)" />
 													<el-button icon="ele-Delete" type="danger" circle plain size="small" @click="deleteExtOrgRow(k)" />
 													<span class="ml5">机构</span>
 													<span class="ml5">机构</span>
 												</template>
 												</template>
-												<el-cascader :options="props.orgData" :props="cascaderProps" placeholder="机构组织" clearable filterable class="w100" v-model="state.ruleForm.extOrgIdList[k].orgId">
+												<el-cascader :options="props.orgTreeData" :props="cascaderProps" placeholder="机构组织" clearable filterable class="w100" v-model="state.ruleForm.extOrgIdList[k].orgId">
 													<template #default="{ node, data }">
 													<template #default="{ node, data }">
 														<span>{{ data.name }}</span>
 														<span>{{ data.name }}</span>
 														<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
 														<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
@@ -232,12 +232,13 @@ import { storeToRefs } from 'pinia';
 import { useUserInfo } from '/@/stores/userInfo';
 import { useUserInfo } from '/@/stores/userInfo';
 import { getAPI } from '/@/utils/axios-utils';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysPosApi, SysRoleApi, SysUserApi } from '/@/api-services/api';
 import { SysPosApi, SysRoleApi, SysUserApi } from '/@/api-services/api';
-import {AccountTypeEnum, RoleOutput, SysOrg, SysPos, UpdateUserInput} from '/@/api-services/models';
+import {AccountTypeEnum, RoleOutput, OrgTreeOutput, SysPos, UpdateUserInput} from '/@/api-services/models';
 import { useLangStore } from '/@/stores/useLangStore';
 import { useLangStore } from '/@/stores/useLangStore';
 const langStore = useLangStore();
 const langStore = useLangStore();
+
 const props = defineProps({
 const props = defineProps({
 	title: String,
 	title: String,
-	orgData: Array<SysOrg>,
+	orgTreeData: Array<OrgTreeOutput>,
 });
 });
 const emits = defineEmits(['handleQuery']);
 const emits = defineEmits(['handleQuery']);
 const ruleFormRef = ref();
 const ruleFormRef = ref();
@@ -247,7 +248,7 @@ const state = reactive({
 	loading: false,
 	loading: false,
 	isShowDialog: false,
 	isShowDialog: false,
 	selectedTabName: '0', // 选中的 tab 页
 	selectedTabName: '0', // 选中的 tab 页
-	orgData: [] as Array<SysOrg>,
+	orgTreeData: [] as Array<OrgTreeOutput>,
 	ruleForm: {} as UpdateUserInput,
 	ruleForm: {} as UpdateUserInput,
 	posData: [] as Array<SysPos>, // 职位数据
 	posData: [] as Array<SysPos>, // 职位数据
 	roleData: [] as Array<RoleOutput>, // 角色数据
 	roleData: [] as Array<RoleOutput>, // 角色数据
@@ -271,7 +272,7 @@ onMounted(async () => {
 
 
 // 打开弹窗
 // 打开弹窗
 const openDialog = async (row: any) => {
 const openDialog = async (row: any) => {
-	state.orgData = (row.tenantId ? props.orgData?.filter((e) => e.tenantId === row.tenantId) : props.orgData) ?? [];
+	state.orgTreeData = (row.tenantId ? props.orgTreeData?.filter((e) => e.tenantId === row.tenantId) : props.orgTreeData) ?? [];
 	state.posData = (row.tenantId ? state.posData?.filter((e) => e.tenantId === row.tenantId) : state.posData) ?? [];
 	state.posData = (row.tenantId ? state.posData?.filter((e) => e.tenantId === row.tenantId) : state.posData) ?? [];
 	state.roleData = (row.tenantId ? state.roleData?.filter((e) => e.tenantId === row.tenantId) : state.roleData) ?? [];
 	state.roleData = (row.tenantId ? state.roleData?.filter((e) => e.tenantId === row.tenantId) : state.roleData) ?? [];
 	ruleFormRef.value?.resetFields();
 	ruleFormRef.value?.resetFields();

+ 22 - 17
Web/src/views/system/user/index.vue

@@ -97,30 +97,34 @@
 										style="padding-left: 12px" />
 										style="padding-left: 12px" />
 									<template #dropdown>
 									<template #dropdown>
 										<el-dropdown-menu>
 										<el-dropdown-menu>
-											<el-dropdown-item icon="ele-CopyDocument" text type="primary"
-												v-auth="'sysUser:add'"
-												@click="openCopyMenu(scope.row)">复制</el-dropdown-item>
-											<el-dropdown-item icon="ele-RefreshLeft" text type="danger"
-												v-auth="'sysUser:resetPwd'" @click="resetUserPwd(scope.row)">重置密码
-											</el-dropdown-item>
-											<el-dropdown-item icon="ele-Unlock" text type="primary"
-												v-auth="'sysUser:unlockLogin'" @click="unlockLogin(scope.row)">解除锁定
-											</el-dropdown-item>
+                                            <span v-auth="'sysUser:add'">
+                                                <el-dropdown-item icon="ele-CopyDocument" text type="primary"
+                                                    @click="openCopyMenu(scope.row)"
+                                                >复制</el-dropdown-item>
+                                            </span>
+											<span v-auth="'sysUser:resetPwd'">
+                                                <el-dropdown-item icon="ele-RefreshLeft" text type="danger"
+												    @click="resetUserPwd(scope.row)"
+                                                 >重置密码</el-dropdown-item>
+                                            </span>
+											<span v-auth="'sysUser:unlockLogin'">
+                                                <el-dropdown-item icon="ele-Unlock" text type="primary"
+												    @click="unlockLogin(scope.row)"
+                                                >解除锁定</el-dropdown-item>
+                                            </span>
+											
 										</el-dropdown-menu>
 										</el-dropdown-menu>
 									</template>
 									</template>
 								</el-dropdown>
 								</el-dropdown>
 							</template>
 							</template>
 						</el-table-column>
 						</el-table-column>
 					</el-table>
 					</el-table>
-					<el-pagination v-model:currentPage="state.tableParams.page"
-						v-model:page-size="state.tableParams.pageSize" :total="state.tableParams.total"
-						:page-sizes="[10, 20, 50, 100]" size="small" background @size-change="handleSizeChange"
-						@current-change="handleCurrentChange" layout="total, sizes, prev, pager, next, jumper" />
+					<el-pagination v-model:currentPage="state.tableParams.page" @current-change="handleCurrentChange" layout="total, sizes, prev, pager, next, jumper" />
 				</el-card>
 				</el-card>
 			</el-splitter-panel>
 			</el-splitter-panel>
 		</el-splitter>
 		</el-splitter>
 
 
-		<EditUser ref="editUserRef" :title="state.editUserTitle" :orgData="state.orgTreeData" @handleQuery="handleQuery" />
+		<EditUser ref="editUserRef" :title="state.editUserTitle" :orgTreeData="state.orgTreeData" @handleQuery="handleQuery" />
 	</div>
 	</div>
 </template>
 </template>
 
 
@@ -130,12 +134,12 @@ import { ElMessageBox, ElMessage } from 'element-plus';
 import OrgTree from '/@/views/system/org/component/orgTree.vue';
 import OrgTree from '/@/views/system/org/component/orgTree.vue';
 import EditUser from '/@/views/system/user/component/editUser.vue';
 import EditUser from '/@/views/system/user/component/editUser.vue';
 import ModifyRecord from '/@/components/table/modifyRecord.vue';
 import ModifyRecord from '/@/components/table/modifyRecord.vue';
-import CallBar from '/@/components/callTel/callBar.vue';
+//import CallBar from '/@/components/callTel/callBar.vue';
 //import { Splitpanes, Pane } from 'splitpanes';
 //import { Splitpanes, Pane } from 'splitpanes';
 import 'splitpanes/dist/splitpanes.css';
 import 'splitpanes/dist/splitpanes.css';
 import { getAPI } from '/@/utils/axios-utils';
 import { getAPI } from '/@/utils/axios-utils';
 import { SysUserApi, SysOrgApi } from '/@/api-services/api';
 import { SysUserApi, SysOrgApi } from '/@/api-services/api';
-import { SysUser, UpdateUserInput, OrgOutput } from '/@/api-services/models';
+import { SysUser, UpdateUserInput, OrgTreeOutput } from '/@/api-services/models';
 
 
 const orgTreeRef = ref<InstanceType<typeof OrgTree>>();
 const orgTreeRef = ref<InstanceType<typeof OrgTree>>();
 const editUserRef = ref<InstanceType<typeof EditUser>>();
 const editUserRef = ref<InstanceType<typeof EditUser>>();
@@ -143,7 +147,7 @@ const state = reactive({
 	loading: false,
 	loading: false,
 	tenantList: [] as Array<any>,
 	tenantList: [] as Array<any>,
 	userData: [] as Array<SysUser>,
 	userData: [] as Array<SysUser>,
-	orgTreeData: [] as Array<OrgOutput>,
+	orgTreeData: [] as Array<OrgTreeOutput>,
 	queryParams: {
 	queryParams: {
 		orgId: -1,
 		orgId: -1,
 		account: undefined,
 		account: undefined,
@@ -170,6 +174,7 @@ const loadOrgData = async () => {
 	state.loading = true;
 	state.loading = true;
 	let res = await getAPI(SysOrgApi).apiSysOrgTreeGet(0);
 	let res = await getAPI(SysOrgApi).apiSysOrgTreeGet(0);
 	state.orgTreeData = res.data.result ?? [];
 	state.orgTreeData = res.data.result ?? [];
+	console.log('🚀 → index.vue:173 → loadOrgData → state.orgTreeData:', state.orgTreeData);
 	state.loading = false;
 	state.loading = false;
 };
 };