JNPF,采用主流的两大技术Java/.Net开发,是一套低代码开发平台,核心目的是为企业整合产业资源和数字要素,优化业务流程,实现业务信息的数字管理,帮助企业解决“供需梗阻”,为企业带来的价值更多体现在提高效率。
JNPF快速开发平台适用于任何行业系统,企业不必烦恼底层架构设计,低代码开发的可视化界面和拖拉拽的应用搭建方式快速赋能开发者和业务人员,可短时间开发出如ERP、OA、CRM、HR、MIS以及电信、银行、政府、企业等各行业的企业应用系统。
平台特性
-
采用前后端分离的模式:前端基于
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调试等功能。
private int _value = 12345;
private byte[] _buffer = new byte[100];
[Benchmark]
public bool Format() => Utf8Formatter.TryFormat(_value, _buffer, out _, new StandardFormat('D', 2));
using System.Text.Json;
namespace SerializeExtra
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
public string? SummaryField;
public IList<DateTimeOffset>? DatesAvailable { get; set; }
public Dictionary<string, HighLowTemps>? TemperatureRanges { get; set; }
public string[]? SummaryWords { get; set; }
}
public class HighLowTemps
{
public int High { get; set; }
public int Low { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot",
SummaryField = "Hot",
DatesAvailable = new List<DateTimeOffset>()
{ DateTime.Parse("2019-08-01"), DateTime.Parse("2019-08-02") },
TemperatureRanges = new Dictionary<string, HighLowTemps>
{
["Cold"] = new HighLowTemps { High = 20, Low = -10 },
["Hot"] = new HighLowTemps { High = 60 , Low = 20 }
},
SummaryWords = new[] { "Cool", "Windy", "Humid" }
};
var options = new JsonSerializerOptions { WriteIndented = true };
string jsonString = JsonSerializer.Serialize(weatherForecast, options);
Console.WriteLine(jsonString);
}
}
}
// output:
//{
// "Date": "2019-08-01T00:00:00-07:00",
// "TemperatureCelsius": 25,
// "Summary": "Hot",
// "DatesAvailable": [
// "2019-08-01T00:00:00-07:00",
// "2019-08-02T00:00:00-07:00"
// ],
// "TemperatureRanges": {
// "Cold": {
// "High": 20,
// "Low": -10
// },
// "Hot": {
// "High": 60,
// "Low": 20
// }
// },
// "SummaryWords": [
// "Cool",
// "Windy",
// "Humid"
// ]
//}
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);
}