Code Monkey home page Code Monkey logo

nutzwk's Introduction


NutzWk(新名BudWk) 开源企业级Java Web开发框架

Gitee GVP GitHub release License PowerByNutz

在力所能及的情况下,最大限度的提高Web开发人员的生产力

本项目新版V6-V8,迁移至:

https://gitee.com/budwk/budwk

https://github.com/budwk/budwk

前言

本框架自2012年开始用于商业项目,至今已服务于全国各地公司大大小小数千个项目,行业涉及政务、电商、物联网等,随着个人经验积累及从事行业的不同分别发布了1.x至7.x多个版本,您可以根据项目规模选择不同版本。本项目案例众多,省厅级项目、市级平台、大数据项目、电商平台、物联网平台等等。

我们有强大的后援 —— Nutz 社区支持 https://nutz.cn 及 Nutz 使用手册 https://nutzam.com/core/nutz_preface.html

QQ交流群

  • 1群: 24457628
  • 2群: 68428921

本版说明

  • BudWk-V5 Mini 微服务单应用版本(一个jar或打成war运行),管理后台 jQuery + Vue.js + ElementUI,非常适合个人项目快速开发

  • 如果是团队开发或大型项目,推荐使用 BudWk-V8 https://github.com/budwk/budwk

  • 系统自带多级权限体系、日志系统、缓存系统、定时任务、微信管理、CMS管理、beetl模板语言等基础功能

  • 安装必要条件: redis + mysql(支持 MariaDB、Oracle、SqlServer、达梦等)

项目启动

  • 创建数据库 budwk_v5_mini 项目启动时会自动建表初始化数据

  • mvn compile nutzboot:run mvn运行 或 IDEA 中右击 MainLauncher 运行

  • mvn package nutzboot:shade -Dmaven.javadoc.skip=true -Dmaven.test.skip=true 生成可执行jar包

  • mvn clean package nutzboot:shade nutzboot:war -Dmaven.javadoc.skip=true -Dmaven.test.skip=true 生成可执行war包

  • 正常启动后访问 http://127.0.0.1:8080/sysadmin 用户名 superadmin 密码 1

项目部署

  • 内置配置文件启动 nohup java -jar mini.jar & 带参数 -Dnutz.profiles.active=prod(IDEA 运行时填 --nutz.profiles.active=prod) 可加载 application-prod.yaml 文件
  • 外置配置文件启动 nohup java -Dnutz.boot.configure.yaml.dir=/data/budwk/ -jar mini.jar & 此时加载文件夹所有 *.yaml 配置文件

运行环境

  • JDK 11 + 或 OpenJDK 11 +
  • Redis 4.0.8 +
  • MariaDB 10+、MySql 5.7+、Oracle、SqlServer、达梦等

开发工具

  • IntelliJ IDEA
  • Maven 3.5.3 +
  • Git

技术选型

后端技术

技术 名称 官网
Nutz JavaEE应用框架 https://nutzam.com
NutzBoot 微服务框架 https://github.com/nutzam/nutzboot
SaToken 权限框架 http://sa-token.dev33.cn
Druid 数据库连接池 https://github.com/alibaba/druid
Redis 分布式缓存数据库 https://redis.io
Quartz 作业调度框架 https://www.quartz-scheduler.org

前端技术

技术 名称 官网
Vue.js MVVM框架 https://vuejs.org
jQuery.js jQuery https://jquery.com
ElementUI 基于Vue的UI框架 https://element.eleme.io
Font-awesome 字体图标 https://fontawesome.com

历史版本

  • v8.x - nacos 微服务网关+组件化+API化版本 前后端分离,前端 vite + vue3 + Element-Plus + TypeScript
  • v8.x - mini 微服务单应用版本(一个 jar 或 war 包) 前后端分离,前端 vite + vue3 + Element-Plus + TypeScript
  • v7.x - nacos 微服务网关+组件化+API化版本 前后端分离,前端 nuxt + vue + elementUI
  • v6.x - nacos 微服务分布式版本 前后端分离,前端 nuxt + vue + elementUI
  • v6.x - zookeeper 微服务分布式版本 前后端分离,前端 nuxt + vue + elementUI
  • v6.x - mini 微服务单应用版本(一个 jar 或 war 包) 前后端分离,前端 nuxt + vue + elementUI
  • v5.x - zookeeper 微服务分布式版本 前端 jQuery + bootsrtap 或 jQuery + vue.js + elementUI
  • v5.x - mini 微服务单应用版本(一个 jar 或 war 包) 前端 jQuery + vue.js + elementUI
  • v4.x - 单应用版本(war 包) 前端 jQuery + bootsrtap
  • v3.x - 单应用版本(war 包) 前端 jQuery + bootsrtap
  • v1.x - 单应用版本(war 包) 前端 jQuery + easyUI

鸣谢

关于

  • 个人提供付费的培训服务,含源码解析、设计思路、疑难解答、项目辅导等
  • 联系方式 QQ:11624317 微信:wizzer
  • 欢迎打赏,以资鼓励 https://budwk.com/donation

nutzwk's People

Contributors

carolwelcome avatar dependabot[bot] avatar eggsblue avatar enilu avatar icnws avatar makeclan avatar monkeywithacupcake avatar rekoe avatar sunhai1988 avatar wendal avatar wizzercn avatar zzcv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nutzwk's Issues

fullcalendar控件无head

在框架中尝试了一下自带的fullcalendar,发现日历的标题、头部按钮都不显示。
目前尚不清楚什么原因。
麻烦有空的时候帮忙看看。
谢谢。

日志管理BUG

角色分配菜单权限多个,查看日志信息不会换行

jquery.datatables 分页的使用方法

Html:

<div class="table-responsive no-border">
      <input id="unitid" type="hidden">
      <table class="table table-bordered table-striped mg-t datatable">
        <thead>
        <tr>
          <th>用户名</th>
          <th>姓名</th>
          <th>状态</th>
          <th>是否在线</th>
          <th>操作</th>
      </table>
    </div>

datatables初始化:

var datatable;
  function initDatatable() {
    datatable = $('.datatable').DataTable({
      "processing": false,
      "serverSide": true,
      "select": true,
      "ordering": true,
      "language": {
        "url": "/plugins/datatables/cn.json"
      },
      "preDrawCallback": function () {
        sublime.closeLoadingbar($(".main-content"));
        sublime.showLoadingbar($(".main-content"));
      },
      "drawCallback": function () {
        sublime.closeLoadingbar($(".main-content"));
      },
      "ajax": {
        "url": "/private/sys/user/data",
        "type": "post",
        "data": function (d) {
          d.unitid = $('#unitid').val();
          d.loginname=$('#loginname').val();
          d.nickname=$('#nickname').val();
        }
      },
      "order":[[0,"desc"]],
      "columns": [
        {"data": "loginname", "bSortable": true},
        {"data": "nickname", "bSortable": true},
        {"data": "disabled", "bSortable": true},
        {"data": "online", "bSortable": true}
      ],
      "columnDefs": [
        {
          "render": function (data, type, row) {
            return '<div class="btn-group"><button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">' +
              ' <i class="ti-settings"></i> <span class="ti-angle-down"></span></button><ul class="dropdown-menu" role="menu">' +
              '<li><a href="/private/sys/user/info/'+row.id+'" data-toggle="modal" data-target="#dialogUserDetail">基本信息</a></li>' +
              '<li><a href="/private/sys/user/role/'+row.id+'" data-toggle="modal" data-target="#dialogUserRightDetail">查看权限</a></li>' +
              '<li class="divider"></li>' +
              '<li><a href="/private/sys/user/edit/'+row.id+'">修改信息</a></li>' +
              '<li><a href="javascript:;" onclick="resetPwd()">密码重置</a></li>' +
              '<li><a href="javascript:;" onclick="del('+row.id+')">删除</a></li>' +
              '<li class="divider"></li>' +
              '<li><a href="javascript:;" onclick="enableUser('+row.id+')">启用</a></li>' +
              '<li><a href="javascript:;" onclick="disableUser('+row.id+')">禁用</a></li>' +
              '</ul></div>';
          },
          "targets": 4
        },
        {
          "render": function (data, type, row) {
            if (data) {
              return '<i class="fa fa-circle text-success ml5"></i>';
            } else {
              return '<i class="fa fa-circle text-danger ml5"></i>';
            }
          },
          "targets": 3
        },
        {
          "render": function (data, type, row) {
            if (!data) {
              return '<i class="fa fa-circle text-success ml5"></i>';
            } else {
              return '<i class="fa fa-circle text-danger ml5"></i>';
            }
          },
          "targets": 2
        }
      ]
    });
    datatable.on('click', 'tr', function () {
      $(this).toggleClass('selected');
    });
    $("#searchBtn").on('click',function(){
      datatable.ajax.reload(null, false);
    });
  }

重新加载数据:

datatable.ajax.reload(null, false);

排序:通过后台参数 order数组得到dir:asc/desc,通过order的column下标,获取columns数组中的data字段名,两者结合写排序条件
后台把所有参数打印出来,你就知道代码应该怎么写了……over

响应的数据格式:

{
              "draw": draw,
              "recordsTotal": pageSize,
              "recordsFiltered": count,
              "data": list
            }

Nodejs 后端完整代码:

data: function (req, res) {
    var pageSize = parseInt(req.body.length);
    var start = parseInt(req.body.start);
    var page = start / pageSize + 1;
    var draw = parseInt(req.body.draw);
    var unitid = req.body.unitid || 1;
    var loginname = req.body.loginname || '';
    var nickname = req.body.nickname || '';
    var order = req.body.order || [];
    var columns = req.body.columns || [];
    var sort = {};
    var where = {unitid: unitid};
    if (loginname) {
      where.loginname = {'like':'%'+loginname+'%'};
    }
    if (nickname) {
      where.nickname = {'like':'%'+nickname+'%'};
    }
    if (order.length > 0) {
      sort[columns[order[0].column].data] = order[0].dir;
    }
    Sys_user.count(where).exec(function (err, count) {
      if (!err && count > 0) {
        Sys_user.find(where)
          .sort(sort)
          .paginate({page: page, limit: pageSize})
          .exec(function (err, list) {
            return res.json({
              "draw": draw,
              "recordsTotal": pageSize,
              "recordsFiltered": count,
              "data": list
            });
          });
      } else {
        return res.json({
          "draw": draw,
          "recordsTotal": pageSize,
          "recordsFiltered": 0,
          "data": []
        });
      }
    });
  },

bug

javax.servlet.ServletException: java.lang.NullPointerException
org.apache.shiro.web.servlet.AdviceFilter.cleanup(AdviceFilter.java:196)
org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:148)
org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)

不能取消常用菜单

点击常用菜单,点击需要勾选常用菜单,保存后,刷新页面,发现取消的菜单仍然存在

开发任务:集成Activiti

activiti分支,基于nutzwk 3.3.3 集成最新版的activiti 及流程设计器。

nutzwk1.0 集成过activiti,不过两者版本都比较低。

注解式日志系统

通过注解方便的记录各类日志信息:登陆日志、系统日志、操作日志等类型,按月分表。
字段有:时间、日志级别(info/error/..)、模块名称、类名、日志描述、操作人、IP地址等。
@wendal

坐等4.0 版本

坐等4.0 版本 可以举个例子 结合APP 接口开发的案例么

Tomcat下收到中文消息乱码,日志打印也是乱码

2016-08-30 10:21:12,373 org.nutz.dao.impl.sql.run.NutDaoExecutor.printSQL(NutDaoExecutor.java:339) DEBUG - UPDATE wx_reply_txt SET title=?,content=? WHERE id=?
| 1 | 2 | 3 |
|----|-------------------|----------------------------------|
| ?? | ????????????????? | 124b70b6af424f0eb60da288e05a44cc |
For example:> "UPDATE wx_reply_txt SET title='??',content='?????????????????' WHERE id='124b70b6af424f0eb60da288e05a44cc'"

无法登录

错误现象:登录时提示系统错误,f5刷新即进入登陆后首页。
原因分析:分析代码,判断userservice的update出现异常。
尝试解决:user表的logingcount字段如果为null,则出现问题;手工置0,则正常登录。
解决方案:初始化时增加user.setLoginCount(0);。

禁用用户的权限要求错误

@At("/disable/?")
@Ok("json")
@RequiresPermissions("sys.manager.menu.edit")
@SLog(tag = "禁用用户", msg = "用户名:${args[1].getAttribute('loginname')}")

应该是sys.manager.user.edit吧。

编写开发文档

1、二次开发文档
nutzwk代码结构、权限体系讲解、增删改查示例说明等

2、beetl模板标签文档
含系统shiro标签、工具类标签、beetl常用用法等

注解式插件系统

定义插件注解,实现插件热部署功能,只要实现了插件注解方法就可以在不重启tomcat情况下安装插件功能,有点像插件市场?可以持久化,重启tomcat已安装的插件不丢失,原理和自动扫描包名差不多。 @wendal

一些小建议

1、pom中建议集成进tomcat,jetty,方便通过命令行启动运行项目 2、可以在maven中加入关于创建本地DB库的jar包,然后增加个脚本文件,自动部署数据库至本地环境

最后大吼一句,尼玛。第一眼看到演示地址,就大爱。

nutzwk是否可以做成多模块的

nutzwk 中有cms管理功能,但是没有前台站点,如果想独立部署一个站点,用nutzwk做后台管理。
那么,前台用户访问web站点就做到一个系统里面了,更新维护都不方便。如果分开通过http调数据的话,如果后台挂掉,也影响用户访问。

如果能做到把cms wzflow,shop 独立出来,在打包的时候集成进去。如果是3个独立项目的话 ,代码复用性又不高,如,我要弄cms的时候,是不是要拷贝一份到前台提系统。不知道我的理解对不对。

计划完成的工作

1、换掉velocity模板引擎,这个项目很久没更新了,ejs有木有java版本啊;
2、pjax全面支持,要重写很多页面、部分样式和部分代码;
3、分页换成datatables,这个前台JS有现成代码,后台代码要做修改;

PS:招募代码贡献着,可分享nodejs同类项目部分代码供参考,用于优化本框架~~

启动报错

七月 13, 2016 10:56:34 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin
警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:nutzwk' did not find a matching property.
七月 13, 2016 10:56:34 上午 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-nio-8080"]
七月 13, 2016 10:56:34 上午 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
信息: Using a shared selector for servlet write/read
七月 13, 2016 10:56:34 上午 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["ajp-nio-8009"]
七月 13, 2016 10:56:34 上午 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
信息: Using a shared selector for servlet write/read
七月 13, 2016 10:56:34 上午 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 1398 ms
七月 13, 2016 10:56:34 上午 org.apache.catalina.core.StandardService startInternal
信息: Starting service Catalina
七月 13, 2016 10:56:34 上午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/8.0.5
七月 13, 2016 10:56:35 上午 org.apache.catalina.util.SessionIdGenerator createSecureRandom
信息: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [153] milliseconds.
七月 13, 2016 10:56:39 上午 org.apache.catalina.core.StandardContext filterStart
严重: Exception starting filter ShiroFilter
java.lang.ClassCastException: org.apache.shiro.web.servlet.ShiroFilter cannot be cast to javax.servlet.Filter
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:105)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4575)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5185)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1388)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

七月 13, 2016 10:56:39 上午 org.apache.catalina.core.StandardContext filterStart
严重: Exception starting filter nutz
java.lang.ClassCastException: org.nutz.mvc.NutFilter cannot be cast to javax.servlet.Filter
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:105)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4575)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5185)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1388)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

七月 13, 2016 10:56:39 上午 org.apache.catalina.core.StandardContext startInternal
严重: Error filterStart
七月 13, 2016 10:56:39 上午 org.apache.catalina.core.StandardContext startInternal
严重: Context [/nutzwk] startup failed due to previous errors
七月 13, 2016 10:56:39 上午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-nio-8080"]
七月 13, 2016 10:56:39 上午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-nio-8009"]
七月 13, 2016 10:56:39 上午 org.apache.catalina.startup.Catalina start
信息: Server startup in 4780 ms

用在生产系统如何?

1.有实际运用在生产系统中吗?
2.拆分开来单独使用,对项目其他框架的入侵性如何?例如,我只用到Dao,然后MVC这块依然采用Spring,能很好的集成吗?

vue 版本 - nutzwk 4.0 开发任务

1、vue分支,从1.0升级为2.0;

2、封装模态框、datatables、表单验证等vue常用组件;

3、完成系统管理、CMS、微信等模块的vue实现;

CacheException: net.sf.ehcache.CacheException: java.lang.ClassNotFoundException

启动报错

javax.servlet.ServletException: Filtered request failed.
org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:384)
org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
root cause

org.apache.shiro.cache.CacheException: net.sf.ehcache.CacheException: java.lang.ClassNotFoundException: cn.wizzer.modules.gm.sys.models.Sys_user

2.0 idea tomcat 运行无法访问

rt.我貌似之前问过这个问题.囧~ 好像后面你修改了下配置,然后就可以tomcat默认启动,127.0.0.1:8080/访问项目了..忘记了

无法登录访问问题

部署到tomcat启动后,访问部署的应用时显示以下信息:

页面找不到

对不起,您访问的页面不存在。

单独war部署还是ROOT下都是这个样子。

常用菜单下的菜单都报错问题

登录后,常用菜单下的菜单都报错,这里不能上传图,可以根据URL地址猜出原因.
登录后URL:http://127.0.0.1:8080/nutzwk/private/home
点击常用菜单下的功能跳转地址为:http://127.0.0.1:8080/private/sys/user

跳转出nutzwk应用了,跳转的代码应该少了应用名了吧。

把src\main\webapp\WEB-INF\views\layouts\private.html中的254行代码加上应用名就可以支持非跟目录部署了
且其他非“常用菜单”都加过了,“常用菜单”为何不加呢。

<a <%if(!isEmpty(o.href)){%>href="${base!}${o.href}" <%if('data-pjax'==o.target){%>data-pjax<%........................

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.