newlifex / newlife.cube Goto Github PK
View Code? Open in Web Editor NEWWeb快速开发平台,搭建管理后台,灵活可扩展!内部集成了用户权限管理、模板继承、SSO登录、OAuth服务端、数据导出与分享等多个功能模块,在真实项目中经历过单表100亿数据添删改查的考验。
Home Page: https://newlifex.com/cube
License: MIT License
Web快速开发平台,搭建管理后台,灵活可扩展!内部集成了用户权限管理、模板继承、SSO登录、OAuth服务端、数据导出与分享等多个功能模块,在真实项目中经历过单表100亿数据添删改查的考验。
Home Page: https://newlifex.com/cube
License: MIT License
主要问题:静态资源自动从插件服务器下载,解压到wwwroot资源文件夹,开发的时候解压路径是在bin目录,但是静态资源路径默认的设置是在项目源码的wwwroot,所以会导致bin目录有静态资源,项目源码目录wwwroot却没有。
解决:
1、开发的时候,在bin目录复制一份资源到项目wwwroot目录
2、设置静态资源目录与dll文件目录一致
魔方Cube对接sso后,根据“魔方设置”->“默认角色”修改为0或者-1,实现强制使用源端角色。
方便了开发与集成。
一年多以来,逐渐发现,有些场合需要混合使用sso和本地登录,然后“默认角色”被修改为-1,导致本地注册用户无法取得角色。
因此,拟调整魔方,恢复“默认角色”为以前的3(普通用户),对接SSO则强制使用源端角色,不再需要配置。
分别在控制器指定Area为Admin解决问题
///
[Exception: 找不到目录!] NewLife.Cube.Admin.Controllers.FileController.Upload(String r, HttpPostedFileBase file) in D:\X\NewLife.Cube\NewLife.Cube\Areas\Admin\Controllers\FileController.cs:263 lambda_method(Closure , ControllerBase , Object[] ) +147 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary
2 parameters) +157
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parameters) +27 System.Web.Mvc.Async.<>c.<BeginInvokeSynchronousActionMethod>b__9_0(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22 System.Web.Mvc.Async.WrappedAsyncResult
2.CallEndDelegate(IAsyncResult asyncResult) +29
System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32 System.Web.Mvc.Async.<>c__DisplayClass11_0.<InvokeActionMethodFilterAsynchronouslyRecursive>b__0() +58 System.Web.Mvc.Async.<>c__DisplayClass11_2.<InvokeActionMethodFilterAsynchronouslyRecursive>b__2() +228 System.Web.Mvc.Async.<>c__DisplayClass7_0.<BeginInvokeActionMethodWithFilters>b__1(IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResult
1.CallEndDelegate(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34 System.Web.Mvc.Async.<>c__DisplayClass3_6.<BeginInvokeAction>b__4() +35 System.Web.Mvc.Async.<>c__DisplayClass3_1.<BeginInvokeAction>b__1(IAsyncResult asyncResult) +100 System.Web.Mvc.Async.WrappedAsyncResult
1.CallEndDelegate(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 System.Web.Mvc.<>c.<BeginExecuteCore>b__152_1(IAsyncResult asyncResult, ExecuteCoreState innerState) +11 System.Web.Mvc.Async.WrappedAsyncVoid
1.CallEndDelegate(IAsyncResult asyncResult) +29
System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +45 System.Web.Mvc.<>c.<BeginExecute>b__151_2(IAsyncResult asyncResult, Controller controller) +13 System.Web.Mvc.Async.WrappedAsyncVoid
1.CallEndDelegate(IAsyncResult asyncResult) +22
System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 System.Web.Mvc.<>c.<BeginProcessRequest>b__20_1(IAsyncResult asyncResult, ProcessRequestState innerState) +28 System.Web.Mvc.Async.WrappedAsyncVoid
1.CallEndDelegate(IAsyncResult asyncResult) +29
System.Web.Mvc.Async.WrappedAsyncResultBase1.End() +49 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +577 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +132 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +163
建议OAuthServer增加白名单和黑名单相关逻辑功能。
建议查询栏自动根据字段生成查询项,并且在后台可配置使用那些字段作为页面的查询条件
因ID字段是int64类型,通过json格式传到前端后会出现精度损失,希望能增加参数,以字符串类型序列化 int64 数据
在拉取最新的1111版本后,编译项目时报错,分别缺少Build.cs 和Build_netcore.cs文件。
————
错误 CS2001 未能找到源文件“E:\Git Repository\Newlife\NewLife.Cube\NewLife.Cube\Entity\Build.cs”。 NewLife.Cube E:\Git Repository\Newlife\NewLife.Cube\NewLife.Cube\CSC 1 活动
错误 CS2001 未能找到源文件“E:\Git Repository\Newlife\NewLife.Cube\NewLife.Cube\Entity\Build_netcore.cs”。 NewLife.Cube E:\Git Repository\Newlife\NewLife.Cube\NewLife.Cube\CSC 1 活动
a bug from method
public UserOnline SetStatus(String sessionid, String page, String status, UserAgentParser userAgent, Int32 userid = 0, String name = null, String ip = null)
in this file UserService.cs
code like:
LastError = new DateTime(1, 1, 2),
问题描述: 项目环境为最新版Xcode,NewLife.Cube,NewLife.Core,运行CubeDemo,修改NewLife.Cube的login.cshtml,单独运行NewLife.Cube页面修改生效,通过项目引用NewLife.Cube的CubeDemo不生效,断点可进,但仍会加载旧的cshtml。
魔方记住密码功能失效,导致重新打开后会再次提醒登录。
示例令牌 eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJTdG9uZSIsImV4cCI6MTcxMTgwMzU4MCwiaWF0IjoxNjgwMjY3NTgwfQ.SFLvvHFK-VWlJzHupott60Cgg1YGNplwDFvbeVGGWHY
魔方在记住密码登录时,后端会把令牌写入cookie,有效期1年。
经查,再次提醒登录时,cookie的确是1年有效期。
有可能时候cookie的有效期不足(默认7200秒)。
需要深入分析
魔方的 .Net Core版本已经迁移过来,但是仍然保留大量以前的用法,这跟Core推崇的依赖注入用法格格不入。现在使用的对象容器源于XCode,2011年开始使用,已经很老了。萌新同学提出了此问题,确实是个需要正视的问题。现在面临的问题就是:继续使用对象容器,还是全面改成Core那样的写法。
讨论范围不仅限于魔方Cube,同时涉及到XCode。在这里讨论此问题,大家有好的想法或者解决方案可以在此提出,大家共同讨论。
在xcode源码里
XCode\Tree\EntityTree.cs
将FindAllParents方法的第一行加个try catch就不报错了
try
{
if (entity == null || IsNull((TKey)entity[Setting.Parent]) || entity.Parent == null) return new List();
}
catch (Exception)
{
return new List();
}
SQLite 类型 下载表结构时报错:索引超出了数组界限。
之前在群里就有很多人再问这个问题,我当时用的老版本,以为是小问题就没有在意。结果我在更新到新的版本的时候也出现了这个问题,而且还找不到解决的办法。。。
下面是报错信息
未能加载文件或程序集“XCode, Version=9.11.7044.42317, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件
源文件: D:\NewLife.Cube\NewLife.Cube\PreApplicationStartCode.cs 行: 34
`
`
程序集加载跟踪: 下列信息有助于确定程序集“XCode, Version=9.11.7044.42317, Culture=neutral, PublicKeyToken=null”未能加载的原因。
https://github.com/NewLifeX/NewLife.Cube/blob/master/NewLife.Cube/Areas/Admin/Views/Index/Main.cshtml#L86 第86行换为判断.Net Framework 大于4.7.1即可更换为 @System.Runtime.InteropServices.RuntimeInformation.OSDescription 方法获取当前操作系统版本,并同时兼容.NET Framework与.NET Core 双平台 示例如下:
if (att.FrameworkName.IndexOf("Core") > 0) { //System.Runtime.InteropServices.RuntimeInformation.OSDescription; } else if (att.FrameworkName.IndexOf("v4.7.1") > 0) { //System.Runtime.InteropServices.RuntimeInformation.OSDescription; } else if (att.FrameworkName.IndexOf("v4.7.2") > 0) { //System.Runtime.InteropServices.RuntimeInformation.OSDescription; } else if (att.FrameworkName.IndexOf("v4.8") > 0) { //System.Runtime.InteropServices.RuntimeInformation.OSDescription; } else { // 此时已经非.NET Core和Fx了,总不会有人去用Xamarin.Android/IOS/MAC去搭建Web平台 //Environment.OSVersion; }
后话
System.Runtime.InteropServices.RuntimeInformation.OSDescription 方法适用于
.NET Core
3.0 2.2 2.1 2.0 1.1 1.0
.NET Framework
4.8 4.7.2 4.7.1
.NET Standard
2.1 2.0 1.6 1.4 1.3 1.2 1.1
Xamarin.Android
7.1
Xamarin.iOS
10.8
Xamarin.Mac
3.0
Severity Code Description Project File Line Suppression State
Error CS0246 The type or namespace name 'FieldCollection' could not be found (are you missing a using directive or an assembly reference?) DotNet.NewLife.Cube C:\Users\Will\source\repos\DotNet.NewLife.Cube\Areas\Cube\Views\PrincipalAgent_Form_Body.cshtml 8 Active
要增加一个:@using NewLife.Cube;
NC版魔方设置中工作台页面默认值在设置为Admin/Index/Main时,在linux下运行有可能会导致页面左上角系统名称的链接为/Admin/Admin/Index/Main,经测试建议设置为/Admin/Index/Main
如题。石头兄,ECharts类的Build方法未处理Items扩展属性,添加进去的自定义属性不能使用。
在教务系统demo那个里面,点击添加学生报错了。错误信息如下:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 System.Object.GetType()
在 NewLife.Cube.HtmlExtensions.ForEnum(HtmlHelper Html, String name, Object value, String label) 位置 D:\X\NewLife.Cube\NewLife.Cube\Common\HtmlExtensions.cs:行号 431
在 NewLife.Cube.HtmlExtensions.ForEditor(HtmlHelper Html, String name, Object value, Type type, String format, Object htmlAttributes) 位置 D:\X\NewLife.Cube\NewLife.Cube\Common\HtmlExtensions.cs:行号 53
在 NewLife.Cube.HtmlExtensions.ForEditor(HtmlHelper Html, FieldItem field, IEntity entity) 位置 D:\X\NewLife.Cube\NewLife.Cube\Common\HtmlExtensions.cs:行号 107
在 ASP._Views_Shared__Form_Item_cshtml.Execute() 位置 D:\X\NewLife.Cube\NewLife.Cube\Views\Shared\_Form_Item.cshtml:行号 33
在 System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
在 System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
在 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
在 System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName, Object model, ViewDataDictionary viewData)
在 ASP._Views_Shared__Form_Group_cshtml.Execute() 位置 D:\X\NewLife.Cube\NewLife.Cube\Views\Shared\_Form_Group.cshtml:行号 14
在 System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
在 System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
在 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
在 System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName, Object model, ViewDataDictionary viewData)
在 ASP._Views_Shared__Form_Body_cshtml.Execute() 位置 D:\X\NewLife.Cube\NewLife.Cube\Views\Shared\_Form_Body.cshtml:行号 12
在 System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
在 System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
在 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
在 System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName, Object model, ViewDataDictionary viewData)
在 ASP._Views_Shared_Form_cshtml.Execute() 位置 D:\X\NewLife.Cube\NewLife.Cube\Views\Shared\Form.cshtml:行号 21
在 System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
在 System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
在 System.Web.WebPages.StartPage.ExecutePageHierarchy()
在 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
在 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass3_1.<BeginInvokeAction>b__5(IAsyncResult asyncResult)
由于在群里没人回答,只好来这里了
admin现在刚刚引入cube的时候是被锁的,所以我用qq登陆
然后是普通游客权限,所有页面都打不开。。‘
暴力解决方法是下SQLite Expert 一个修改sqllite文件的东西,把相应的登陆着改为管理员。话说你们是故意挖的坑吗
能否给一个demo,比如微信登录该如何配置呢?
多谢
魔方 高级功能 生成表单 列表 搜索时报错
依据报错内容 新建文件夹后,实际生成路径不对
WebHelper2.cs第61行request.Headers获取不到值导致OAuth第三方登录失败
权限枚举是否考虑放开,目前扩展权限类别要修改源码
建议增加Bootstrap Table扩展,里面有很多实用的固定表头、多行选中变色等功能
第49行 var forms = new HashSet(req.Form.AllKeys, StringComparer.OrdinalIgnoreCase);
第53行 foreach (var item in query.AllKeys)
这两个AllKeys在nfx里都是正常的,但是在netcore里报错,因为req.Form和query都不是NameValueCollection类型
设计:区域以行政区划代码如37,3713,3723,371312,371322,根据区域划分数据权限,在用户表用扩展字段Ext4录入区域代码,通过该字段来取业务表中的相应区域的数据。
问题:1.没有地方能够添加 数据权限的值,自带的userId是在ControllerBaseX中添加的, HttpContext.Items["userId"] = user.ID; 自己定义的区域代码变量不知道在哪加。
2.数据权限能否设置成 StartWith,这样上级可以看下级,同级只能看自己, like '37%'能看3713、3723、371312、371322;而like '3713%'只能看3713、371312、371322这样
1.魔方中有没有办法进行横切编程,例如我要给所有的控制器的动作方法加上统一的数据权限,或者讲解一下在魔方中实现多租户的思路。
2.请补充讲解一下集成第3方登录以及SSO在魔方中的应用,例如部署自己的SSO服务器。
3.控制器在魔方中想自动注册为不可见,应该如何配置?
NewLife.CubeNC登录之后,无法拿到登录用户。以下user一直返回null
下拉框考虑不同的登陆用户显示不同的内容怎么操作。
例如 http://localhost:23023/Admin
主要想实现 如图址址栏中不出现 /admin 字符 ,最后效果地址为:http://localhost:23023
魔方视图 覆盖失败 webconfig已经添加程序集 视图也导出了 覆盖无效
在根目录/views覆盖生效
在Areas/area/views覆盖无效
RazorGenerator 已经安装并生成Generator.cs文件
在字典参数模块,添加一个条数据后,再对该数据进行修改,就会报错误。
数据内容为:类别( AdminType)、名称(部门用户)、数值(3)、种类(整数),基他默认。
报错内容:
[NullReferenceException: 未将对象引用设置到对象的实例。]
XCode.EntityTree2.FindAllParents(IEntityTree entity, Boolean includeSelf) +64 XCode.EntityTree
2.<get_AllParents>b__21_0(String e) +38
XCode.EntityExtend.Get(String key, Func2 func) +429 XCode.EntityTree
2.get_AllParents() +115
XCode.EntityTree`2.get_Deepth() +45
[TargetInvocationException: 对象“XCode.Membership.Parameter”上的属性访问器“Deepth”发生以下异常:'未将对象引用设置到对象的实例。']
System.ComponentModel.ReflectPropertyDescriptor.GetValue(Object component) +378
System.Web.Mvc.<>c__DisplayClass7_0.b__0() +18
System.Web.Mvc.ModelMetadata.get_Model() +17
System.Web.Mvc.DataAnnotationsModelValidator.Validate(Object container) +127
System.Web.Mvc.d__2.MoveNext() +216
System.Web.Mvc.DefaultModelBinder.OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) +121
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +68
System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +1210
System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +333
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +335
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +105
System.Web.Mvc.Async.<>c__DisplayClass3_1.b__0(AsyncCallback asyncCallback, Object asyncState) +640
System.Web.Mvc.Async.WrappedAsyncResult1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +14 System.Web.Mvc.Async.WrappedAsyncResultBase
1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +346
System.Web.Mvc.<>c.b__152_0(AsyncCallback asyncCallback, Object asyncState, ExecuteCoreState innerState) +27
System.Web.Mvc.Async.WrappedAsyncVoid1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +30 System.Web.Mvc.Async.WrappedAsyncResultBase
1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +494
System.Web.Mvc.<>c.b__151_1(AsyncCallback asyncCallback, Object callbackState, Controller controller) +16
System.Web.Mvc.Async.WrappedAsyncVoid1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +20 System.Web.Mvc.Async.WrappedAsyncResultBase
1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +403
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +16
System.Web.Mvc.<>c.b__20_0(AsyncCallback asyncCallback, Object asyncState, ProcessRequestState innerState) +54
System.Web.Mvc.Async.WrappedAsyncVoid1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +30 System.Web.Mvc.Async.WrappedAsyncResultBase
1.Begin(AsyncCallback callback, Object state, Int32 timeout) +128
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +427
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +48
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +103
System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +48
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +159
能不能出个简单的文档或者配置实例?
System.Data.SQLite.SQLiteException (0x80004005): constraint failed
UNIQUE constraint failed: User.Name
在 System.Data.SQLite.SQLite3.Reset(SQLiteStatement stmt)
在 System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
在 System.Data.SQLite.SQLiteDataReader.NextResult()
在 System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
在 System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
在 System.Data.SQLite.SQLiteCommand.ExecuteScalar(CommandBehavior behavior)
在 XCode.DataAccessLayer.DbSession.ExecuteScalar[T](DbCommand cmd) 位置 E:\X\Src\XCode\DataAccessLayer\Common\DbSession.cs:行号 472
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.