diff --git "a/.Net6\347\211\210\346\234\254/EF Core + Dapper \345\257\271\346\216\245\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.md" "b/.Net6\347\211\210\346\234\254/EF Core + Dapper \345\257\271\346\216\245\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.md"
new file mode 100644
index 0000000000000000000000000000000000000000..bdca43bd69681fa7409cbdb6f81ae9639627762c
--- /dev/null
+++ "b/.Net6\347\211\210\346\234\254/EF Core + Dapper \345\257\271\346\216\245\350\276\276\346\242\246\346\225\260\346\215\256\345\272\223.md"
@@ -0,0 +1,18 @@
+# EF Core + Dapper 对接达梦数据库
+1. 安装达梦数据库以及管理工具
+ 下载地址:https://www.dameng.com/list_103.html
+
+ 根据需求下载
+
+ 
+
+ 已Windows为例,选择红框内容下载,选择CPU平台,操作系统,ISO包内部包含数据库安装文件以及7种数据库管理工具
+
+2. 安装达梦数据库
+ 参照官方文档:https://eco.dameng.com/document/dm/zh-cn/start/
+
+3. 必坑指南
+ 1) 安装数据库实例时,去掉大小写敏感(EF Core 对接大小敏感时会有各种问题),实例默认端口:5236,验证方式:达梦服务器验证,用户名:SYSDBA,口令:SYSDBA
+ 2) 模式名称(数据库名称)全部大写
+ 3) 迁移数据库,先修改数据库兼容模式,修改COMPATIBLE_MODE为对应数据库( 0:none, 1:SQL92, 2:Oracle, 3:MS SQL Server, 4:MySQL, 5:DM6, 6:Teradata, 7:PG),默认为0
+ windows目录:C:\dmdbms\data\DAMENG\dm.ini
diff --git "a/.Net6\347\211\210\346\234\254/VOL.AppManager/VOL.AppManager.csproj" "b/.Net6\347\211\210\346\234\254/VOL.AppManager/VOL.AppManager.csproj"
index 5c93ecb8c5eb193f18cc6357c09fb66be6714157..0c12e0065aa73fd3c006efafe9d167690ed08385 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.AppManager/VOL.AppManager.csproj"
+++ "b/.Net6\347\211\210\346\234\254/VOL.AppManager/VOL.AppManager.csproj"
@@ -18,7 +18,7 @@
-
+
diff --git "a/.Net6\347\211\210\346\234\254/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs" "b/.Net6\347\211\210\346\234\254/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs"
index 180d2a4a8818e23b5688afcfab6a51631d5b4a6d..ed1052d14070d1ff95478215c014b0938b8bc33d 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs"
+++ "b/.Net6\347\211\210\346\234\254/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs"
@@ -121,6 +121,25 @@ namespace VOL.Builder.Services
}
}
+ ///
+ /// 2023.11.14 增加达梦获取表结构时区分当前所在模式
+ ///
+ ///
+ ///
+ private string GetDMOwner()
+ {
+ try
+ {
+ string dbName = DBServerProvider.GetConnectionString().Split("schema=")[1].Split(";")[0]?.Trim();
+ return dbName;
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"获取达梦数据库名异常:{ex.Message}");
+ return "";
+ }
+ }
+
///
/// 获取Mysql表结构信息
/// 2020.06.14增加对mysql数据类型double区分
@@ -155,6 +174,29 @@ DISTINCT
table_name = ?tableName {GetMysqlTableSchema()};";
}
+ ///
+ /// 获取达梦表结构信息 2023.11.14
+ ///
+ ///
+ private string GetDMModelInfo()
+ {
+ return $@"SELECT DISTINCT
+ IF(DATA_PRECISION IS NOT NULL, CONCAT(DATA_PRECISION,',',DATA_SCALE),'') as Prec_Scale,
+ CASE
+ WHEN data_type IN( 'BIT', 'BOOL','bit', 'bool') THEN 'bool'
+ WHEN data_type in('smallint','SMALLINT') THEN 'short'
+ WHEN data_type in('tinyint', 'TINYINT') THEN 'sbyte'
+ WHEN data_type IN('MEDIUMINT','mediumint', 'int','INT','year', 'Year') THEN 'int'
+ WHEN data_type in ( 'BIGINT','bigint') THEN 'bigint'
+ WHEN data_type IN('FLOAT', 'DECIMAL','float', 'decimal') THEN 'decimal'
+ WHEN data_type IN( 'DOUBLE', 'double') THEN 'double'
+ WHEN data_type IN('CHAR', 'VARCHAR', 'TINY TEXT', 'TEXT', 'MEDIUMTEXT', 'LONGTEXT', 'TINYBLOB', 'BLOB', 'MEDIUMBLOB', 'LONGBLOB', 'Time','char', 'varchar', 'tiny text', 'text', 'mediumtext', 'longtext', 'tinyblob', 'blob', 'mediumblob', 'longblob', 'time') THEN 'nvarchar'
+ WHEN data_type IN('Date', 'DateTime', 'TimeStamp','date', 'datetime', 'timestamp') THEN 'datetime' ELSE 'nvarchar'
+ END AS ColumnType,
+ Column_Name AS ColumnName
+ FROM user_tab_columns
+ WHERE table_name = :tableName ";
+ }
///
/// 获取SqlServer表结构信息
@@ -297,6 +339,9 @@ DISTINCT
case "PgSql":
sql = GetPgSqlModelInfo();
break;
+ case "DM":
+ sql = GetDMModelInfo();
+ break;
default:
sql = GetSqlServerModelInfo();
break;
@@ -369,6 +414,10 @@ DISTINCT
{
sql = GetPgSqlStructure(tableName);
}
+ else if (DBType.Name.ToLower() == DbCurrentType.DM.ToString().ToLower())
+ {
+ sql = GetDMStructure(tableName);
+ }
else
{
sql = GetSqlServerStructure(tableName);
@@ -970,7 +1019,7 @@ DISTINCT
120 AS ColumnWidth,
0 AS OrderNo,
CASE
- WHEN IS_NULLABLE = 'NO' THEN
+ WHEN IS_NULLABLE = 'N' THEN
0 ELSE 1
END AS IsNull,
CASE
@@ -985,6 +1034,65 @@ DISTINCT
order by ordinal_position";
}
+ ///
+ /// 获取达梦表结构信息 2023.11.14
+ ///
+ ///
+ ///
+ ///
+ private string GetDMStructure(string tableName)
+ {
+ return $@"SELECT DISTINCT
+ tc.COLUMN_NAME AS ColumnName,
+ '{tableName}' as tableName,
+ IFNULL(col.COMMENTS,'') AS ColumnCnName,
+ CASE
+ WHEN data_type IN( 'BIT', 'BOOL', 'bit', 'bool') THEN
+ 'bool'
+ WHEN data_type in('smallint','SMALLINT') THEN 'short'
+ WHEN data_type in('tinyint','TINYINT') THEN 'sbyte'
+ WHEN data_type IN('MEDIUMINT','mediumint', 'int','INT','year', 'Year') THEN
+ 'int'
+ WHEN data_type in ( 'BIGINT','bigint') THEN
+ 'bigint'
+ WHEN data_type IN('FLOAT', 'DOUBLE', 'DECIMAL','float', 'double', 'decimal') THEN
+ 'decimal'
+ WHEN data_type IN('CHAR', 'VARCHAR', 'TINY TEXT', 'TEXT', 'MEDIUMTEXT', 'LONGTEXT', 'TINYBLOB', 'BLOB', 'MEDIUMBLOB', 'LONGBLOB', 'Time','char', 'varchar', 'tiny text', 'text', 'mediumtext', 'longtext', 'tinyblob', 'blob', 'mediumblob', 'longblob', 'time') THEN
+ 'string'
+ WHEN data_type IN('Date', 'DateTime', 'TimeStamp','date', 'datetime', 'timestamp') THEN
+ 'DateTime' ELSE 'string'
+ END AS ColumnType,
+ case WHEN DATA_LENGTH>8000 THEN 0 ELSE DATA_LENGTH end AS Maxlength,
+ CASE
+ WHEN c.constraint_type='P' THEN
+ 1 ELSE 0
+ END AS IsKey,
+ CASE
+ WHEN tc.Column_Name IN( 'CreateID', 'ModifyID', '' )
+ OR c.constraint_type='P' THEN
+ 0 ELSE 1
+ END AS IsDisplay,
+ 1 AS IsColumnData,
+ 120 AS ColumnWidth,
+ 0 AS OrderNo,
+ CASE
+ WHEN NULLABLE = 'NO' THEN
+ 0 ELSE 1
+ END AS IsNull,
+ CASE
+ WHEN c.constraint_type='P' THEN
+ 1 ELSE 0
+ END AS IsReadDataset
+ FROM
+ user_tab_columns tc
+ INNER JOIN dba_tables t ON tc.TABLE_NAME=t.TABLE_NAME
+ LEFT JOIN dba_cons_columns cons ON tc.COLUMN_NAME=cons.COLUMN_NAME AND tc.TABLE_NAME=cons.TABLE_NAME
+ LEFT JOIN dba_constraints c ON c.constraint_name=cons.constraint_name
+ LEFT JOIN user_col_comments col ON tc.TABLE_NAME=col.TABLE_NAME AND tc.COLUMN_NAME=col.COLUMN_NAME
+
+ WHERE tc.table_name = :tableName AND t.OWNER='{GetDMOwner()}'";
+ }
+
///
/// 获取SqlServer表结构信息
///
@@ -1597,7 +1705,7 @@ DISTINCT
if ((column.IsKey == 1 && (column.ColumnType == "uniqueidentifier")) ||
tableColumnInfo.ColumnType.ToLower() == "guid"
- || (IsMysql() && column.ColumnType == "string" && column.Maxlength == 36))
+ || ((IsMysql() || IsDM()) && column.ColumnType == "string" && column.Maxlength == 36))
{
tableColumnInfo.ColumnType = "uniqueidentifier";
}
@@ -1664,7 +1772,7 @@ DISTINCT
if ((column.IsKey == 1
&& (column.ColumnType == "uniqueidentifier"))
|| column.ColumnType == "guid"
- || (IsMysql() && column.ColumnType == "string" && column.Maxlength == 36))
+ || ((IsMysql() || IsDM()) && column.ColumnType == "string" && column.Maxlength == 36))
{
columnType = "Guid" + (column.IsNull == 1 ? "?" : "");
}
@@ -1890,6 +1998,12 @@ DISTINCT
{
return DBType.Name.ToLower() == DbCurrentType.MySql.ToString().ToLower();
}
+
+ private static bool IsDM()
+ {
+ return DBType.Name.ToLower() == DbCurrentType.DM.ToString().ToLower();
+ }
+
private WebResponseContent ValidColumnString(Sys_TableInfo tableInfo)
{
WebResponseContent webResponse = new WebResponseContent(true);
@@ -1919,7 +2033,7 @@ DISTINCT
return webResponse.Error($"明细表的字段[{tableColumn.ColumnName}]类型必须与主表的主键的类型相同");
}
- if (!IsMysql()) return webResponse;
+ if (!IsMysql()|| !IsDM()) return webResponse;
if (mainTableColumn.ColumnType?.ToLower() == "string"
&& tableColumn.Maxlength != 36)
diff --git "a/.Net6\347\211\210\346\234\254/VOL.Builder/VOL.Builder.csproj" "b/.Net6\347\211\210\346\234\254/VOL.Builder/VOL.Builder.csproj"
index 6041173809c5ac68e56171b2e471cf4408db37a0..fb52a0ba75bf2fdbe90bc0b782747dd85ef34d4f 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.Builder/VOL.Builder.csproj"
+++ "b/.Net6\347\211\210\346\234\254/VOL.Builder/VOL.Builder.csproj"
@@ -18,7 +18,7 @@
-
+
diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs"
index 006d29d5aa814fb4550759a97744d1c33f419671..8890757dacd4322e04dd3b67592f6836a93123d1 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs"
+++ "b/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs"
@@ -1,4 +1,5 @@
-using Microsoft.EntityFrameworkCore;
+using Dm;
+using Microsoft.EntityFrameworkCore;
using MySqlConnector;
using Npgsql;
using System;
@@ -73,6 +74,10 @@ namespace VOL.Core.DBManager
{
return new NpgsqlConnection(connString);
}
+ if (DBType.Name == DbCurrentType.DM.ToString())
+ {
+ return new DmConnection(connString);
+ }
return new SqlConnection(connString);
}
@@ -98,6 +103,10 @@ namespace VOL.Core.DBManager
{
return new NpgsqlConnection(connString);
}
+ if (dbCurrentType == DbCurrentType.DM)
+ {
+ return new DmConnection(connString);
+ }
return new SqlConnection(connString);
}
diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs"
index 3b6879b406fdc9e446697a54358ed03f6a9be3eb..37fe3aa52026b0559e47eaaacbc2562948b4b946 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs"
+++ "b/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs"
@@ -1,5 +1,6 @@
using Dapper;
+using Dm;
using MySqlConnector;
using System;
using System.Collections.Generic;
@@ -719,6 +720,7 @@ namespace VOL.Core.Dapper
{
tmpPath = tmpPath.ReplacePath();
}
+
if (DBType.Name == "MySql")
{
return MySqlBulkInsert(table, tableName, fileName, tmpPath);
@@ -729,6 +731,12 @@ namespace VOL.Core.Dapper
PGSqlBulkInsert(table, tableName);
return table.Rows.Count;
}
+
+ if (DBType.Name == "DM")
+ {
+ return DMBulkInsert(table, tableName);
+ }
+
return MSSqlBulkInsert(table, tableName, sqlBulkCopyOptions ?? SqlBulkCopyOptions.KeepIdentity);
}
@@ -800,6 +808,54 @@ namespace VOL.Core.Dapper
}
return insertCount;
}
+
+ ///
+ /// 达梦大批量数据插入,返回成功插入行数
+ ///
+ ///
+ ///
+ ///
+ ///
+ private int DMBulkInsert(DataTable table, string tableName)
+ {
+ if (table.Rows.Count == 0) return 0;
+
+ try
+ {
+ using (var Connection = DBServerProvider.GetDbConnection(_connectionString, DbCurrentType.DM))
+ {
+ if (Connection.State == ConnectionState.Closed)
+ {
+ Connection.Open();
+ }
+ using (IDbTransaction tran = Connection.BeginTransaction())
+ {
+ using (var bulk = new DmBulkCopy(Connection as DmConnection))
+ {
+ //设置插入的目标表
+ bulk.DestinationTableName = tableName;
+
+ //DataTable列名与数据库列名的映射
+ for (int i = 0; i < table.Columns.Count; i++)
+ {
+ bulk.ColumnMappings.Add(table.Columns[i].ColumnName, table.Columns[i].ColumnName);
+ }
+
+ //写入数据库
+ bulk.WriteToServer(table);
+ tran.Commit();
+ }
+ }
+ }
+
+ return table.Rows.Count;
+ }
+ catch (Exception ex)
+ {
+ throw new Exception(ex.Message, ex.InnerException);
+ }
+ }
+
///
///将DataTable转换为标准的CSV
///
diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/EFDbContext/VOLContext.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/EFDbContext/VOLContext.cs"
index c8631525dcd683288f5900a38cc83c6056350e45..484aa5fea4dcca7f6ff9041aba50827a513cae5b 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.Core/EFDbContext/VOLContext.cs"
+++ "b/.Net6\347\211\210\346\234\254/VOL.Core/EFDbContext/VOLContext.cs"
@@ -80,6 +80,10 @@ namespace VOL.Core.EFDbContext
{
optionsBuilder.UseNpgsql(connectionString);
}
+ else if (Const.DBType.Name == Enums.DbCurrentType.DM.ToString())
+ {
+ optionsBuilder.UseDm(connectionString);
+ }
else
{
optionsBuilder.UseSqlServer(connectionString);
diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/Enums/DbCurrentType.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/Enums/DbCurrentType.cs"
index a703fbaa0638d6a3073bb1b6fdf45e9b3c07fea8..a4109853fcc015b5aeda790ef5db72a96754260a 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.Core/Enums/DbCurrentType.cs"
+++ "b/.Net6\347\211\210\346\234\254/VOL.Core/Enums/DbCurrentType.cs"
@@ -9,6 +9,7 @@ namespace VOL.Core.Enums
Default = 0,
MySql = 1,
MsSql = 2,//2020.08.08修改sqlserver拼写
- PgSql = 3
+ PgSql = 3,
+ DM=4
}
}
diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/Extensions/AutofacManager/AutofacContainerModuleExtension.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/Extensions/AutofacManager/AutofacContainerModuleExtension.cs"
index 4f839fd1f06852850ffbc3d7983a97a4b9bf61cb..6efaeca3cc7e85715823643bdd79553c87f1d629 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.Core/Extensions/AutofacManager/AutofacContainerModuleExtension.cs"
+++ "b/.Net6\347\211\210\346\234\254/VOL.Core/Extensions/AutofacManager/AutofacContainerModuleExtension.cs"
@@ -80,6 +80,11 @@ namespace VOL.Core.Extensions
{
services.AddDbContextPool(optionsBuilder => { optionsBuilder.UseNpgsql(connectionString); }, 64);
}
+ else if (DBType.Name == DbCurrentType.DM.ToString())
+ {
+ services.AddDbContextPool(optionsBuilder => { optionsBuilder.UseDm(connectionString); }, 64);
+ services.AddEntityFrameworkDm();
+ }
else
{
services.AddDbContextPool(optionsBuilder => { optionsBuilder.UseSqlServer(connectionString); }, 64);
diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/VOL.Core.csproj" "b/.Net6\347\211\210\346\234\254/VOL.Core/VOL.Core.csproj"
index 4da4f3610be9d7881f9484ea708a1ab17394cb26..0e12aef7525c42cb59c02ab96f63a94e5439e8e3 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.Core/VOL.Core.csproj"
+++ "b/.Net6\347\211\210\346\234\254/VOL.Core/VOL.Core.csproj"
@@ -41,11 +41,12 @@
+
-
+
diff --git "a/.Net6\347\211\210\346\234\254/VOL.Entity/VOL.Entity.csproj" "b/.Net6\347\211\210\346\234\254/VOL.Entity/VOL.Entity.csproj"
index 4d0fc61037d8a9b45824636690573aabe8da5f21..80f88bc8f2dad618352b63a234923644f0879d63 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.Entity/VOL.Entity.csproj"
+++ "b/.Net6\347\211\210\346\234\254/VOL.Entity/VOL.Entity.csproj"
@@ -21,7 +21,7 @@
-
+
diff --git "a/.Net6\347\211\210\346\234\254/VOL.System/VOL.System.csproj" "b/.Net6\347\211\210\346\234\254/VOL.System/VOL.System.csproj"
index 04ba03a6551fea078c83c7c4bcb4441880ef45b3..78f9917cc3c5d9f276f1a4c33f3df19038db0011 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.System/VOL.System.csproj"
+++ "b/.Net6\347\211\210\346\234\254/VOL.System/VOL.System.csproj"
@@ -18,7 +18,7 @@
-
+
diff --git "a/.Net6\347\211\210\346\234\254/VOL.WebApi/appsettings.json" "b/.Net6\347\211\210\346\234\254/VOL.WebApi/appsettings.json"
index 655d26477067aaa3f17cdb9fb851b8d656a3962d..f2d0057b0d7c54bd06883d5f5cefb23228f10d32 100644
--- "a/.Net6\347\211\210\346\234\254/VOL.WebApi/appsettings.json"
+++ "b/.Net6\347\211\210\346\234\254/VOL.WebApi/appsettings.json"
@@ -14,7 +14,7 @@
"AppUrls": {
},
"Connection": {
- "DBType": "MsSql", //MySql/MsSql/PgSql //数据库类型,如果使用的是sqlserver此处应设置为MsSql
+ "DBType": "MsSql", //MySql/MsSql/PgSql/DM //数据库类型,如果使用的是sqlserver此处应设置为MsSql
//sqlserver连接字符串
"DbConnectionString": "Data Source=JXX2835\\SQLEXPRESS;Initial Catalog=netcoredev;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=500;",
@@ -23,6 +23,10 @@
//PgSql连接字符串
// "DbConnectionString": "Host=132.232.2.109;Port=5432;User id=postgres;password=jxx_abcd;Database=netcoredev;",
+
+ //达梦 连接字符串
+ // "DbConnectionString": "Server=127.0.0.1:5236; schema=netcoredev; User=SYSDBA; Password=SYSDBA;",
+
"RedisConnectionString": "127.0.0.1,Password=123456,SyncTimeout=15000", //redis连接字符串(最好加密)
"UseRedis": "false", //是否使用redis,如果不使用,默认使用Memory内置缓存
"UseSignalR": "true" //是否使用SignalR(2022.05.03),注意需要将端的地址配置到下面的CorsUrls属性中
diff --git a/README.md b/README.md
index 4a10ddd66fd00a7588653f7bbe322a89e0c0cf84..09bf3a4620ac7a2d7c6d177833298a28a187dd73 100644
--- a/README.md
+++ b/README.md
@@ -40,83 +40,83 @@ App、H5、微信小程序: [http://v2.volcore.xyz/app/guide](http://v2.volcore.
sqlsugar: [https://www.donet5.com/](https://www.donet5.com/)
## 2023.05.13增加审批流程分支、条件功能
-
-
-
+
+
+
## 框架移动端(uniapp)已发布,同样全自动生成代码,扫描小程序二维码即可查看
-
+
-
-
-
-
+
+
+
+
## 框架已支持Vue3版本
-
+
## 框架已增加低代码设计器
-
-
+
+
## 框架2.0已更新(部分新增功能截图)
增加切换皮肤功能
-
-
+
+
增加可复用的后台请求参数校验
-
+
增加树形菜单与代码生成页面使用
-
+
增加文本编辑器直接发布静态页面功能
-
+
一对一多从表显示(只需要少量代码就可完成成,其他都由代码生成器生成)
-
+
表合并显示 (只需要几行代码完成代码生成器生成的页面实现扩展)
-
+
从图上传图片 (只需要几行代码完成代码生成器生成的页面实现扩展)
-
+
一对多从表(不限从表数量)扩展
-
+
图表
-
+
## 1、只读基础表单
整个只读的基础表单的所有前后端代码,全部由代码生成器生成,代码生成器中几乎不需要配置,并支持并后端业务代码扩展,直接生成代码后,配置菜单权限即可
-
+
## 2、自动绑定下拉框数据表单
整个自动绑定下拉框数据表单的所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,在代码生成器中只需要指定数据源编号,页面加载时会根据编号自动加载数据源并绑定
-
+
## 3、启用图片支持、审核表单
整个启用图片支持、审核表单的所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,审核功能需要在菜单配置权限、代码生成器中勾选启用图片支持
-
+
## 4、高级查询
整个表单的所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,查询字段、类型(下拉框、日期、TextArea等)、所在行与列都由代码生成器完成,不需要写任何代码
- 
+ 
## 5、主从表新建、编辑
主从表新建、编辑所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,新建、编辑从表配置、字段、类型(下拉框、日期、TextArea等)、所在行与列、字段是否只读、标签显示的长度等都由代码生成器完成,不需要写任何代码
-
+
## 6、excel导入
excel导入整个页面都由代码生成器生成,导入的字段、字段是否必填,下载模板也由代码生成器上配置(自己根据实际需要决定是否采用此方法),导入时会验证是否为空与数据的合法性,逻辑校验自己实现扩展方法即可
-
+
## 7、H5开发
-
+
## 8、权限分配
目前只实现了对用户的角色的Action进行权限分配
-
+
## 9、代码生成器
代码生成器提供了20多种可配置的属性,可灵活配置显示、查询、编辑、导入、导出、主从关系等功能点击看代码生成器文档
-
+
其他功能。。。。。