未找到

未发布 Java新版本的开发已正式进入轨道,版本号18.3
by Harriet666 keys 分享 1509701758197

Java 9在9月21日正式发布,同时Oracle宣布将Java新版本的发布周期调整为每半年一次。目前,Java新版本的开发也已正式进入轨道。就已公开的消息来看,下一个版本的Java预计会在2018年3月发布,版本号将会是18.3,已经规划加入的特性包括JEP 286和296。

根据reddit站点上的讨论,首先更新的是JEP 296,Valhalla预计很快也会加入进来。OpenJDK的主页面则显示,已确定要在18.3版本实现的是JEP 286和296。

JEP 296主要是将JDK仓库群(JDK Repository Forest)合并为一个仓库,旨在降低管理大量仓库群的成本。根据InfoQ之前的报道,该仓库群的合并已经完成。这些软件仓库是在OpenJDK发展史上历次分裂生成的,在OpenJDK 9及以前的版本中将会继续存在。在这次合并操作之前,OpenJDK曾分裂为多个不同的Mercurial软件仓库群,这导致了许多问题,例如不能以原子方式对多个软件仓库应用漏洞修复(Bug Fixes)。在OpenJDK合并完成后,只会有一个软件仓库,并复制在三个开发线上。为了简化仓库的管理,JDK中还创建了用于在合并和未合并版本间移动更改的工具。

JEP 286提议在Java中引入局部变量的类型推断,该JEP在2016年提出,InfoQ曾经报道过该JEP的概况和相关的开发者调查结果。该JEP旨在减少编写Java代码相关的仪式性的内容,提升开发人员的体验,同时还要保证Java语言的静态性。它会减少开发人员在声明局部变量时,没有必要的变量类型声明。如果该JEP实现的话,在声明局部变量的时候,就可以采用类似如下的方式:

var list = new ArrayList();  // infers ArrayList
var stream = list.stream();          // infers Stream

这种语句只能用于带有初始化器(initializer)的局部变量、增强的for-loop中的索引以及传统for-loop中声明的局部变量。它不能用于方法声明、构造函数声明、方法返回值、字段、catch语句以及其他类型的变量声明中。

关于局部变量的类型推断,不管是JVM体系中的语言还是其他语言都提供了一定形式的支持,比如C++(auto)、C#(var)、Scala(var/val)以及Go(通过:=进行声明)。至于该使用var作为关键字,还是使用let或类似于C/C++中的auto作为关键字,之前曾经有过一个面向开发者的调查。大约84%的回答表明定义可变内容的变量用关键字var是恰当的,只有百分之几的回答者建议使用auto更合适。根据Java语言架构师Brian Goetz介绍,该功能应该使用关键词var。

关于该特性的用法,在reddit上有一些讨论。有人表示,即便在支持“auto”语法的语言中,该特性使用的也比较少,因为有些人希望一眼就能看出变量的类型是什么。也有人认为,var有它的适用空间,在小的代码块中,直接用它实例化对象是可以的。如果是作为方法返回值的话,还是希望明确声明类型,Java的类型推断并不支持方法返回值,这一点倒不必担心。如果函数或代码块比较长的话,就不建议使用var了并要考虑适时进行代码的重写。时间和经验将会让我们更加明确应该在何时使用新功能,就像Optional刚出现时,也是耗费了一些时间才明确其推荐适用场景。

Valhalla项目中包含了一些有趣的JEP,包括值类型(Value Type)、针对原始类型实现泛型功能、增强的volatile等,外界很期待这些内容最终也能添加到新版本中。


2017慧都十四周年狂欢搞事情!砸金蛋100%抽现金红包、满额豪送iPhone X、iPhone 8、DevExpress汉化免费送、团队升级培训套包劲省10万元......更多惊喜等您来探索!

未发布 快速制作演示动画的工具TurboDemo常见问题合集(二)
by Harriet666 keys 分享 1505467594160
使用TurboDemo遇到了问题?我们的FAQ将帮助你找到答案。
TurboDemo

8、怎样添加超链接?

  1. 使用“绘制对象”添加您希望创建超链接的区域(如手绘图形、矩形或椭圆)
  2. 双击您定义的对象以将它指定给URL
  3. 您可以将互联网地址、电子邮件地址或任何您需要的超链接插入到“URL”字段中
如果用户点击已定义的区域,URL将被打开。您可以从演示示例中打开外部网页或直接开始运行另一个演示示例。
 

9、怎样调整工程大小?

在您完成您的工程后,如果需要您可以改变工程的大小。您可以缩小您工程的大小也可将它扩大。您可在“文件|调整工程大小”菜单中运行该功能

我们建议您在添加任何对象(如,备注、提示气球等)前调整工程大小,因为这将影响对象定位。
 

10、怎样将声音插入幻灯?

几种添加声音的方法:
  • 当您在进行大纲视图浏览时,您可以点击特定幻灯的喇叭图标
  • 在单个幻灯模式中,您能在工具条中找到喇叭图标
使用这两个图标,“音频向导”将提示您可以录制或导入声音。向导的“高级模式”允许您访问具备附加功能的“音频编辑器”,这些附加功能包
括复制、剪切、规整化等。
 

11、怎样隐藏或更改鼠标指针?

您可以使用位于工具条中或在“幻灯片|隐藏鼠标指针”菜单中的图标隐藏鼠标指针。可通过双击幻灯中或在“幻灯片|选择鼠标指针
”菜单中的指针图标改变鼠标指针外观。
 

12、在更改了鼠标指针的位置后,鼠标指针的表现奇怪。

在解释此问题前,我们需要解释TurboDemo工作原理:
  • “蓝圈”表示鼠标指针的起始点,“红圈”表示鼠标指针的结束点
  • TurboDemo将自动统计这些点之间的路径
  • 当您使用TurboDemo制作屏幕截图时,软件将记录当前鼠标指针的位置(起始点)
  • 在抓取下一张屏幕截图时,TurboDemo将记录鼠标指针现在的位置以及新坐标(结束点)
  • 鼠标指针在一张幻灯中的结束点通常是下一张幻灯的起始点。所以照例所说,当您在一张幻灯中移动了起始点(蓝圈),您会发现在上一张的结束
  • 点(红圈)位置也改变了
 

13、什么是“鼠标悬浮”?

“鼠标虚浮”就是当您在演示过程中将鼠标移动到特定位置时向您显示提示气球或图片的对象。这通常用在您不想通过会遗留在幻灯上的备注与提
示气球解释屏幕上不同内容的时候。
 

14、当播放演示示例时没有导航。

这通常发生在您用全屏制作演示示例的时候。问题就在于导航条都是放在演示文件的底部或右侧,所以就看不见导航了。您可以使用调整大小选项
(“文件|调整工程大小”菜单) 缩小工程的大小,这样就能看见导航条;或您可以在导出工程时选择一个隐藏的控制面板。
未发布 多功能文件格式转换器VectorDraw File Converter v7.7011.0.1发布
by Harriet666 keys 分享 1490843010437

VectorDraw File Converter是一个终端应用程序,使得用户能将常用的图像文件(DWG,DGN和DXF)转换为VectorDraw格式标准(VDF,VDI),反之亦然。该工具能将上述文件导出为SVG与DWF格式。VectorDraw File Converter还能进行多种文件的转换(比如*.dwg 到 *.vdf或者 *.dxf,反之亦然)。

VectorDraw File Converter更新至v7.7011.0.1,新版本针对提出的需求和bug做了调整和优化。

VectorDraw File Converter点击下载试用>>>

未发布 电子邮件.NET控件MailBee.NET Objects v11.0发布丨附下载
by Harriet666 keys 分享 1490073599762

几行代码便可为应用程序添加E-Mail支持,简单高效。MailBee.NET Objects 是一款为创建、发送、接收以及处理电子邮件而设计的健壮、功能丰富的.NET控件。具备“必需”以及独特的功能,这些控件帮助开发人员简单快速地将复杂的电子邮件功能添加到他们的应用程序中。

MailBee.NET Objects 更新至v11.0,增加新的Ews组件、新的密钥格式并与Visual Studio 2017进行测试。

MailBee.NET Objects v11.0点击下载>>>

更新内容:

  • 新的Ews组件,通过其本地EWS协议访问MS Exchange服务器。
  • .NET Framework 3.5和4.0版本以及2.0和4.5版本现在包含在安装程序和NuGet包中。
  • 所有.NET版本的MailBee.NET.dll现在具有相同的名称。
  • 所有MailBee.NET DLL都添加了sha256签名(除了sha1)。
  • IDN域(具有国际域的电子邮件地址)支持发送和解析。
  • 使用MailMessage.GetHtmlWithBase64EncodedRelatedFiles方法来保存HTML主体,相关图像直接嵌入到HTML中,这样就不需要在本地保存它们并在以后删除它们。
  • STARTTLS安全连接现在支持直接发送模式。要激活,请使用mailer.DirectSendDefaults.EnableStartTls = true,其中mailer是Smtp实例。
  • SecurityProtocol现在包括TlsAuto值,你可以使用该值来限制MailBee使用最佳支持的TLS协议(最高为TLS 1.2)。例如, imapClient.SslProtocol = SecurityProtocol.TlsAuto其中imapClient是Imap实例。
  • Imap.GetSpecialFolder方法,轻松找到文件夹例如已发送信息或草稿。
  • Imap,Smtp,Pop3类的GetStream方法现在允许你访问底层网络流。
  • 支持Outlook 2016.MSG格式。
  • 支持.PST文件中的通讯组列表。
  • 添加MailMessage.Sender属性。
  • 新的Logger.DateTimeFormatTimeOnly和Logger.DateTimeFormatFull属性在日志文件中配置了日期时间格式。
  • Bounce数据库已更新。
  • 与Visual Studio 2017进行测试。
  • 许可证密钥采用新的MN110格式。如果你有有效的维护合同,请与我们联系以接收你的新密钥。如果你的合同已经过期,请先更新。
未发布 终端仿真软件z/Scope Anywhere发布v8.0版本,引入了新的用户界面
by Harriet666 keys 分享 1502180892148
Cybele Software,Inc.发布z/Scope Anywhere最新版本v8.0。该产品旨在安全地提供主机系统对全球员工、承包商、客户和其他用户的访问,无需设置客户端。
 
zScope Anywhere试用版下载>>>
 
v8.0引入了新的用户界面(UI)。提供了多种方式在多个活动会话之间查看和导航,v8.0保留了旧版本的经典模式,并引入了Cover Flow显示模式(允许用户在视觉上翻转连接)、Gallery模式(连接显示为缩略图)、网格模式(对齐并显示连接会话)。此外,浏览器选项卡也可用于管理主机系统之间的不同连接。
 
重要的是,最新版本支持打印机终端仿真(TN3287和TN3812)。z/Scope Anywhere现在可以轻松访问打印文件、打印队列、打印预览功能和其他打印功能。此外,打印作业可以发送到浏览器端打印机或下载为文件。
 
v8.0中提供了许多身份验证选项,包括简化的单点登录(SSO)、登录、OAuth/2(Google,Facebook等)和RADIUS。匿名访问连接现在可以生成一次性URL(OTURL),以避免URL持有者的登录过程中仍需要标准用户的身份验证。这些URL在使用后或在指定时间后到期,是提供临时访问的好方法。如果这些选项不够,还可以使用提供的安全API创建自定义的身份验证过程。
 
如果需要从外部应用程序集成访问z/Scope Anywhere,则提供了一个新的HLLAPI JavaScript界面以便于集成。用于集成的另一个显着特征是通过用于连接的专用虚拟路径直接访问仿真屏幕的新选项,允许绕过标准着陆页。
 
Cybele Software了解到需要控制成本,以便使z/Scope Anywhere v8.0版本成为一款经济实惠且功能强大的解决方案。
 
要求
  • 需要运行Windows操作系统的服务器机器。为了缩放和负载平衡部署,需要运行Windows操作系统的网关服务器。
  • 兼容的主机系统包括IBM大型机、AS/400和基于Unix的系统。
  • 客户端机器需要符合HTML5标准的Web浏览器,如Microsoft Edge、IE10/11、Safari、Opera、Chrome或Firefox。

未发布 电子邮件.NET控件MailBee.NET Objects v11.1发布丨附下载
by Harriet666 keys 分享 1497431589248
MailBee.NET Objects是一款为创建、发送、接收以及处理电子邮件而设计的健壮、功能丰富的.NET控件。几行代码便可为应用程序添加E-Mail支持,简单高效。具备“必需”以及独特的功能,这些控件帮助开发人员简单快速地将复杂的电子邮件功能添加到他们的应用程序中。目前MailBee.NET Objects在线订购享75折优惠正在进行中,欢迎您下载试用版进行运用!
 

MailBee.NET Objects v11.1最新版下载>>>


v11.1更新内容:

  • 使用DNS RBL执行垃圾邮件过滤的新RblFilter类。
  • 更好地支持.NET Core和Xamarin中的证书。现在可以在SSL/TLS连接和DKIM中使用客户端证书。
  • Imap.SetSeenForEntireMessages默认为false。这意味着MailBee在下载整个邮件时不会设置SEEN标志,除非你更改此属性值。
  • 新的Global.DnsServers属性会覆盖当前系统分配的DNS服务器的默认列表。如果当前平台不支持DNS服务器自动检测(例如Xamarin),该功能则非常有用。
  • 新的TimeStamp.IP属性,显示邮件的IP地址来源。
  • 改进了Outlook .MSG文件中内联图像的自动检测功能。
  • bug修复。

试用、下载、了解更多产品信息请点击"咨询在线客服"   

 
未发布 【示例教程】如何用leadtools创建一个OCR驱动的计算器
by Harriet666 keys 分享 1519808939687

Leadtools 19总套包下载>>>

日常工作和业务中会有一些图片中的计算公式等需要计算,这个代码片断显示了LEADTOOLS OCR可以用来检测、识别和执行简单的数学命题,如“2 + 2”。
static void SimpleOCRCalculator(string filePath)
      {
         RasterCodecs codecs = new RasterCodecs();

         RasterImage image = codecs.Load(filePath);

         string[] calculations;
         using (IOcrEngine engine = OcrEngineManager.CreateEngine(OcrEngineType.Advantage, false))
         {
            engine.Startup(null, null, null, null);
            IOcrPage page = engine.CreatePage(image, OcrImageSharingMode.None);

            page.AutoZone(null);
            page.Recognize(null);

            calculations = new string[page.Zones.Count];

            for (int i = 0; i < page.Zones.Count; i++)
            {
               calculations[i] = page.GetText(i);
            }

            engine.Shutdown();
         }

         Dictionary<string, Action<double, double>> operands = new Dictionary<string, Action<double, double>>();
         operands.Add("+", new Action<double, double>(delegate(double a, double b) { double ans = a + b; Console.WriteLine("{0} + {1} = {2}", a, b, ans); }));
         operands.Add("-", new Action<double, double>(delegate(double a, double b) { double ans = a - b; Console.WriteLine("{0} - {1} = {2}", a, b, ans); }));
         operands.Add("x", new Action<double, double>(delegate(double a, double b) { double ans = a * b; Console.WriteLine("{0} * {1} = {2}", a, b, ans); }));
         operands.Add("/", new Action<double, double>(delegate(double a, double b) { double ans = a / b; Console.WriteLine("{0} / {1} = {2}", a, b, ans); }));

         for (int i = 0; i < calculations.Length; i++)
         {
            string equation = Regex.Replace(calculations[i], @"\n|\r| ", "");
            string[] ops = new string[] { "+", "-", "x", "/" };

            for (int j = 0; j < ops.Length; j++)
            {
               int index = equation.IndexOf(ops[j]);

               if (index > 0 && index < equation.Length)
               {
                  string op1 = equation.Substring(0, index);
                  string op2 = equation.Substring(index + 1);

                  double arg1 = double.Parse(op1);
                  double arg2 = double.Parse(op2);

                  operands[ops[j]](arg1, arg2);

                  break;
               }
            }
         }

         codecs.Dispose();
         image.Dispose();
      }

 

用于测试的图像如下。

resource

未发布 微软仍计划在2017年发布两次Windows 10系统升级
by Harriet666 keys 分享 1487920304354

微软本月重申,今年将发布两次Windows 10系统升级,这相当于2016年的两倍。但他们对公司的原定目标仍有顾虑。

在11天前澳大利亚举行的微软技术会议上项目管理主管比尔·卡拉古尼斯指出,后续升级将在“Creators Update”之后发布,此更新预计于下月完成并发货。

微软表示,这是Windows 10的发布计划复杂性的一个标志,也是微软的“Windows服务”总体战略。此外,在会议期间卡拉古尼斯还宣布了从去年开始测试的Windows升级分析服务将于3月1日全面开放。

Microsoft Office 365 商业版【在线订购】5套起订,享95折!

Microsoft Office 365 商业协作版【在线订购】5套起订,享95折!

Microsoft Office 365 商业高级版【在线订购】5套起订,享95折!

【文章来源慧都控件,原创不易,转载请注明出处】

未发布 扫描识别工具Dynamic Web TWAIN使用教程:属性/方法/事件介绍
by Harriet666 keys 分享 1511947096620
Dynamic Web TWAIN是一个专为Web应用程序设计的TWAIN扫描识别控件。你只需在TWAIN接口写几行代码,就可以用兼容TWAIN的扫描仪扫描文档或从数码相机/采集卡中获取图像。
本文为你介绍Dynamic Web TWAIN中属性/方法/事件的具体操作代码,欢迎收藏。
 
Dynamic Web TWAIN最新版免费下载>>>
 
当正确实施后,Dynamic Web TWAIN将在页面加载后自动初始化。一旦初始化,你就可以像堆任何正常的JS对象一样控制它。您可以参考我们的在线API文档来查看Dynamic Web TWAIN的所有内置属性、方法和事件。
 
这里有三种使用Dynamic Web TWAIN的方法:

属性

属性用于在运行时从Dynamic Web TWAIN中获取或设置特定的值,例如Resolution、Duplex、IfShowUI等。
1
2
3
/* Property */
/* Scan pages in 200 DPI */
DWObject.Resolution = 200;

方法

方法用于调用Dynamic Web TWAIN对象的内置函数,如AcquireImage、SaveAsJPEG、Rotate等。语法非常简单:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Method
   
///
<summary> /// Rotates the image of a specified index in buffer by a specified angle.
  /// </summary>
///
<param name="sImageIndex" type="short" data-filtered="filtered">
specifies the index of image in buffer. The index is 0-based.
 
///
<param name="fAngle" type="float" data-filtered="filtered">
specifies the angle.
///
<param name="bKeepSize" type="bool" data-filtered="filtered">
specifies whether to keep the original size
///
<returns type="bool" data-filtered="filtered"></returns>
DWObject.Rotate(0, 45, false); // rotate the 1st image in the buffer by 45 degrees

事件

当达到某个触发点时触发事件。例如,OnMouseClick鼠标点击事件等。与属性和方法相比,事件是有点难度的。在这里我们再多谈一下。
 
处理事件
添加一个事件监听器
 
要添加事件监听器,可以使用内置方法RegisterEvent。请参考下面的示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript" data-filtered="filtered">
Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', Dynamsoft_OnReady);
var DWObject;
/* OnWebTwainReady event fires as soon as Dynamic Web TWAIN is initialized and ready to be used. It is the best place to add event listeners */
function Dynamsoft_OnReady() {
   DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer');
   DWObject.RegisterEvent("OnPostTransfer", Dynamsoft_OnPostTransfer);
}
function Dynamsoft_OnPostTransfer() {
   /* This event OnPostTransfer will be triggered after a transfer ends. */
   /* your code goes here*/
}
</script>
 
在上面的代码中,我们添加了JavaScript函数Dynamsoft_OnPostTransfer()作为事件OnPostTransfer的事件监听器。另外,你可以写这样的代码:
1
2
3
4
5
6
7
8
9
10
<script type="text/javascript" data-filtered="filtered">
Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', Dynamsoft_OnReady);
var DWObject;
function Dynamsoft_OnReady() {
   DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer');
   DWObject.RegisterEvent("OnPostTransfer", function() {
    /* your code goes here*/
   });
}
</script>
 
有参数的事件
一些事件具有参数。以OnMouseClick事件为例:
1
2
/* sImageIndex is the index of the image you clicked on*/
OnMouseClick(short sImageIndex)
 
当您创建相应的JavaScript函数(AKA,事件侦听器)时,可以包含参数并在运行时进行检索。
1
2
3
function DynamicWebTwain_OnMouseClick(index) {
    CurrentImage.value = index + 1;
}

或者
1
2
3
DWObject.RegisterEvent("OnPostTransfer", function(index) {
    CurrentImage.value = index + 1;
});
 
特殊事件 -“OnWebTwainReady”
在所有的内置事件中,有一个特殊事件“OnWebTwainReady”。基本上这个事件在Dynamic Web TWAIN对象被初始化并准备好使用的时候触发。正如您在本文前面看到的那样,推荐使用它的方法是:
1
2
3
4
5
6
7
<script type="text/javascript" data-filtered="filtered">
Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', Dynamsoft_OnReady);
var DWObject;
function Dynamsoft_OnReady() {
   DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer');
}
</script>

或者
1
2
3
4
5
<script type="text/javascript" data-filtered="filtered">
   Dynamsoft.WebTwainEnv.RegisterEvent('OnWebTwainReady', function() {
     DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer');
   });
</script>

本次教程到此结束,希望能对Dynamic Web TWAIN的用户带来帮助,接下来还会有更多的相关教程,敬请期待!

未发布 开发者在增加移动APP收益时必须做的5件事
by Harriet666 keys 分享 1487667101099

点击查看详细内容,增加你的APP收益>>>

如今手机应用市场越来越大,其中创新、独特的产品也越来越多。APP市场最好的地方就是无论是iTunes还是Google Play中,你都有平等的机会参与竞争和获得成功。这是一个公平的竞争环境,吸引着无数优质的开发商。专家们已经预测,APP市场在2020年将翻一番,价值可以达到101亿美元。

无论你是一个多优秀的开发者,在开始新的APP应用时也应该注意一些事情。在启动一个APP项目时你应该记住和经过几个重要的步骤来确保它能成功。



 近期热门 - 点击最多
  1. React结合vite使用vue3,在纯typescript的react hooks中使用vue
  2. valtio基于Proxy代理比redux\zustand更简洁的react状态管理库
  3. React Native为http网络请求添加timeout超时异常处理: 用XMLHttpRequest替换fetch发送的区别
  4. React Native使用fetch发送http登陆验证请求失败:无法读取set-cookie并显示network request failed
  5. 克服Redux的缺点在React/Native中使用消息队列,pubsub-js更加简洁的组件间通信和状态传递方法
  6. Springboot+Gradle+Mysql+Jpa最简单实例教程
  7. SpringBoot+Spring6入门指南: 使用命令行快速搭建restful web api模板
  8. 如何通过 winax 的 ActiveXObject 或 Excel.Application 往 excel 中插入一张图片
  9. node.js用activex/com+自动化读写excel时查询接口、参数的调试方法
  10. TypeScript定义数字范围类型即仅包含【小时:分钟】的时间类型,每天指定时间点执行任务

  全端社区 - 最新回复
  1. valtio基于Proxy代理比redux\zustand更简洁的react状态管理库
  2. Windows与Mac通过git ssh和rsync实现文件共享互传
  3. Windows与Mac通过git ssh和scp实现文件共享互传
  4. React结合vite使用vue3,在纯typescript的react hooks中使用vue
  5. 使用PubSub-JS时ReactNative在后台运行一段时间唤醒后,组件无法scribe到publish的事件,typescript实现一个事件订阅发布组件
  6. React Native为http网络请求添加timeout超时异常处理: 用XMLHttpRequest替换fetch发送的区别
  7. ReactNative获取Android/iOS的MAC/IP地址: react-native-device-info模块的安装与使用
  8. React Native使用fetch发送http登陆验证请求失败:无法读取set-cookie并显示network request failed
  9. 克服Redux的缺点在React/Native中使用消息队列,pubsub-js更加简洁的组件间通信和状态传递方法
  10. Springboot+Gradle+Mysql+Jpa最简单实例教程

  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA