开发商瞄准了企业转型的痛点,传统企业的经营模式和理念比较原始,但是对应用程序的开发和升级需求在同步激增,但是没有做好信息化规划,头疼医头脚痛医脚。如此一来,低门槛运作代表的低代码或许就是不二选择。
低代码可以从软件开发费用和人力支出两个角度降低总开发成本,按需开发的特性缩短了软件试错时间和交付周期,降低整体机会成本,让企业有更多时间和资金投身于行业业务新动态的捕捉。
平台特性
-
采用前后端分离的模式:前端基于
vue-element-admin
框架定制开发; -
统一授权、认证:基于
Spring Security
、Spring OAuth2
、JWT 实现的统一认证服务中心,登录基于Spring Security
的标准登录流程。客户端授权支持Oauth2.0
的四种授权模式:授权码模式
、简化模式
、密码模式
、客户端模式
,授权流程跟标准的Oauth2
流程一致。web 端采用简化模式登录系统,移动端可使用密码模式(password)登录系统。同时还支持基于Spring Social
的三方账号登录方式,如微信/QQ
、微博
等,并提供拓展模式,支持更多三方渠道。 -
灵活的权限控制:基于
RBAC
权限管理,该功能模块下的功能用于维护企业的组织架构信息以及员工信息。主要包含了组织信息、组织架构、企业通讯录、通信录同步等功能。用户可在此功能模块下维护公司的组织架构信息(组织/部门/角色/岗位)和用户信息,也可以通过第三方应用(钉钉/企业微信
)将组织架构信息一键导入到系统中,也可以使用组织架构和员工信息的导入功能将数据导入到系统中。 -
支持多租户:简单配置即可转变多租户模式,实现数据隔离;
-
支持多种数据库:支持
MySQL
、SQL Server
、Oracle
、PostgreSQL
、达梦数据库
、人大金仓数据库
等,您无需关心不同类型数据库间的语法区别; -
统一接口管理:基于
Swagger
拓展的API文档服务,主要提供在平台开发阶段的API文档管理和API调试等功能。
if (format.IsDefault)
return TryFormatInt64Default(value, destination, out bytesWritten);
switch (format.Symbol)
{
case 'G':
case 'g':
if (format.HasPrecision)
throw new NotSupportedException(SR.Argument_GWithPrecisionNotSupported);
return TryFormatInt64D(value, format.Precision, destination, out bytesWritten);
case 'd':
case 'D':
return TryFormatInt64D(value, format.Precision, destination, out bytesWritten);
case 'n':
case 'N':
return TryFormatInt64N(value, format.Precision, destination, out bytesWritten);
case 'x':
return TryFormatUInt64X((ulong)value & mask, format.Precision, true, destination, out bytesWritten);
case 'X':
return TryFormatUInt64X((ulong)value & mask, format.Precision, false, destination, out bytesWritten);
default:
return FormattingHelpers.TryFormatThrowFormatException(out bytesWritten);
}
using System.Text.Json;
namespace SerializeWithGenericParameter
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string jsonString = JsonSerializer.Serialize<WeatherForecast>(weatherForecast);
Console.WriteLine(jsonString);
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
if (format.IsDefault)
return TryFormatInt64Default(value, destination, out bytesWritten);
switch (format.Symbol)
{
case 'G':
case 'g':
if (format.HasPrecision)
throw new NotSupportedException(SR.Argument_GWithPrecisionNotSupported);
return TryFormatInt64D(value, format.Precision, destination, out bytesWritten);
case 'd':
case 'D':
return TryFormatInt64D(value, format.Precision, destination, out bytesWritten);
case 'n':
case 'N':
return TryFormatInt64N(value, format.Precision, destination, out bytesWritten);
case 'x':
return TryFormatUInt64X((ulong)value & mask, format.Precision, true, destination, out bytesWritten);
case 'X':
return TryFormatUInt64X((ulong)value & mask, format.Precision, false, destination, out bytesWritten);
default:
return FormattingHelpers.TryFormatThrowFormatException(out bytesWritten);
}
using System.Text.Json;
namespace SerializeToFileAsync
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
public class Program
{
public static async Task Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string fileName = "WeatherForecast.json";
using FileStream createStream = File.Create(fileName);
await JsonSerializer.SerializeAsync(createStream, weatherForecast);
await createStream.DisposeAsync();
Console.WriteLine(File.ReadAllText(fileName));
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}