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

!1916 修复 PostgreSQL 并启用 驼峰转下划线 时,报某些字段不存在错误
Merge pull request !1916 from 夜鹰/v2

zuohuaijun 8 месяцев назад
Родитель
Сommit
920daa5972

+ 7 - 7
Admin.NET/Admin.NET.Core/Enum/GenderEnum.cs

@@ -13,9 +13,9 @@ namespace Admin.NET.Core;
 public enum GenderEnum
 {
     /// <summary>
-    /// 未知的性别
+    /// 未知
     /// </summary>
-    [Description("未知的性别"), Theme("info")]
+    [Description("未知"), Theme("info")]
     Unknown = 0,
 
     /// <summary>
@@ -30,9 +30,9 @@ public enum GenderEnum
     [Description("女性"), Theme("danger")]
     Female = 2,
 
-    /// <summary>
-    /// 未说明的性别
-    /// </summary>
-    [Description("未说明的性别"), Theme("warning")]
-    Unspecified = 9
+    ///// <summary>
+    ///// 未说明的性别
+    ///// </summary>
+    //[Description("未说明的性别"), Theme("warning")]
+    //Unspecified = 9
 }

+ 7 - 2
Admin.NET/Admin.NET.Core/Service/APIJSON/SelectTable.cs

@@ -473,12 +473,17 @@ public class SelectTable : ISingleton
             // 判断列表是否有权限  sum(1)、sum(*)、Count(1)这样的值直接有效
             if (colName == "*" || int.TryParse(colName, out int colNumber) || (IsCol(subtable, colName) && _identitySvc.ColIsRole(colName, selectrole.Split(','))))
             {
+                // 字段名加引号,防止和SQL关键字冲突(mysql为反引号)
+                string qm = "\"";
+                if (tb.Context.CurrentConnectionConfig.DbType is SqlSugar.DbType.MySql)
+                    qm = "`";
+
                 if (ziduan.Length > 1)
                 {
                     if (ziduan[1].Length > 20)
                         throw new Exception("别名不能超过20个字符");
 
-                    str.Append(ziduan[0] + " as `" + ReplaceSQLChar(ziduan[1]) + "`,");
+                    str.Append(ziduan[0] + " as " + qm + ReplaceSQLChar(ziduan[1]) + qm + ",");
                 }
                 // 不对函数加``,解决sum(*)、Count(1)等不能使用的问题
                 else if (ziduan[0].Contains('('))
@@ -486,7 +491,7 @@ public class SelectTable : ISingleton
                     str.Append(ziduan[0] + ",");
                 }
                 else
-                    str.Append("`" + ziduan[0] + "`" + ",");
+                    str.Append(qm + ziduan[0] + qm + ",");
             }
         }
         if (string.IsNullOrEmpty(str.ToString()))

+ 8 - 2
Admin.NET/Admin.NET.Core/Service/Config/SysTenantConfigService.cs

@@ -27,8 +27,14 @@ public class SysTenantConfigService : IDynamicApiController, ITransient
         _sysCacheService = sysCacheService;
         _sysConfigRep = sysConfigRep;
         _sysConfigDataRep = sysConfigDataRep;
-        VSysConfig = _sysConfigRep.AsQueryable().InnerJoin(_sysConfigDataRep.AsQueryable().WhereIF(!_userManager.SuperAdmin, cv => cv.TenantId == _userManager.TenantId),
-            (c, cv) => c.Id == cv.ConfigId).Select<SysConfig>().MergeTable();
+        VSysConfig = _sysConfigRep.AsQueryable()
+            .InnerJoin(
+                _sysConfigDataRep.AsQueryable().WhereIF(!_userManager.SuperAdmin, cv => cv.TenantId == _userManager.TenantId),
+                (c, cv) => c.Id == cv.ConfigId
+            )
+            //.Select<SysConfig>().MergeTable();
+            // 解决PostgreSQL下并启用驼峰转下划线时,报字段不存在,SqlSugar在Select后生成的sql, as后没转下划线导致.
+            .SelectMergeTable((c, cv) => new SysConfig { Id = c.Id.SelectAll(), Value = cv.Value });
     }
 
     /// <summary>

+ 8 - 2
Admin.NET/Admin.NET.Core/Service/Config/SysUserConfigService.cs

@@ -27,8 +27,14 @@ public class SysUserConfigService : IDynamicApiController, ITransient
         _sysCacheService = sysCacheService;
         _sysConfigRep = sysConfigRep;
         _sysConfigDataRep = sysConfigDataRep;
-        VSysConfig = _sysConfigRep.AsQueryable().LeftJoin(_sysConfigDataRep.AsQueryable().WhereIF(_userManager.SuperAdmin, cv => cv.UserId == _userManager.UserId),
-            (c, cv) => c.Id == cv.ConfigId).Select<SysConfig>().MergeTable();
+        VSysConfig = _sysConfigRep.AsQueryable()
+            .LeftJoin(
+                _sysConfigDataRep.AsQueryable().WhereIF(_userManager.SuperAdmin, cv => cv.UserId == _userManager.UserId),
+                (c, cv) => c.Id == cv.ConfigId
+            )
+            //.Select<SysConfig>().MergeTable();
+            // 解决PostgreSQL下并启用驼峰转下划线时,报字段不存在,SqlSugar在Select后生成的sql, as后没转下划线导致.
+            .SelectMergeTable((c, cv) => new SysConfig { Id = c.Id.SelectAll(), Value = cv.Value });
     }
 
     /// <summary>

+ 0 - 2
Web/src/api-services/models/sys-menu.ts

@@ -14,7 +14,6 @@
 
 import { MenuTypeEnum } from './menu-type-enum';
 import { StatusEnum } from './status-enum';
-import { SysMenu } from './sys-menu';
  /**
  * 系统菜单表
  *
@@ -22,7 +21,6 @@ import { SysMenu } from './sys-menu';
  * @interface SysMenu
  */
 export interface SysMenu {
-
     /**
      * 雪花Id
      *

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

@@ -117,12 +117,12 @@
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="生成方式" prop="generateType">
-              <g-sys-dict v-model="state.ruleForm.generateType" code="code_gen_create_type" render-as="select" class="w100" filterable />
+                            <g-sys-dict v-model="state.ruleForm.generateType" code="code_gen_create_type" render-as="select" class="w100" filterable />
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="支持打印" prop="printType">
-              <g-sys-dict v-model="state.ruleForm.printType" code="code_gen_print_type" render-as="select" @change="printTypeChanged" class="w100" filterable />
+                            <g-sys-dict v-model="state.ruleForm.printType" code="code_gen_print_type" render-as="select" @change="printTypeChanged" class="w100" filterable />
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="state.ruleForm.printType == 'custom'">
@@ -136,29 +136,24 @@
 						<div style="color: #b1b3b8">数据唯一性配置</div>
 					</el-divider>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-button icon="ele-Plus" type="primary" plain @click="() => state.ruleForm.tableUniqueList?.push({})"> 增加配置 </el-button>
+						<el-button icon="ele-Plus" text type="primary" plain @click="() => state.ruleForm.tableUniqueList?.push({})"> 增加配置 </el-button>
 						<span style="font-size: 12px; color: gray; padding-left: 5px"> 保证字段值的唯一性,排除null值 </span>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="unique-box">
 						<template v-if="state.ruleForm.tableUniqueList != undefined && state.ruleForm.tableUniqueList.length > 0">
-							<el-row :gutter="35" v-for="(v, k) in state.ruleForm.tableUniqueList" :key="k">
-								<el-col :xs="24" :sm="14" :md="14" :lg="14" :xl="14" class="mb20">
-									<el-form-item label="字段" :prop="`tableUniqueList[${k}].columns`" :rules="[{ required: true, message: `字段不能为空`, trigger: 'blur' }]">
-										<template #label>
-											<el-button icon="ele-Delete" type="danger" circle plain size="small" @click="() => state.ruleForm.tableUniqueList?.splice(k, 1)" />
-											<span class="ml5">字段</span>
-										</template>
-										<el-select v-model="state.ruleForm.tableUniqueList[k].columns" @change="(val: any) => changeTableUniqueColumn(val, k)" multiple filterable clearable collapse-tags collapse-tags-tooltip class="w100">
-											<el-option v-for="item in state.columnData" :key="item.propertyName" :label="item.propertyName + ' [' + item.columnComment + ']'" :value="item.propertyName" />
-										</el-select>
-									</el-form-item>
-								</el-col>
-								<el-col :xs="24" :sm="10" :md="10" :lg="10" :xl="10" class="mb20">
-									<el-form-item label="描述信息" :prop="`tableUniqueList[${k}].message`" :rules="[{ required: true, message: `描述信息不能为空`, trigger: 'blur' }]">
-										<el-input v-model="state.ruleForm.tableUniqueList[k].message" clearable placeholder="请输入" />
-									</el-form-item>
-								</el-col>
-							</el-row>
+                            <div v-for="(v, k) in state.ruleForm.tableUniqueList" :key="k" class="unique-line">
+                                <el-form-item label="字段" label-width="55" :prop="`tableUniqueList[${k}].columns`" :rules="[{ required: true, message: `字段不能为空`, trigger: 'blur' }]">
+									<el-select v-model="state.ruleForm.tableUniqueList[k].columns" @change="(val: any) => changeTableUniqueColumn(val, k)" multiple filterable clearable collapse-tags collapse-tags-tooltip class="w100">
+										<el-option v-for="item in state.columnData" :key="item.propertyName" :label="item.propertyName + ' [' + item.columnComment + ']'" :value="item.propertyName" />
+									</el-select>
+								</el-form-item>
+                                <el-form-item label="描述" label-width="55" :prop="`tableUniqueList[${k}].message`" :rules="[{ required: true, message: `描述信息不能为空`, trigger: 'blur' }]">
+									<el-input v-model="state.ruleForm.tableUniqueList[k].message" clearable placeholder="请输入" />
+								</el-form-item>
+                                <div class="delete-btn">
+                                    <el-button icon="ele-Delete" type="danger" circle plain size="small" @click="() => state.ruleForm.tableUniqueList?.splice(k, 1)" />
+                                </div>
+                            </div>
 						</template>
 					</el-col>
 				</el-row>
@@ -299,4 +294,24 @@ defineExpose({ openDialog });
 :deep(.el-dialog__body) {
 	min-height: 450px;
 }
+
+.unique-box {
+    display: grid;
+    gap: 20px;
+}
+.unique-line {
+    display: flex;
+    gap: 20px;
+    
+    .el-form-item {
+        margin-bottom: 0;
+        flex: 1;
+    }
+
+    .delete-btn {
+        align-self: center;
+        width: 24px;
+        margin-left: -10px;
+    }
+}
 </style>

+ 7 - 3
Web/src/views/system/codeGen/component/genConfigDialog.vue

@@ -7,7 +7,7 @@
 					<span> 生成配置 </span>
 				</div>
 			</template>
-			<el-table :data="state.tableData" style="width: 100%" v-loading="state.loading" border>
+			<el-table :data="state.tableData" style="width: 100%; height: 100%;" v-loading="state.loading" border>
 				<el-table-column type="index" label="序号" width="55" align="center" />
 				<el-table-column prop="propertyName" label="实体属性" show-overflow-tooltip />
 				<el-table-column prop="columnComment" label="描述" show-overflow-tooltip>
@@ -40,7 +40,7 @@
 						</el-select>
 					</template>
 				</el-table-column>
-				<el-table-column prop="whetherTable" label="列表显示" width="70" align="center" show-overflow-tooltip>
+				<el-table-column prop="whetherTable" label="显示" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
 						<el-checkbox v-model="scope.row.whetherTable" true-value="Y" false-value="N" />
 					</template>
@@ -182,9 +182,13 @@ const submit = async () => {
 // 导出对象
 defineExpose({ openDialog });
 </script>
-<style scoped>
+<style lang="scss" scoped>
 .effect-type-container {
 	display: flex;
 	align-items: center;
 }
+
+:deep(.el-dialog__body) {
+	height: calc(100vh - 160px) !important;
+}
 </style>

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

@@ -17,7 +17,7 @@
 					</template>
 				</el-segmented>
 			</div>
-			<div ref="monacoEditorRef" style="width: 100%; height: 700px;" v-loading="state.loading"></div>
+			<div ref="monacoEditorRef" v-loading="state.loading" class="code-container"></div>
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button icon="ele-Close" @click="cancel">关 闭</el-button>
@@ -125,7 +125,7 @@ const handleCopy = () => {
 defineExpose({ openDialog });
 </script>
 
-<style scoped>
+<style lang="scss" scoped>
 .cs-style .el-segmented {
 	--el-segmented-item-selected-bg-color: #5c2d91;
 }
@@ -135,4 +135,12 @@ defineExpose({ openDialog });
 .js-style .el-segmented {
 	--el-segmented-item-selected-bg-color: #e44d26;
 }
+:deep(.el-dialog__body) {
+	height: calc(100vh - 160px) !important;
+
+    .code-container {
+        width: 100%;
+        height: calc(100% - 48px);
+    }
+}
 </style>

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

@@ -46,7 +46,7 @@
 		<el-card class="full-table" shadow="hover" style="margin-top: 5px">
 			<el-table :data="state.columnData" style="width: 100%" v-loading="state.loading1" border>
 				<el-table-column type="index" label="序号" width="55" align="center" />
-				<el-table-column prop="dbColumnName" label="字段名" align="center" show-overflow-tooltip />
+				<el-table-column prop="dbColumnName" label="字段名" show-overflow-tooltip />
 				<el-table-column prop="dataType" label="数据类型" align="center" show-overflow-tooltip />
 				<el-table-column prop="isPrimarykey" label="主键" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">

+ 10 - 1
Web/src/views/system/role/component/editRole.vue

@@ -38,7 +38,7 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="菜单权限" v-loading="state.loading">
+						<el-form-item label="菜单权限" v-loading="state.loading" class="tree-container">
 							<el-tree
 								ref="treeRef"
 								:data="state.menuData"
@@ -143,6 +143,15 @@ defineExpose({ openDialog });
 </script>
 
 <style lang="scss" scoped>
+.tree-container {
+    :deep(.el-form-item__content) {
+        border: 1px solid var(--el-border-color);
+        border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
+        padding: 5px 0 5px 3px;
+    }
+    
+}
+
 .menu-data-tree {
 	width: 100%;
 	border: 1px solid var(--el-border-color);